From e455cd73dfbaba866be6de28b60051177aa3e650 Mon Sep 17 00:00:00 2001 From: zelmalki Date: Mon, 23 Feb 2026 02:32:55 -0800 Subject: [PATCH 1/3] * publish, add tests, fix bugs --- .github/workflows/ci.yml | 10 +- .github/workflows/publish.yml | 53 +++++ docs/examples.md | 6 +- generator/opcodes.csv | 2 +- package-lock.json | 51 ++++- package.json | 26 ++- playground/playground.bundle.js | 14 +- playground/playground.bundle.js.map | 2 +- playground/playground.ts | 6 +- src/OpCodes.ts | 2 +- src/verification/OperandStackVerifier.ts | 51 +++-- tests/VerifierFix.test.ts | 268 +++++++++++++++++++++++ tsconfig.tsbuildinfo | 1 + 13 files changed, 444 insertions(+), 48 deletions(-) create mode 100644 .github/workflows/publish.yml create mode 100644 tests/VerifierFix.test.ts create mode 100644 tsconfig.tsbuildinfo diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9a23fc5..287ae5a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,5 +24,11 @@ jobs: cache: npm - run: npm ci - - run: npm run build - - run: npm test + - run: npm run build:release + + - name: Upload build artifacts + if: always() && matrix.node-version == 22 + uses: actions/upload-artifact@v4 + with: + name: build-reports + path: build/ diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..3d7a67e --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,53 @@ +name: Publish to npm + +on: + workflow_dispatch: + +permissions: + contents: write + id-token: write + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Use Node.js 22 + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + registry-url: https://registry.npmjs.org + + - run: npm ci + + - name: Compute version + id: version + run: | + BASE=$(node -p "const p = require('./package.json'); p.version.split('.').slice(0,2).join('.')") + VERSION="${BASE}.${{ github.run_number }}" + echo "version=${VERSION}" >> "$GITHUB_OUTPUT" + echo "tag=v${VERSION}" >> "$GITHUB_OUTPUT" + echo "Publishing version: ${VERSION}" + + - name: Set version + run: npm version ${{ steps.version.outputs.version }} --no-git-tag-version + + - run: npm run build:release + + - name: Publish + run: npm publish --provenance --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Create tag and release + env: + GH_TOKEN: ${{ github.token }} + run: | + git tag ${{ steps.version.outputs.tag }} + git push origin ${{ steps.version.outputs.tag }} + gh release create ${{ steps.version.outputs.tag }} \ + --title "${{ steps.version.outputs.tag }}" \ + --generate-notes diff --git a/docs/examples.md b/docs/examples.md index c27d3f4..0764ff5 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -374,8 +374,7 @@ Add two arrays of four floats using 128-bit SIMD instructions: ```typescript import { ModuleBuilder, ValueType } from 'webasmjs'; -// SIMD requires disabling the operand stack verifier (v128 not yet supported) -const mod = new ModuleBuilder('simdAdd', { disableVerification: true }); +const mod = new ModuleBuilder('simdAdd'); mod.defineMemory(1); // vec4_add: adds four f32 values starting at [srcA] and [srcB], stores result at [dst] @@ -437,8 +436,7 @@ Compute a dot product of two 4-element float vectors using SIMD multiply and lan ```typescript import { ModuleBuilder, ValueType } from 'webasmjs'; -// SIMD requires disabling the operand stack verifier (v128 not yet supported) -const mod = new ModuleBuilder('simdDot', { disableVerification: true }); +const mod = new ModuleBuilder('simdDot'); mod.defineMemory(1); // dot4: dot product of two f32x4 vectors in memory diff --git a/generator/opcodes.csv b/generator/opcodes.csv index 62c230c..b857969 100644 --- a/generator/opcodes.csv +++ b/generator/opcodes.csv @@ -13,7 +13,7 @@ value,name,mnemonic,friendlyName,immediate,controlflow,pop,push,prefix,feature 16,call,call,call,Function,,"[""Arguments""]","[""Returns""]",, 17,call_indirect,call_indirect,call_indirect,IndirectFunction,,"[""Arguments"",""Int32""]","[""Returns""]",, 26,drop,drop,drop,,,"[""Any""]",,, -27,select,select,select,,,"[""Int32"",""Any"",""Any""]","[""Any""]",, +27,select,select,select,,,"[""Any"",""Any"",""Int32""]","[""Any""]",, 32,get_local,local.get,get_local,Local,,,"[""Any""]",, 33,set_local,local.set,set_local,Local,,"[""Any""]",,, 34,tee_local,local.tee,tee_local,Local,,"[""Any""]","[""Any""]",, diff --git a/package-lock.json b/package-lock.json index 508aece..97033b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,19 @@ { "name": "webasmjs", - "version": "0.1.0", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "webasmjs", - "version": "0.1.0", + "version": "0.2.0", "license": "MIT", "devDependencies": { "@types/jest": "^29.5.12", "esbuild": "^0.27.3", "husky": "^9.1.7", "jest": "^29.7.0", + "jest-junit": "^16.0.0", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", "typescript": "^5.4.0" @@ -2982,6 +2983,22 @@ "fsevents": "^2.3.2" } }, + "node_modules/jest-junit": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-16.0.0.tgz", + "integrity": "sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mkdirp": "^1.0.4", + "strip-ansi": "^6.0.1", + "uuid": "^8.3.2", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", @@ -3535,6 +3552,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4351,6 +4381,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -4445,6 +4485,13 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true, + "license": "MIT" + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index a33aca6..332075b 100644 --- a/package.json +++ b/package.json @@ -1,19 +1,30 @@ { "name": "webasmjs", - "version": "0.1.0", + "version": "0.2.0", "description": "TypeScript WebAssembly bytecode emitter and module builder", "main": "lib/index.js", "types": "lib/index.d.ts", + "files": [ + "lib" + ], "scripts": { - "build": "tsc && ts-node playground/build.ts", + "build": "tsc --build", + "clean": "tsc --build --clean", + "clean:build": "rm -rf build", "test": "jest", - "test:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand", - "test:cover": "jest --coverage", - "generate": "ts-node generator/index.ts", - "build:playground": "ts-node playground/build.ts", - "playground": "ts-node playground/build.ts && open playground/index.html", + "test:ci": "jest --ci --coverage --reporters=default --reporters=jest-junit", + "test:coverage": "jest --coverage", + "build:release": "npm run clean:build && npm run build && npm run test:ci", + "examples": "npx tsx examples/showcase/run-examples.ts", + "examples:cdk": "npx tsx examples/aws-cdk-comparison/run-examples.ts", + "examples:all": "npm run examples && npm run examples:cdk", + "playground": "npm run dev --prefix playground", "prepare": "husky" }, + "jest-junit": { + "outputDirectory": "build/test-results", + "outputName": "junit.xml" + }, "bugs": { "url": "https://github.com/DevNamedZed/webasmjs/issues", "email": "devnamedzed@gmail.com" @@ -41,6 +52,7 @@ "esbuild": "^0.27.3", "husky": "^9.1.7", "jest": "^29.7.0", + "jest-junit": "^16.0.0", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", "typescript": "^5.4.0" diff --git a/playground/playground.bundle.js b/playground/playground.bundle.js index 0abc2f8..c882157 100644 --- a/playground/playground.bundle.js +++ b/playground/playground.bundle.js @@ -10133,19 +10133,19 @@ log('Final: ' + getCounter());` label: "SIMD Vector Add", group: "SIMD", code: `// SIMD: add two f32x4 vectors in memory -const mod = new webasmjs.ModuleBuilder('simdAdd'); +const mod = new webasmjs.ModuleBuilder('simdAdd', { disableVerification: true }); mod.defineMemory(1); // vec4_add(srcA, srcB, dst) \u2014 adds two 4-float vectors mod.defineFunction('vec4_add', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); // push dest address first a.get_local(f.getParameter(0)); a.load_v128(2, 0); a.get_local(f.getParameter(1)); a.load_v128(2, 0); a.add_f32x4(); - a.get_local(f.getParameter(2)); - a.store_v128(2, 0); + a.store_v128(2, 0); // store expects [addr, value] on stack }).withExport(); mod.defineFunction('setF32', null, @@ -10184,7 +10184,7 @@ for (let i = 0; i < 4; i++) { label: "SIMD Dot Product", group: "SIMD", code: `// SIMD dot product: multiply element-wise then sum lanes -const mod = new webasmjs.ModuleBuilder('simdDot'); +const mod = new webasmjs.ModuleBuilder('simdDot', { disableVerification: true }); mod.defineMemory(1); mod.defineFunction('dot4', [webasmjs.ValueType.Float32], @@ -10239,19 +10239,19 @@ log('Expected: ' + (1*5 + 2*6 + 3*7 + 4*8));` label: "SIMD Splat & Scale", group: "SIMD", code: `// SIMD splat: broadcast a scalar to all lanes, then multiply -const mod = new webasmjs.ModuleBuilder('simdScale'); +const mod = new webasmjs.ModuleBuilder('simdScale', { disableVerification: true }); mod.defineMemory(1); // scale_vec4(src, dst, scalar) \u2014 multiply a vector by a scalar mod.defineFunction('scale_vec4', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(1)); // push dest address first a.get_local(f.getParameter(0)); a.load_v128(2, 0); a.get_local(f.getParameter(2)); a.splat_f32x4(); // broadcast scalar to all 4 lanes a.mul_f32x4(); - a.get_local(f.getParameter(1)); - a.store_v128(2, 0); + a.store_v128(2, 0); // store expects [addr, value] on stack }).withExport(); mod.defineFunction('setF32', null, diff --git a/playground/playground.bundle.js.map b/playground/playground.bundle.js.map index 920677c..1246e51 100644 --- a/playground/playground.bundle.js.map +++ b/playground/playground.bundle.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/types.ts", "../src/Arg.ts", "../src/BinaryWriter.ts", "../src/BinaryModuleWriter.ts", "../src/BinaryReader.ts", "../src/CustomSectionBuilder.ts", "../src/FunctionParameterBuilder.ts", "../src/LocalBuilder.ts", "../src/GlobalType.ts", "../src/GlobalBuilder.ts", "../src/ImportBuilder.ts", "../src/ImmediateEncoder.ts", "../src/Immediate.ts", "../src/Instruction.ts", "../src/LabelBuilder.ts", "../src/OpCodes.ts", "../src/OpCodeEmitter.ts", "../src/verification/ControlFlowBlock.ts", "../src/verification/VerificationError.ts", "../src/verification/ControlFlowVerifier.ts", "../src/verification/OperandStack.ts", "../src/FuncTypeSignature.ts", "../src/FuncTypeBuilder.ts", "../src/verification/OperandStackVerifier.ts", "../src/AssemblyEmitter.ts", "../src/InitExpressionEmitter.ts", "../src/DataSegmentBuilder.ts", "../src/FunctionEmitter.ts", "../src/FunctionBuilder.ts", "../src/ElementSegmentBuilder.ts", "../src/ExportBuilder.ts", "../src/ResizableLimits.ts", "../src/MemoryType.ts", "../src/MemoryBuilder.ts", "../src/TableType.ts", "../src/TableBuilder.ts", "../src/TextModuleWriter.ts", "../src/ModuleBuilder.ts", "../src/WatParser.ts", "playground.ts"], - "sourcesContent": ["/**\r\n * Language-level type descriptors used in the WASM binary encoding.\r\n * Each type has a name, binary value, and short identifier.\r\n */\r\nexport interface LanguageTypeDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n readonly short: string;\r\n}\r\n\r\nexport const LanguageType = {\r\n Int32: { name: 'i32', value: 0x7f, short: 'i' } as const,\r\n Int64: { name: 'i64', value: 0x7e, short: 'l' } as const,\r\n Float32: { name: 'f32', value: 0x7d, short: 's' } as const,\r\n Float64: { name: 'f64', value: 0x7c, short: 'd' } as const,\r\n AnyFunc: { name: 'anyfunc', value: 0x70, short: 'a' } as const,\r\n Func: { name: 'func', value: 0x60, short: 'f' } as const,\r\n Void: { name: 'void', value: 0x40, short: 'v' } as const,\r\n} as const;\r\n\r\nexport type LanguageTypeKey = keyof typeof LanguageType;\r\n\r\n/**\r\n * WASM value types (i32, i64, f32, f64, v128).\r\n */\r\nexport const ValueType = {\r\n Int32: LanguageType.Int32,\r\n Int64: LanguageType.Int64,\r\n Float32: LanguageType.Float32,\r\n Float64: LanguageType.Float64,\r\n V128: { name: 'v128', value: 0x7b, short: 'v' } as const,\r\n} as const;\r\n\r\nexport type ValueTypeDescriptor = typeof ValueType[keyof typeof ValueType];\r\nexport type ValueTypeKey = keyof typeof ValueType;\r\n\r\n/**\r\n * Block return types (value types + void).\r\n */\r\nexport const BlockType = {\r\n Int32: LanguageType.Int32,\r\n Int64: LanguageType.Int64,\r\n Float32: LanguageType.Float32,\r\n Float64: LanguageType.Float64,\r\n V128: ValueType.V128,\r\n Void: LanguageType.Void,\r\n} as const;\r\n\r\nexport type BlockTypeDescriptor = typeof BlockType[keyof typeof BlockType];\r\n\r\n/**\r\n * Element types for tables.\r\n */\r\nexport const ElementType = {\r\n AnyFunc: LanguageType.AnyFunc,\r\n} as const;\r\n\r\nexport type ElementTypeDescriptor = typeof ElementType[keyof typeof ElementType];\r\n\r\n/**\r\n * Import/export external kinds.\r\n */\r\nexport interface ExternalKindDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n}\r\n\r\nexport const ExternalKind = {\r\n Function: { name: 'Function', value: 0 } as const,\r\n Table: { name: 'Table', value: 1 } as const,\r\n Memory: { name: 'Memory', value: 2 } as const,\r\n Global: { name: 'Global', value: 3 } as const,\r\n} as const;\r\n\r\nexport type ExternalKindType = typeof ExternalKind[keyof typeof ExternalKind];\r\n\r\n/**\r\n * WASM binary section types.\r\n */\r\nexport interface SectionTypeDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n}\r\n\r\nexport const SectionType = {\r\n Type: { name: 'Type', value: 1 } as const,\r\n Import: { name: 'Import', value: 2 } as const,\r\n Function: { name: 'Function', value: 3 } as const,\r\n Table: { name: 'Table', value: 4 } as const,\r\n Memory: { name: 'Memory', value: 5 } as const,\r\n Global: { name: 'Global', value: 6 } as const,\r\n Export: { name: 'Export', value: 7 } as const,\r\n Start: { name: 'Start', value: 8 } as const,\r\n Element: { name: 'Element', value: 9 } as const,\r\n Code: { name: 'Code', value: 10 } as const,\r\n Data: { name: 'Data', value: 11 } as const,\r\n createCustom(name: string): SectionTypeDescriptor {\r\n return { name, value: 0 };\r\n },\r\n} as const;\r\n\r\n/**\r\n * Type form descriptors.\r\n */\r\nexport const TypeForm = {\r\n Func: { name: 'func', value: 0x60 } as const,\r\n Block: { name: 'block', value: 0x40 } as const,\r\n} as const;\r\n\r\n/**\r\n * Immediate operand types for instructions.\r\n */\r\nexport enum ImmediateType {\r\n BlockSignature = 'BlockSignature',\r\n RelativeDepth = 'RelativeDepth',\r\n BranchTable = 'BranchTable',\r\n Function = 'Function',\r\n IndirectFunction = 'IndirectFunction',\r\n Local = 'Local',\r\n Global = 'Global',\r\n Float32 = 'Float32',\r\n Float64 = 'Float64',\r\n VarInt32 = 'VarInt32',\r\n VarInt64 = 'VarInt64',\r\n VarUInt1 = 'VarUInt1',\r\n VarUInt32 = 'VarUInt32',\r\n MemoryImmediate = 'MemoryImmediate',\r\n V128Const = 'V128Const',\r\n LaneIndex = 'LaneIndex',\r\n ShuffleMask = 'ShuffleMask',\r\n}\r\n\r\n/**\r\n * Context types for initialization expressions.\r\n */\r\nexport enum InitExpressionType {\r\n Global = 'Global',\r\n Element = 'Element',\r\n Data = 'Data',\r\n}\r\n\r\n/**\r\n * WASM post-MVP feature extensions.\r\n */\r\nexport type WasmFeature =\r\n | 'sign-extend'\r\n | 'sat-trunc'\r\n | 'bulk-memory'\r\n | 'reference-types'\r\n | 'simd'\r\n | 'multi-value';\r\n\r\n/**\r\n * WASM version targets. Each target enables a set of features.\r\n */\r\nexport type WasmTarget = 'mvp' | '2.0' | 'latest';\r\n\r\n/**\r\n * Options for module building.\r\n */\r\nexport interface ModuleBuilderOptions {\r\n generateNameSection?: boolean;\r\n disableVerification?: boolean;\r\n target?: WasmTarget;\r\n features?: WasmFeature[];\r\n}\r\n\r\n/**\r\n * Opcode definition structure.\r\n */\r\nexport interface OpCodeDef {\r\n readonly value: number;\r\n readonly mnemonic: string;\r\n readonly immediate?: string;\r\n readonly controlFlow?: string;\r\n readonly stackBehavior: string;\r\n readonly popOperands?: readonly string[];\r\n readonly pushOperands?: readonly string[];\r\n readonly prefix?: number;\r\n readonly feature?: WasmFeature;\r\n}\r\n\r\n/**\r\n * Interface for objects that can write themselves to a BinaryWriter.\r\n */\r\nexport interface Writable {\r\n write(writer: import('./BinaryWriter').default): void;\r\n}\r\n", "const formatOrList = (values: string[]): string => {\r\n if (values.length === 1) {\r\n return values[0];\r\n }\r\n\r\n let text = '';\r\n for (let index = 0; index < values.length; index++) {\r\n text += values[index];\r\n if (index === values.length - 2) {\r\n text += ' or ';\r\n } else if (index !== values.length - 1) {\r\n text += ', ';\r\n }\r\n }\r\n\r\n return text;\r\n};\r\n\r\nexport default class Arg {\r\n static notNull(name: string, value: unknown): void {\r\n if (value === null || value === undefined) {\r\n throw new Error(`The parameter ${name} must be specified.`);\r\n }\r\n }\r\n\r\n static notEmpty(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (value === '' || (Array.isArray(value) && value.length === 0)) {\r\n throw new Error(`The parameter ${name} cannot be empty.`);\r\n }\r\n }\r\n\r\n static notEmptyString(name: string, value: unknown): void {\r\n Arg.string(name, value);\r\n if (value === '') {\r\n throw new Error(`The parameter ${name} cannot be empty.`);\r\n }\r\n }\r\n\r\n static string(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (typeof value !== 'string') {\r\n throw new Error(`The parameter ${name} must be a string.`);\r\n }\r\n }\r\n\r\n static number(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (typeof value !== 'number' || isNaN(value)) {\r\n throw new Error(`The parameter ${name} must be a number.`);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static instanceOf(name: string, value: unknown, ...types: (new (...args: any[]) => any)[]): void {\r\n if (!types.some((x) => value instanceof x)) {\r\n throw new Error(\r\n `The parameter ${name} must be a ${formatOrList(types.map((x) => x.name))}.`\r\n );\r\n }\r\n }\r\n}\r\n", "const GrowthRate = 1024;\r\n\r\nexport default class BinaryWriter {\r\n buffer: Uint8Array;\r\n size: number;\r\n\r\n constructor(size: number = 1024) {\r\n this.size = 0;\r\n this.buffer = new Uint8Array(size);\r\n }\r\n\r\n get capacity(): number {\r\n return this.buffer.length;\r\n }\r\n\r\n get length(): number {\r\n return this.size;\r\n }\r\n\r\n get remaining(): number {\r\n return this.buffer.length - this.size;\r\n }\r\n\r\n writeUInt8(value: number): void {\r\n this.writeByte(0xff & value);\r\n }\r\n\r\n writeUInt16(value: number): void {\r\n this.writeByte(value & 0xff);\r\n this.writeByte((value >> 8) & 0xff);\r\n }\r\n\r\n writeUInt32(value: number): void {\r\n this.writeByte(value & 0xff);\r\n this.writeByte((value >> 8) & 0xff);\r\n this.writeByte((value >> 16) & 0xff);\r\n this.writeByte((value >> 24) & 0xff);\r\n }\r\n\r\n writeVarUInt1(value: number): void {\r\n this.writeByte(value > 0 ? 1 : 0);\r\n }\r\n\r\n writeVarUInt7(value: number): void {\r\n this.writeByte(0x7f & value);\r\n }\r\n\r\n writeVarUInt32(value: number): void {\r\n do {\r\n let chunk = value & 0x7f;\r\n value >>>= 7;\r\n if (value !== 0) {\r\n chunk |= 0x80;\r\n }\r\n this.writeByte(chunk);\r\n } while (value !== 0);\r\n }\r\n\r\n writeVarInt7(value: number): void {\r\n this.writeByte(value & 0x7f);\r\n }\r\n\r\n writeVarInt32(value: number): void {\r\n let more = true;\r\n while (more) {\r\n let chunk = value & 0x7f;\r\n value >>= 7;\r\n\r\n if ((value === 0 && (chunk & 0x40) === 0) || (value === -1 && (chunk & 0x40) !== 0)) {\r\n more = false;\r\n } else {\r\n chunk |= 0x80;\r\n }\r\n\r\n this.writeByte(chunk);\r\n }\r\n }\r\n\r\n writeVarInt64(value: number | bigint): void {\r\n if (typeof value === 'number' && Number.isInteger(value)) {\r\n this.writeVarInt32(value);\r\n return;\r\n }\r\n\r\n let bigIntValue = BigInt(value);\r\n let more = true;\r\n\r\n while (more) {\r\n let chunk = Number(bigIntValue & 0x7fn);\r\n bigIntValue = bigIntValue >> 7n;\r\n\r\n if (\r\n (bigIntValue === 0n && (chunk & 0x40) === 0) || (bigIntValue === -1n && (chunk & 0x40) !== 0)\r\n ) {\r\n more = false;\r\n } else {\r\n chunk |= 0x80;\r\n }\r\n\r\n this.writeByte(chunk);\r\n }\r\n }\r\n\r\n writeString(value: string): void {\r\n const encoder = new TextEncoder();\r\n const utfBytes = encoder.encode(value);\r\n this.writeBytes(utfBytes);\r\n }\r\n\r\n writeFloat32(value: number): void {\r\n const array = new Float32Array(1);\r\n array[0] = value;\r\n this.writeBytes(new Uint8Array(array.buffer));\r\n }\r\n\r\n writeFloat64(value: number): void {\r\n const array = new Float64Array(1);\r\n array[0] = value;\r\n this.writeBytes(new Uint8Array(array.buffer));\r\n }\r\n\r\n writeByte(data: number): void {\r\n this.requireCapacity(1);\r\n this.buffer[this.size++] = data;\r\n }\r\n\r\n writeBytes(array: BinaryWriter | Uint8Array): void {\r\n let innerArray: Uint8Array;\r\n if (array instanceof BinaryWriter) {\r\n innerArray = array.toArray();\r\n } else if (array instanceof Uint8Array) {\r\n innerArray = array;\r\n } else {\r\n throw new Error('Invalid argument, must be a Uint8Array or BinaryWriter');\r\n }\r\n\r\n this.requireCapacity(innerArray.length);\r\n this.buffer.set(innerArray, this.size);\r\n this.size += innerArray.length;\r\n }\r\n\r\n requireCapacity(size: number): void {\r\n const remaining = this.remaining;\r\n if (remaining >= size) {\r\n return;\r\n }\r\n\r\n const needed = this.size + size;\r\n const grown = this.buffer.length + GrowthRate;\r\n const newSize = Math.max(needed, grown);\r\n\r\n const newBuffer = new Uint8Array(newSize);\r\n newBuffer.set(this.buffer, 0);\r\n this.buffer = newBuffer;\r\n }\r\n\r\n toArray(): Uint8Array {\r\n const array = new Uint8Array(this.size);\r\n array.set(this.buffer.subarray(0, this.size), 0);\r\n return array;\r\n }\r\n}\r\n", "import { SectionType, SectionTypeDescriptor } from './types';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport ModuleBuilder from './ModuleBuilder';\r\nimport CustomSectionBuilder from './CustomSectionBuilder';\r\n\r\nconst MagicHeader = 0x6d736100;\r\nconst Version = 1;\r\n\r\nexport default class BinaryModuleWriter {\r\n moduleBuilder: ModuleBuilder;\r\n\r\n constructor(moduleBuilder: ModuleBuilder) {\r\n this.moduleBuilder = moduleBuilder;\r\n }\r\n\r\n static writeSectionHeader(\r\n writer: BinaryWriter,\r\n section: SectionTypeDescriptor,\r\n length: number\r\n ): void {\r\n writer.writeVarUInt7(section.value);\r\n writer.writeVarUInt32(length);\r\n }\r\n\r\n static writeSection(\r\n writer: BinaryWriter,\r\n sectionType: SectionTypeDescriptor,\r\n sectionItems: { write(writer: BinaryWriter): void }[]\r\n ): void {\r\n if (sectionItems.length === 0) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(sectionItems.length);\r\n sectionItems.forEach((x) => {\r\n x.write(sectionWriter);\r\n });\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, sectionType, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n static writeCustomSection(writer: BinaryWriter, section: CustomSectionBuilder): void {\r\n section.write(writer);\r\n }\r\n\r\n writeTypeSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Type, this.moduleBuilder._types);\r\n }\r\n\r\n writeImportSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Import, this.moduleBuilder._imports);\r\n }\r\n\r\n writeFunctionSection(writer: BinaryWriter): void {\r\n if (this.moduleBuilder._functions.length === 0) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._functions.length);\r\n for (let index = 0; index < this.moduleBuilder._functions.length; index++) {\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._functions[index].funcTypeBuilder.index);\r\n }\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, SectionType.Function, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeTableSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Table, this.moduleBuilder._tables);\r\n }\r\n\r\n writeMemorySection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Memory, this.moduleBuilder._memories);\r\n }\r\n\r\n writeGlobalSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Global, this.moduleBuilder._globals);\r\n }\r\n\r\n writeExportSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Export, this.moduleBuilder._exports);\r\n }\r\n\r\n writeStartSection(writer: BinaryWriter): void {\r\n if (!this.moduleBuilder._startFunction) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._startFunction._index);\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, SectionType.Start, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeElementSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Element, this.moduleBuilder._elements);\r\n }\r\n\r\n writeCodeSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Code, this.moduleBuilder._functions);\r\n }\r\n\r\n writeDataSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Data, this.moduleBuilder._data);\r\n }\r\n\r\n writeNameSection(writer: BinaryWriter): void {\r\n const mod = this.moduleBuilder;\r\n const nameWriter = new BinaryWriter();\r\n\r\n // Sub-section 0: module name\r\n const moduleNameWriter = new BinaryWriter();\r\n moduleNameWriter.writeVarUInt32(mod._name.length);\r\n moduleNameWriter.writeString(mod._name);\r\n nameWriter.writeVarUInt7(0);\r\n nameWriter.writeVarUInt32(moduleNameWriter.length);\r\n nameWriter.writeBytes(moduleNameWriter);\r\n\r\n // Sub-section 1: function names\r\n const allFunctions = [\r\n ...mod._imports.filter((x) => x.externalKind.value === 0),\r\n ...mod._functions,\r\n ];\r\n if (allFunctions.length > 0) {\r\n const funcNameWriter = new BinaryWriter();\r\n funcNameWriter.writeVarUInt32(allFunctions.length);\r\n allFunctions.forEach((f, i) => {\r\n const name = 'name' in f ? f.name : `${f.moduleName}.${f.fieldName}`;\r\n funcNameWriter.writeVarUInt32(i);\r\n funcNameWriter.writeVarUInt32(name.length);\r\n funcNameWriter.writeString(name);\r\n });\r\n nameWriter.writeVarUInt7(1);\r\n nameWriter.writeVarUInt32(funcNameWriter.length);\r\n nameWriter.writeBytes(funcNameWriter);\r\n }\r\n\r\n // Sub-section 2: local names (parameters + locals per function)\r\n const functionsWithNames = mod._functions.filter((f) => {\r\n if (!f.functionEmitter) return false;\r\n const hasNamedParam = f.parameters.some((p) => p.name !== null);\r\n const hasNamedLocal = f.functionEmitter._locals.some((l) => l.name !== null);\r\n return hasNamedParam || hasNamedLocal;\r\n });\r\n if (functionsWithNames.length > 0) {\r\n const localNameWriter = new BinaryWriter();\r\n localNameWriter.writeVarUInt32(functionsWithNames.length);\r\n functionsWithNames.forEach((f) => {\r\n localNameWriter.writeVarUInt32(f._index);\r\n const namedEntries: { index: number; name: string }[] = [];\r\n f.parameters.forEach((p, i) => {\r\n if (p.name !== null) {\r\n namedEntries.push({ index: i, name: p.name });\r\n }\r\n });\r\n if (f.functionEmitter) {\r\n f.functionEmitter._locals.forEach((l) => {\r\n if (l.name !== null) {\r\n namedEntries.push({ index: l.index, name: l.name });\r\n }\r\n });\r\n }\r\n localNameWriter.writeVarUInt32(namedEntries.length);\r\n namedEntries.forEach((entry) => {\r\n localNameWriter.writeVarUInt32(entry.index);\r\n localNameWriter.writeVarUInt32(entry.name.length);\r\n localNameWriter.writeString(entry.name);\r\n });\r\n });\r\n nameWriter.writeVarUInt7(2);\r\n nameWriter.writeVarUInt32(localNameWriter.length);\r\n nameWriter.writeBytes(localNameWriter);\r\n }\r\n\r\n // Sub-section 7: global names\r\n const namedGlobals: { index: number; name: string }[] = [];\r\n mod._imports.forEach((imp) => {\r\n if (imp.externalKind.value === 3) {\r\n namedGlobals.push({ index: imp.index, name: `${imp.moduleName}.${imp.fieldName}` });\r\n }\r\n });\r\n mod._globals.forEach((g) => {\r\n if (g.name !== null) {\r\n namedGlobals.push({ index: g._index, name: g.name });\r\n }\r\n });\r\n if (namedGlobals.length > 0) {\r\n const globalNameWriter = new BinaryWriter();\r\n globalNameWriter.writeVarUInt32(namedGlobals.length);\r\n namedGlobals.forEach((entry) => {\r\n globalNameWriter.writeVarUInt32(entry.index);\r\n globalNameWriter.writeVarUInt32(entry.name.length);\r\n globalNameWriter.writeString(entry.name);\r\n });\r\n nameWriter.writeVarUInt7(7);\r\n nameWriter.writeVarUInt32(globalNameWriter.length);\r\n nameWriter.writeBytes(globalNameWriter);\r\n }\r\n\r\n // Write as custom section with name \"name\"\r\n const sectionWriter = new BinaryWriter();\r\n const sectionName = 'name';\r\n sectionWriter.writeVarUInt32(sectionName.length);\r\n sectionWriter.writeString(sectionName);\r\n sectionWriter.writeBytes(nameWriter);\r\n\r\n writer.writeVarUInt7(0); // custom section id\r\n writer.writeVarUInt32(sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeCustomSections(writer: BinaryWriter): void {\r\n // Write user-defined custom sections (excluding \"name\" which is reserved)\r\n this.moduleBuilder._customSections.forEach((x) => {\r\n BinaryModuleWriter.writeCustomSection(writer, x);\r\n });\r\n\r\n // Auto-generate name section if enabled and not user-provided\r\n if (this.moduleBuilder._options.generateNameSection) {\r\n this.writeNameSection(writer);\r\n }\r\n }\r\n\r\n write(): Uint8Array {\r\n const writer = new BinaryWriter();\r\n writer.writeUInt32(MagicHeader);\r\n writer.writeUInt32(Version);\r\n\r\n this.writeTypeSection(writer);\r\n this.writeImportSection(writer);\r\n this.writeFunctionSection(writer);\r\n this.writeTableSection(writer);\r\n this.writeMemorySection(writer);\r\n this.writeGlobalSection(writer);\r\n this.writeExportSection(writer);\r\n this.writeStartSection(writer);\r\n this.writeElementSection(writer);\r\n this.writeCodeSection(writer);\r\n this.writeDataSection(writer);\r\n this.writeCustomSections(writer);\r\n\r\n return writer.toArray();\r\n }\r\n}\r\n", "import {\r\n SectionType,\r\n SectionTypeDescriptor,\r\n ExternalKind,\r\n ValueType,\r\n ElementType,\r\n ValueTypeDescriptor,\r\n ImmediateType,\r\n LanguageType,\r\n} from './types';\r\n\r\nexport interface ModuleInfo {\r\n version: number;\r\n types: FuncTypeInfo[];\r\n imports: ImportInfo[];\r\n functions: FunctionInfo[];\r\n tables: TableInfo[];\r\n memories: MemoryInfo[];\r\n globals: GlobalInfo[];\r\n exports: ExportInfo[];\r\n start: number | null;\r\n elements: ElementInfo[];\r\n data: DataInfo[];\r\n customSections: CustomSectionInfo[];\r\n nameSection?: NameSectionInfo;\r\n}\r\n\r\nexport interface FuncTypeInfo {\r\n parameterTypes: ValueTypeDescriptor[];\r\n returnTypes: ValueTypeDescriptor[];\r\n}\r\n\r\nexport interface ImportInfo {\r\n moduleName: string;\r\n fieldName: string;\r\n kind: number;\r\n typeIndex?: number;\r\n tableType?: { elementType: number; initial: number; maximum: number | null };\r\n memoryType?: { initial: number; maximum: number | null };\r\n globalType?: { valueType: number; mutable: boolean };\r\n}\r\n\r\nexport interface FunctionInfo {\r\n typeIndex: number;\r\n locals: { count: number; type: number }[];\r\n body: Uint8Array;\r\n}\r\n\r\nexport interface TableInfo {\r\n elementType: number;\r\n initial: number;\r\n maximum: number | null;\r\n}\r\n\r\nexport interface MemoryInfo {\r\n initial: number;\r\n maximum: number | null;\r\n}\r\n\r\nexport interface GlobalInfo {\r\n valueType: number;\r\n mutable: boolean;\r\n initExpr: Uint8Array;\r\n}\r\n\r\nexport interface ExportInfo {\r\n name: string;\r\n kind: number;\r\n index: number;\r\n}\r\n\r\nexport interface ElementInfo {\r\n tableIndex: number;\r\n offsetExpr: Uint8Array;\r\n functionIndices: number[];\r\n}\r\n\r\nexport interface DataInfo {\r\n memoryIndex: number;\r\n offsetExpr: Uint8Array;\r\n data: Uint8Array;\r\n}\r\n\r\nexport interface CustomSectionInfo {\r\n name: string;\r\n data: Uint8Array;\r\n}\r\n\r\nexport interface NameSectionInfo {\r\n moduleName?: string;\r\n functionNames?: Map;\r\n localNames?: Map>;\r\n globalNames?: Map;\r\n}\r\n\r\nconst MagicHeader = 0x6d736100;\r\n\r\nexport default class BinaryReader {\r\n buffer: Uint8Array;\r\n offset: number;\r\n\r\n constructor(buffer: Uint8Array) {\r\n this.buffer = buffer;\r\n this.offset = 0;\r\n }\r\n\r\n read(): ModuleInfo {\r\n const magic = this.readUInt32();\r\n if (magic !== MagicHeader) {\r\n throw new Error(`Invalid WASM magic header: 0x${magic.toString(16)}`);\r\n }\r\n\r\n const version = this.readUInt32();\r\n if (version !== 1) {\r\n throw new Error(`Unsupported WASM version: ${version}`);\r\n }\r\n\r\n const module: ModuleInfo = {\r\n version,\r\n types: [],\r\n imports: [],\r\n functions: [],\r\n tables: [],\r\n memories: [],\r\n globals: [],\r\n exports: [],\r\n start: null,\r\n elements: [],\r\n data: [],\r\n customSections: [],\r\n };\r\n\r\n // Track function type indices separately (function section only stores type indices)\r\n const functionTypeIndices: number[] = [];\r\n\r\n while (this.offset < this.buffer.length) {\r\n const sectionId = this.readVarUInt7();\r\n const sectionSize = this.readVarUInt32();\r\n const sectionEnd = this.offset + sectionSize;\r\n\r\n switch (sectionId) {\r\n case 0: // Custom\r\n this.readCustomSection(module, sectionEnd);\r\n break;\r\n case 1: // Type\r\n this.readTypeSection(module);\r\n break;\r\n case 2: // Import\r\n this.readImportSection(module);\r\n break;\r\n case 3: // Function\r\n this.readFunctionSection(functionTypeIndices);\r\n break;\r\n case 4: // Table\r\n this.readTableSection(module);\r\n break;\r\n case 5: // Memory\r\n this.readMemorySection(module);\r\n break;\r\n case 6: // Global\r\n this.readGlobalSection(module);\r\n break;\r\n case 7: // Export\r\n this.readExportSection(module);\r\n break;\r\n case 8: // Start\r\n module.start = this.readVarUInt32();\r\n break;\r\n case 9: // Element\r\n this.readElementSection(module);\r\n break;\r\n case 10: // Code\r\n this.readCodeSection(module, functionTypeIndices);\r\n break;\r\n case 11: // Data\r\n this.readDataSection(module);\r\n break;\r\n default:\r\n // Skip unknown section\r\n this.offset = sectionEnd;\r\n break;\r\n }\r\n\r\n this.offset = sectionEnd;\r\n }\r\n\r\n return module;\r\n }\r\n\r\n private readCustomSection(module: ModuleInfo, sectionEnd: number): void {\r\n const nameLen = this.readVarUInt32();\r\n const name = this.readString(nameLen);\r\n\r\n if (name === 'name') {\r\n module.nameSection = this.readNameSection(sectionEnd);\r\n return;\r\n }\r\n\r\n const remaining = sectionEnd - this.offset;\r\n const data = this.readBytes(remaining);\r\n module.customSections.push({ name, data });\r\n }\r\n\r\n private readNameSection(sectionEnd: number): NameSectionInfo {\r\n const info: NameSectionInfo = {};\r\n\r\n while (this.offset < sectionEnd) {\r\n const subsectionId = this.readVarUInt7();\r\n const subsectionSize = this.readVarUInt32();\r\n const subsectionEnd = this.offset + subsectionSize;\r\n\r\n switch (subsectionId) {\r\n case 0: { // module name\r\n const len = this.readVarUInt32();\r\n info.moduleName = this.readString(len);\r\n break;\r\n }\r\n case 1: { // function names\r\n const count = this.readVarUInt32();\r\n info.functionNames = new Map();\r\n for (let i = 0; i < count; i++) {\r\n const index = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n info.functionNames.set(index, this.readString(len));\r\n }\r\n break;\r\n }\r\n case 2: { // local names\r\n const funcCount = this.readVarUInt32();\r\n info.localNames = new Map();\r\n for (let i = 0; i < funcCount; i++) {\r\n const funcIndex = this.readVarUInt32();\r\n const localCount = this.readVarUInt32();\r\n const locals = new Map();\r\n for (let j = 0; j < localCount; j++) {\r\n const localIndex = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n locals.set(localIndex, this.readString(len));\r\n }\r\n info.localNames.set(funcIndex, locals);\r\n }\r\n break;\r\n }\r\n case 7: { // global names\r\n const count = this.readVarUInt32();\r\n info.globalNames = new Map();\r\n for (let i = 0; i < count; i++) {\r\n const index = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n info.globalNames.set(index, this.readString(len));\r\n }\r\n break;\r\n }\r\n default:\r\n // Skip unknown subsections\r\n this.offset = subsectionEnd;\r\n break;\r\n }\r\n\r\n this.offset = subsectionEnd;\r\n }\r\n\r\n return info;\r\n }\r\n\r\n private readTypeSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const form = this.readVarInt7(); // 0x60 = func\r\n const paramCount = this.readVarUInt32();\r\n const parameterTypes: ValueTypeDescriptor[] = [];\r\n for (let j = 0; j < paramCount; j++) {\r\n parameterTypes.push(this.readValueType());\r\n }\r\n const returnCount = this.readVarUInt32();\r\n const returnTypes: ValueTypeDescriptor[] = [];\r\n for (let j = 0; j < returnCount; j++) {\r\n returnTypes.push(this.readValueType());\r\n }\r\n module.types.push({ parameterTypes, returnTypes });\r\n }\r\n }\r\n\r\n private readImportSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const moduleNameLen = this.readVarUInt32();\r\n const moduleName = this.readString(moduleNameLen);\r\n const fieldNameLen = this.readVarUInt32();\r\n const fieldName = this.readString(fieldNameLen);\r\n const kind = this.readUInt8();\r\n\r\n const imp: ImportInfo = { moduleName, fieldName, kind };\r\n\r\n switch (kind) {\r\n case 0: // Function\r\n imp.typeIndex = this.readVarUInt32();\r\n break;\r\n case 1: { // Table\r\n const elementType = this.readVarInt7();\r\n const { initial, maximum } = this.readResizableLimits();\r\n imp.tableType = { elementType, initial, maximum };\r\n break;\r\n }\r\n case 2: { // Memory\r\n const { initial, maximum } = this.readResizableLimits();\r\n imp.memoryType = { initial, maximum };\r\n break;\r\n }\r\n case 3: { // Global\r\n const valueType = this.readVarInt7();\r\n const mutable = this.readVarUInt1() === 1;\r\n imp.globalType = { valueType, mutable };\r\n break;\r\n }\r\n }\r\n\r\n module.imports.push(imp);\r\n }\r\n }\r\n\r\n private readFunctionSection(functionTypeIndices: number[]): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n functionTypeIndices.push(this.readVarUInt32());\r\n }\r\n }\r\n\r\n private readTableSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const elementType = this.readVarInt7();\r\n const { initial, maximum } = this.readResizableLimits();\r\n module.tables.push({ elementType, initial, maximum });\r\n }\r\n }\r\n\r\n private readMemorySection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const { initial, maximum } = this.readResizableLimits();\r\n module.memories.push({ initial, maximum });\r\n }\r\n }\r\n\r\n private readGlobalSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const valueType = this.readVarInt7();\r\n const mutable = this.readVarUInt1() === 1;\r\n const initExpr = this.readInitExpr();\r\n module.globals.push({ valueType, mutable, initExpr });\r\n }\r\n }\r\n\r\n private readExportSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const nameLen = this.readVarUInt32();\r\n const name = this.readString(nameLen);\r\n const kind = this.readUInt8();\r\n const index = this.readVarUInt32();\r\n module.exports.push({ name, kind, index });\r\n }\r\n }\r\n\r\n private readElementSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const tableIndex = this.readVarUInt32();\r\n const offsetExpr = this.readInitExpr();\r\n const numElems = this.readVarUInt32();\r\n const functionIndices: number[] = [];\r\n for (let j = 0; j < numElems; j++) {\r\n functionIndices.push(this.readVarUInt32());\r\n }\r\n module.elements.push({ tableIndex, offsetExpr, functionIndices });\r\n }\r\n }\r\n\r\n private readCodeSection(module: ModuleInfo, functionTypeIndices: number[]): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const bodySize = this.readVarUInt32();\r\n const bodyEnd = this.offset + bodySize;\r\n\r\n const localCount = this.readVarUInt32();\r\n const locals: { count: number; type: number }[] = [];\r\n for (let j = 0; j < localCount; j++) {\r\n const lCount = this.readVarUInt32();\r\n const type = this.readVarInt7();\r\n locals.push({ count: lCount, type });\r\n }\r\n\r\n const bodyLength = bodyEnd - this.offset;\r\n const body = this.readBytes(bodyLength);\r\n\r\n module.functions.push({\r\n typeIndex: functionTypeIndices[i],\r\n locals,\r\n body,\r\n });\r\n\r\n this.offset = bodyEnd;\r\n }\r\n }\r\n\r\n private readDataSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const memoryIndex = this.readVarUInt32();\r\n const offsetExpr = this.readInitExpr();\r\n const dataSize = this.readVarUInt32();\r\n const data = this.readBytes(dataSize);\r\n module.data.push({ memoryIndex, offsetExpr, data });\r\n }\r\n }\r\n\r\n private readInitExpr(): Uint8Array {\r\n const start = this.offset;\r\n // Read until we hit 0x0b (end opcode)\r\n while (this.offset < this.buffer.length) {\r\n const byte = this.buffer[this.offset++];\r\n if (byte === 0x0b) {\r\n break;\r\n }\r\n // Skip over immediate operands for known init expression opcodes\r\n switch (byte) {\r\n case 0x41: // i32.const\r\n this.readVarInt32();\r\n break;\r\n case 0x42: // i64.const\r\n this.readVarInt64();\r\n break;\r\n case 0x43: // f32.const\r\n this.offset += 4;\r\n break;\r\n case 0x44: // f64.const\r\n this.offset += 8;\r\n break;\r\n case 0x23: // global.get\r\n this.readVarUInt32();\r\n break;\r\n }\r\n }\r\n return this.buffer.slice(start, this.offset);\r\n }\r\n\r\n private readResizableLimits(): { initial: number; maximum: number | null } {\r\n const flags = this.readVarUInt1();\r\n const initial = this.readVarUInt32();\r\n const maximum = flags === 1 ? this.readVarUInt32() : null;\r\n return { initial, maximum };\r\n }\r\n\r\n private readValueType(): ValueTypeDescriptor {\r\n const value = this.readVarInt7();\r\n // Value types are signed: -1=i32, -2=i64, -3=f32, -4=f64\r\n switch (value) {\r\n case -1: return ValueType.Int32;\r\n case -2: return ValueType.Int64;\r\n case -3: return ValueType.Float32;\r\n case -4: return ValueType.Float64;\r\n default:\r\n throw new Error(`Unknown value type: 0x${(value & 0xff).toString(16)}`);\r\n }\r\n }\r\n\r\n // --- Primitive readers ---\r\n\r\n private readUInt8(): number {\r\n return this.buffer[this.offset++];\r\n }\r\n\r\n private readUInt32(): number {\r\n const value =\r\n this.buffer[this.offset] |\r\n (this.buffer[this.offset + 1] << 8) |\r\n (this.buffer[this.offset + 2] << 16) |\r\n (this.buffer[this.offset + 3] << 24);\r\n this.offset += 4;\r\n return value >>> 0;\r\n }\r\n\r\n private readVarUInt1(): number {\r\n return this.buffer[this.offset++] & 1;\r\n }\r\n\r\n private readVarUInt7(): number {\r\n return this.buffer[this.offset++] & 0x7f;\r\n }\r\n\r\n private readVarUInt32(): number {\r\n let result = 0;\r\n let shift = 0;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= (byte & 0x7f) << shift;\r\n shift += 7;\r\n } while (byte & 0x80);\r\n return result >>> 0;\r\n }\r\n\r\n private readVarInt7(): number {\r\n const byte = this.buffer[this.offset++];\r\n return byte & 0x40 ? byte | 0xffffff80 : byte & 0x7f;\r\n }\r\n\r\n private readVarInt32(): number {\r\n let result = 0;\r\n let shift = 0;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= (byte & 0x7f) << shift;\r\n shift += 7;\r\n } while (byte & 0x80);\r\n if (shift < 32 && byte & 0x40) {\r\n result |= -(1 << shift);\r\n }\r\n return result;\r\n }\r\n\r\n private readVarInt64(): bigint {\r\n let result = 0n;\r\n let shift = 0n;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= BigInt(byte & 0x7f) << shift;\r\n shift += 7n;\r\n } while (byte & 0x80);\r\n if (shift < 64n && byte & 0x40) {\r\n result |= -(1n << shift);\r\n }\r\n return result;\r\n }\r\n\r\n private readString(length: number): string {\r\n const bytes = this.buffer.slice(this.offset, this.offset + length);\r\n this.offset += length;\r\n return new TextDecoder().decode(bytes);\r\n }\r\n\r\n private readBytes(length: number): Uint8Array {\r\n const bytes = this.buffer.slice(this.offset, this.offset + length);\r\n this.offset += length;\r\n return bytes;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { SectionType, SectionTypeDescriptor } from './types';\r\n\r\nexport default class CustomSectionBuilder {\r\n name: string;\r\n type: SectionTypeDescriptor;\r\n _data: Uint8Array;\r\n\r\n constructor(name: string, data?: Uint8Array) {\r\n this.name = name;\r\n this.type = SectionType.createCustom(name);\r\n this._data = data || new Uint8Array(0);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.name.length);\r\n sectionWriter.writeString(this.name);\r\n if (this._data.length > 0) {\r\n sectionWriter.writeBytes(this._data);\r\n }\r\n\r\n writer.writeVarUInt7(0); // custom section id\r\n writer.writeVarUInt32(sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FunctionParameterBuilder {\r\n name: string | null;\r\n valueType: ValueTypeDescriptor;\r\n index: number;\r\n\r\n constructor(valueType: ValueTypeDescriptor, index: number) {\r\n this.name = null;\r\n this.valueType = valueType;\r\n this.index = index;\r\n }\r\n\r\n withName(name: string): this {\r\n this.name = name;\r\n return this;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class LocalBuilder {\r\n index: number;\r\n valueType: ValueTypeDescriptor;\r\n name: string | null;\r\n count: number;\r\n\r\n constructor(valueType: ValueTypeDescriptor, name: string | null, index: number, count: number) {\r\n this.index = index;\r\n this.valueType = valueType;\r\n this.name = name;\r\n this.count = count;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.count);\r\n writer.writeVarInt7(this.valueType.value);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class GlobalType {\r\n private _valueType: ValueTypeDescriptor;\r\n private _mutable: boolean;\r\n\r\n constructor(valueType: ValueTypeDescriptor, mutable: boolean) {\r\n this._valueType = valueType;\r\n this._mutable = mutable;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n return this._valueType;\r\n }\r\n\r\n get mutable(): boolean {\r\n return this._mutable;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarInt7(this._valueType.value);\r\n writer.writeVarUInt1(this._mutable ? 1 : 0);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import GlobalType from './GlobalType';\r\nimport { InitExpressionType, ValueType, ValueTypeDescriptor } from './types';\r\nimport InitExpressionEmitter from './InitExpressionEmitter';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class GlobalBuilder {\r\n _globalType: GlobalType;\r\n _index: number;\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n _moduleBuilder: ModuleBuilder;\r\n name: string | null = null;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._globalType = new GlobalType(valueType, mutable);\r\n this._index = index;\r\n }\r\n\r\n withName(name: string): this {\r\n this.name = name;\r\n return this;\r\n }\r\n\r\n get globalType(): GlobalType {\r\n return this._globalType;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n return this._globalType.valueType;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Global,\r\n this.valueType\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n value(value: number | bigint | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number' || typeof value === 'bigint') {\r\n this.createInitEmitter((asm) => {\r\n const vt = this.valueType;\r\n if (vt === ValueType.Int32) {\r\n asm.const_i32(Number(value));\r\n } else if (vt === ValueType.Int64) {\r\n asm.const_i64(BigInt(value));\r\n } else if (vt === ValueType.Float32) {\r\n asm.const_f32(Number(value));\r\n } else if (vt === ValueType.Float64) {\r\n asm.const_f64(Number(value));\r\n } else {\r\n throw new Error(`Unsupported global value type: ${vt.name}`);\r\n }\r\n });\r\n } else {\r\n throw new Error('Unsupported global value.');\r\n }\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportGlobal(this, name);\r\n return this;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n this._globalType.write(writer);\r\n this._initExpressionEmitter.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ExternalKind, ExternalKindType } from './types';\r\nimport GlobalType from './GlobalType';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport MemoryType from './MemoryType';\r\nimport TableType from './TableType';\r\n\r\nexport default class ImportBuilder {\r\n moduleName: string;\r\n fieldName: string;\r\n externalKind: ExternalKindType;\r\n data: FuncTypeBuilder | GlobalType | MemoryType | TableType;\r\n index: number;\r\n\r\n constructor(\r\n moduleName: string,\r\n fieldName: string,\r\n externalKind: ExternalKindType,\r\n data: FuncTypeBuilder | GlobalType | MemoryType | TableType,\r\n index: number\r\n ) {\r\n this.moduleName = moduleName;\r\n this.fieldName = fieldName;\r\n this.externalKind = externalKind;\r\n this.data = data;\r\n this.index = index;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.moduleName.length);\r\n writer.writeString(this.moduleName);\r\n writer.writeVarUInt32(this.fieldName.length);\r\n writer.writeString(this.fieldName);\r\n writer.writeUInt8(this.externalKind.value);\r\n switch (this.externalKind) {\r\n case ExternalKind.Function:\r\n writer.writeVarUInt32((this.data as FuncTypeBuilder).index);\r\n break;\r\n\r\n case ExternalKind.Global:\r\n case ExternalKind.Memory:\r\n case ExternalKind.Table:\r\n (this.data as GlobalType | MemoryType | TableType).write(writer);\r\n break;\r\n\r\n default:\r\n throw new Error('Unknown external kind.');\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport { ExternalKind, BlockTypeDescriptor } from './types';\r\n\r\nexport default class ImmediateEncoder {\r\n static encodeBlockSignature(writer: BinaryWriter, blockType: BlockTypeDescriptor): void {\r\n writer.writeVarInt7(blockType.value);\r\n }\r\n\r\n static encodeRelativeDepth(writer: BinaryWriter, label: any, depth: number): void {\r\n const relativeDepth = depth - label.block.depth;\r\n writer.writeVarInt7(relativeDepth);\r\n }\r\n\r\n static encodeBranchTable(\r\n writer: BinaryWriter,\r\n defaultLabel: number,\r\n labels: number[]\r\n ): void {\r\n writer.writeVarUInt32(labels.length);\r\n labels.forEach((x) => {\r\n writer.writeVarUInt32(x);\r\n });\r\n writer.writeVarUInt32(defaultLabel);\r\n }\r\n\r\n static encodeFunction(writer: BinaryWriter, func: FunctionBuilder | ImportBuilder | number): void {\r\n let functionIndex = 0;\r\n if (func instanceof ImportBuilder) {\r\n functionIndex = func.index;\r\n } else if (typeof func === 'object' && func !== null && '_index' in func) {\r\n functionIndex = (func as FunctionBuilder)._index;\r\n } else if (typeof func === 'number') {\r\n functionIndex = func;\r\n } else {\r\n throw new Error(\r\n 'Function argument must either be the index of the function or a FunctionBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(functionIndex);\r\n }\r\n\r\n static encodeIndirectFunction(writer: BinaryWriter, funcType: FuncTypeBuilder): void {\r\n writer.writeVarUInt32(funcType.index);\r\n writer.writeVarUInt1(0);\r\n }\r\n\r\n static encodeLocal(\r\n writer: BinaryWriter,\r\n local: LocalBuilder | FunctionParameterBuilder | number\r\n ): void {\r\n Arg.notNull('local', local);\r\n\r\n let localIndex = 0;\r\n if (local instanceof LocalBuilder) {\r\n localIndex = local.index;\r\n } else if (local instanceof FunctionParameterBuilder) {\r\n localIndex = local.index;\r\n } else if (typeof local === 'number') {\r\n localIndex = local;\r\n } else {\r\n throw new Error(\r\n 'Local argument must either be the index of the local variable or a LocalBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(localIndex);\r\n }\r\n\r\n static encodeGlobal(\r\n writer: BinaryWriter,\r\n global: GlobalBuilder | ImportBuilder | number\r\n ): void {\r\n Arg.notNull('global', global);\r\n\r\n let globalIndex = 0;\r\n if (global instanceof GlobalBuilder) {\r\n globalIndex = global._index;\r\n } else if (global instanceof ImportBuilder) {\r\n if (global.externalKind !== ExternalKind.Global) {\r\n throw new Error('Import external kind must be global.');\r\n }\r\n globalIndex = global.index;\r\n } else if (typeof global === 'number') {\r\n globalIndex = global;\r\n } else {\r\n throw new Error(\r\n 'Global argument must either be the index of the global variable, GlobalBuilder, or an ImportBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(globalIndex);\r\n }\r\n\r\n static encodeFloat32(writer: BinaryWriter, value: number): void {\r\n writer.writeFloat32(value);\r\n }\r\n\r\n static encodeFloat64(writer: BinaryWriter, value: number): void {\r\n writer.writeFloat64(value);\r\n }\r\n\r\n static encodeVarInt32(writer: BinaryWriter, value: number): void {\r\n writer.writeVarInt32(value);\r\n }\r\n\r\n static encodeVarInt64(writer: BinaryWriter, value: number | bigint): void {\r\n writer.writeVarInt64(value);\r\n }\r\n\r\n static encodeVarUInt32(writer: BinaryWriter, value: number): void {\r\n writer.writeVarUInt32(value);\r\n }\r\n\r\n static encodeVarUInt1(writer: BinaryWriter, value: number): void {\r\n writer.writeVarUInt1(value);\r\n }\r\n\r\n static encodeMemoryImmediate(\r\n writer: BinaryWriter,\r\n alignment: number,\r\n offset: number\r\n ): void {\r\n writer.writeVarUInt32(alignment);\r\n writer.writeVarUInt32(offset);\r\n }\r\n\r\n static encodeV128Const(writer: BinaryWriter, bytes: Uint8Array): void {\r\n for (let i = 0; i < 16; i++) {\r\n writer.writeByte(bytes[i]);\r\n }\r\n }\r\n\r\n static encodeLaneIndex(writer: BinaryWriter, index: number): void {\r\n writer.writeByte(index);\r\n }\r\n\r\n static encodeShuffleMask(writer: BinaryWriter, mask: Uint8Array): void {\r\n for (let i = 0; i < 16; i++) {\r\n writer.writeByte(mask[i]);\r\n }\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport { ImmediateType } from './types';\r\nimport ImmediateEncoder from './ImmediateEncoder';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class Immediate {\r\n type: ImmediateType;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n values: any[];\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constructor(type: ImmediateType, values: any[]) {\r\n Arg.notNull('type', type);\r\n Arg.notNull('values', values);\r\n this.type = type;\r\n this.values = values;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createBlockSignature(blockType: any): Immediate {\r\n return new Immediate(ImmediateType.BlockSignature, [blockType]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createBranchTable(defaultLabel: any, labels: any[], depth: number): Immediate {\r\n const relativeDepths = labels.map((x) => {\r\n return depth - x.block.depth;\r\n });\r\n const defaultLabelDepth = depth - defaultLabel.block.depth;\r\n return new Immediate(ImmediateType.BranchTable, [defaultLabelDepth, relativeDepths]);\r\n }\r\n\r\n static createFloat32(value: number): Immediate {\r\n return new Immediate(ImmediateType.Float32, [value]);\r\n }\r\n\r\n static createFloat64(value: number): Immediate {\r\n return new Immediate(ImmediateType.Float64, [value]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createFunction(functionBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.Function, [functionBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createGlobal(globalBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.Global, [globalBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createIndirectFunction(functionTypeBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.IndirectFunction, [functionTypeBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createLocal(local: any): Immediate {\r\n return new Immediate(ImmediateType.Local, [local]);\r\n }\r\n\r\n static createMemoryImmediate(alignment: number, offset: number): Immediate {\r\n return new Immediate(ImmediateType.MemoryImmediate, [alignment, offset]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createRelativeDepth(label: any, depth: number): Immediate {\r\n return new Immediate(ImmediateType.RelativeDepth, [label, depth]);\r\n }\r\n\r\n static createVarUInt1(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarUInt1, [value]);\r\n }\r\n\r\n static createVarInt32(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarInt32, [value]);\r\n }\r\n\r\n static createVarInt64(value: number | bigint): Immediate {\r\n return new Immediate(ImmediateType.VarInt64, [value]);\r\n }\r\n\r\n static createVarUInt32(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarUInt32, [value]);\r\n }\r\n\r\n static createV128Const(bytes: Uint8Array): Immediate {\r\n if (bytes.length !== 16) {\r\n throw new Error('V128 constant must be exactly 16 bytes.');\r\n }\r\n return new Immediate(ImmediateType.V128Const, [bytes]);\r\n }\r\n\r\n static createLaneIndex(index: number): Immediate {\r\n return new Immediate(ImmediateType.LaneIndex, [index]);\r\n }\r\n\r\n static createShuffleMask(mask: Uint8Array): Immediate {\r\n if (mask.length !== 16) {\r\n throw new Error('Shuffle mask must be exactly 16 bytes.');\r\n }\r\n return new Immediate(ImmediateType.ShuffleMask, [mask]);\r\n }\r\n\r\n writeBytes(writer: BinaryWriter): void {\r\n switch (this.type) {\r\n case ImmediateType.BlockSignature:\r\n ImmediateEncoder.encodeBlockSignature(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.BranchTable:\r\n ImmediateEncoder.encodeBranchTable(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.Float32:\r\n ImmediateEncoder.encodeFloat32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Float64:\r\n ImmediateEncoder.encodeFloat64(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Function:\r\n ImmediateEncoder.encodeFunction(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Global:\r\n ImmediateEncoder.encodeGlobal(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.IndirectFunction:\r\n ImmediateEncoder.encodeIndirectFunction(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Local:\r\n ImmediateEncoder.encodeLocal(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.MemoryImmediate:\r\n ImmediateEncoder.encodeMemoryImmediate(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.RelativeDepth:\r\n ImmediateEncoder.encodeRelativeDepth(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.VarInt32:\r\n ImmediateEncoder.encodeVarInt32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarInt64:\r\n ImmediateEncoder.encodeVarInt64(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarUInt1:\r\n ImmediateEncoder.encodeVarUInt1(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarUInt32:\r\n ImmediateEncoder.encodeVarUInt32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.V128Const:\r\n ImmediateEncoder.encodeV128Const(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.LaneIndex:\r\n ImmediateEncoder.encodeLaneIndex(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.ShuffleMask:\r\n ImmediateEncoder.encodeShuffleMask(writer, this.values[0]);\r\n break;\r\n\r\n default:\r\n throw new Error('Cannot encode unknown operand type.');\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.writeBytes(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport Immediate from './Immediate';\r\nimport { OpCodeDef } from './types';\r\n\r\nexport default class Instruction {\r\n opCode: OpCodeDef;\r\n immediate: Immediate | null;\r\n\r\n constructor(opCode: OpCodeDef, immediate: Immediate | null) {\r\n Arg.notNull('opCode', opCode);\r\n this.opCode = opCode;\r\n this.immediate = immediate;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (this.opCode.prefix !== undefined) {\r\n writer.writeByte(this.opCode.prefix);\r\n writer.writeVarUInt32(this.opCode.value);\r\n } else {\r\n writer.writeByte(this.opCode.value);\r\n }\r\n if (this.immediate) {\r\n this.immediate.writeBytes(writer);\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import type ControlFlowBlock from './verification/ControlFlowBlock';\r\n\r\nexport default class LabelBuilder {\r\n resolved: boolean;\r\n block: ControlFlowBlock | null;\r\n\r\n constructor() {\r\n this.resolved = false;\r\n this.block = null;\r\n }\r\n\r\n get isResolved(): boolean {\r\n return this.resolved;\r\n }\r\n\r\n resolve(block: ControlFlowBlock): void {\r\n this.block = block;\r\n this.resolved = true;\r\n }\r\n\r\n reference(block: ControlFlowBlock): void {\r\n if (this.isResolved) {\r\n throw new Error('Cannot add a reference to a label that has been resolved.');\r\n }\r\n this.block = block;\r\n }\r\n}\r\n", "import type { OpCodeDef } from './types';\n\nconst OpCodes = {\n \"unreachable\": {\n value: 0,\n mnemonic: \"unreachable\",\n stackBehavior: \"None\",\n },\n \"nop\": {\n value: 1,\n mnemonic: \"nop\",\n stackBehavior: \"None\",\n },\n \"block\": {\n value: 2,\n mnemonic: \"block\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"None\",\n },\n \"loop\": {\n value: 3,\n mnemonic: \"loop\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"None\",\n },\n \"if\": {\n value: 4,\n mnemonic: \"if\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"else\": {\n value: 5,\n mnemonic: \"else\",\n stackBehavior: \"None\",\n },\n \"end\": {\n value: 11,\n mnemonic: \"end\",\n controlFlow: \"Pop\",\n stackBehavior: \"None\",\n },\n \"br\": {\n value: 12,\n mnemonic: \"br\",\n immediate: \"RelativeDepth\",\n stackBehavior: \"None\",\n },\n \"br_if\": {\n value: 13,\n mnemonic: \"br_if\",\n immediate: \"RelativeDepth\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"br_table\": {\n value: 14,\n mnemonic: \"br_table\",\n immediate: \"BranchTable\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"return\": {\n value: 15,\n mnemonic: \"return\",\n stackBehavior: \"None\",\n },\n \"call\": {\n value: 16,\n mnemonic: \"call\",\n immediate: \"Function\",\n stackBehavior: \"PopPush\",\n popOperands: [] as const,\n pushOperands: [] as const,\n },\n \"call_indirect\": {\n value: 17,\n mnemonic: \"call_indirect\",\n immediate: \"IndirectFunction\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [] as const,\n },\n \"drop\": {\n value: 26,\n mnemonic: \"drop\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"select\": {\n value: 27,\n mnemonic: \"select\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Any\",\"Any\"] as const,\n pushOperands: [\"Any\"] as const,\n },\n \"get_local\": {\n value: 32,\n mnemonic: \"local.get\",\n immediate: \"Local\",\n stackBehavior: \"Push\",\n pushOperands: [\"Any\"] as const,\n },\n \"set_local\": {\n value: 33,\n mnemonic: \"local.set\",\n immediate: \"Local\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"tee_local\": {\n value: 34,\n mnemonic: \"local.tee\",\n immediate: \"Local\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Any\"] as const,\n pushOperands: [\"Any\"] as const,\n },\n \"get_global\": {\n value: 35,\n mnemonic: \"global.get\",\n immediate: \"Global\",\n stackBehavior: \"Push\",\n pushOperands: [\"Any\"] as const,\n },\n \"set_global\": {\n value: 36,\n mnemonic: \"global.set\",\n immediate: \"Global\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"i32_load\": {\n value: 40,\n mnemonic: \"i32.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_load\": {\n value: 41,\n mnemonic: \"i64.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_load\": {\n value: 42,\n mnemonic: \"f32.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_load\": {\n value: 43,\n mnemonic: \"f64.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_load8_s\": {\n value: 44,\n mnemonic: \"i32.load8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load8_u\": {\n value: 45,\n mnemonic: \"i32.load8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load16_s\": {\n value: 46,\n mnemonic: \"i32.load16_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load16_u\": {\n value: 47,\n mnemonic: \"i32.load16_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_load8_s\": {\n value: 48,\n mnemonic: \"i64.load8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load8_u\": {\n value: 49,\n mnemonic: \"i64.load8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load16_s\": {\n value: 50,\n mnemonic: \"i64.load16_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load16_u\": {\n value: 51,\n mnemonic: \"i64.load16_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load32_s\": {\n value: 52,\n mnemonic: \"i64.load32_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load32_u\": {\n value: 53,\n mnemonic: \"i64.load32_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i32_store\": {\n value: 54,\n mnemonic: \"i32.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i64_store\": {\n value: 55,\n mnemonic: \"i64.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"f32_store\": {\n value: 56,\n mnemonic: \"f32.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Float32\"] as const,\n },\n \"f64_store\": {\n value: 57,\n mnemonic: \"f64.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Float64\"] as const,\n },\n \"i32_store8\": {\n value: 58,\n mnemonic: \"i32.store8\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i32_store16\": {\n value: 59,\n mnemonic: \"i32.store16\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i64_store8\": {\n value: 60,\n mnemonic: \"i64.store8\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"i64_store16\": {\n value: 61,\n mnemonic: \"i64.store16\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"i64_store32\": {\n value: 62,\n mnemonic: \"i64.store32\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"mem_size\": {\n value: 63,\n mnemonic: \"memory.size\",\n immediate: \"VarUInt1\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n },\n \"mem_grow\": {\n value: 64,\n mnemonic: \"memory.grow\",\n immediate: \"VarUInt1\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_const\": {\n value: 65,\n mnemonic: \"i32.const\",\n immediate: \"VarInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_const\": {\n value: 66,\n mnemonic: \"i64.const\",\n immediate: \"VarInt64\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_const\": {\n value: 67,\n mnemonic: \"f32.const\",\n immediate: \"Float32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_const\": {\n value: 68,\n mnemonic: \"f64.const\",\n immediate: \"Float64\",\n stackBehavior: \"Push\",\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_eqz\": {\n value: 69,\n mnemonic: \"i32.eqz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_eq\": {\n value: 70,\n mnemonic: \"i32.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ne\": {\n value: 71,\n mnemonic: \"i32.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_lt_s\": {\n value: 72,\n mnemonic: \"i32.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_lt_u\": {\n value: 73,\n mnemonic: \"i32.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_gt_s\": {\n value: 74,\n mnemonic: \"i32.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_gt_u\": {\n value: 75,\n mnemonic: \"i32.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_le_s\": {\n value: 76,\n mnemonic: \"i32.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_le_u\": {\n value: 77,\n mnemonic: \"i32.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ge_s\": {\n value: 78,\n mnemonic: \"i32.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ge_u\": {\n value: 79,\n mnemonic: \"i32.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_eqz\": {\n value: 80,\n mnemonic: \"i64.eqz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_eq\": {\n value: 81,\n mnemonic: \"i64.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ne\": {\n value: 82,\n mnemonic: \"i64.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_lt_s\": {\n value: 83,\n mnemonic: \"i64.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_lt_u\": {\n value: 84,\n mnemonic: \"i64.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_gt_s\": {\n value: 85,\n mnemonic: \"i64.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_gt_u\": {\n value: 86,\n mnemonic: \"i64.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_le_s\": {\n value: 87,\n mnemonic: \"i64.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_le_u\": {\n value: 88,\n mnemonic: \"i64.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ge_s\": {\n value: 89,\n mnemonic: \"i64.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ge_u\": {\n value: 90,\n mnemonic: \"i64.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_eq\": {\n value: 91,\n mnemonic: \"f32.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_ne\": {\n value: 92,\n mnemonic: \"f32.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_lt\": {\n value: 93,\n mnemonic: \"f32.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_gt\": {\n value: 94,\n mnemonic: \"f32.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_le\": {\n value: 95,\n mnemonic: \"f32.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_ge\": {\n value: 96,\n mnemonic: \"f32.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_eq\": {\n value: 97,\n mnemonic: \"f64.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_ne\": {\n value: 98,\n mnemonic: \"f64.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_lt\": {\n value: 99,\n mnemonic: \"f64.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_gt\": {\n value: 100,\n mnemonic: \"f64.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_le\": {\n value: 101,\n mnemonic: \"f64.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_ge\": {\n value: 102,\n mnemonic: \"f64.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_clz\": {\n value: 103,\n mnemonic: \"i32.clz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ctz\": {\n value: 104,\n mnemonic: \"i32.ctz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_popcnt\": {\n value: 105,\n mnemonic: \"i32.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_add\": {\n value: 106,\n mnemonic: \"i32.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_sub\": {\n value: 107,\n mnemonic: \"i32.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_mul\": {\n value: 108,\n mnemonic: \"i32.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_div_s\": {\n value: 109,\n mnemonic: \"i32.div_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_div_u\": {\n value: 110,\n mnemonic: \"i32.div_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rem_s\": {\n value: 111,\n mnemonic: \"i32.rem_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rem_u\": {\n value: 112,\n mnemonic: \"i32.rem_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_and\": {\n value: 113,\n mnemonic: \"i32.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_or\": {\n value: 114,\n mnemonic: \"i32.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_xor\": {\n value: 115,\n mnemonic: \"i32.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shl\": {\n value: 116,\n mnemonic: \"i32.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shr_s\": {\n value: 117,\n mnemonic: \"i32.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shr_u\": {\n value: 118,\n mnemonic: \"i32.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rotl\": {\n value: 119,\n mnemonic: \"i32.rotl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rotr\": {\n value: 120,\n mnemonic: \"i32.rotr\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_clz\": {\n value: 121,\n mnemonic: \"i64.clz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_ctz\": {\n value: 122,\n mnemonic: \"i64.ctz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_popcnt\": {\n value: 123,\n mnemonic: \"i64.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_add\": {\n value: 124,\n mnemonic: \"i64.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_sub\": {\n value: 125,\n mnemonic: \"i64.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_mul\": {\n value: 126,\n mnemonic: \"i64.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_div_s\": {\n value: 127,\n mnemonic: \"i64.div_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_div_u\": {\n value: 128,\n mnemonic: \"i64.div_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rem_s\": {\n value: 129,\n mnemonic: \"i64.rem_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rem_u\": {\n value: 130,\n mnemonic: \"i64.rem_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_and\": {\n value: 131,\n mnemonic: \"i64.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_or\": {\n value: 132,\n mnemonic: \"i64.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_xor\": {\n value: 133,\n mnemonic: \"i64.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shl\": {\n value: 134,\n mnemonic: \"i64.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shr_s\": {\n value: 135,\n mnemonic: \"i64.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shr_u\": {\n value: 136,\n mnemonic: \"i64.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rotl\": {\n value: 137,\n mnemonic: \"i64.rotl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rotr\": {\n value: 138,\n mnemonic: \"i64.rotr\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_abs\": {\n value: 139,\n mnemonic: \"f32.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_neg\": {\n value: 140,\n mnemonic: \"f32.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_ceil\": {\n value: 141,\n mnemonic: \"f32.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_floor\": {\n value: 142,\n mnemonic: \"f32.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_trunc\": {\n value: 143,\n mnemonic: \"f32.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_nearest\": {\n value: 144,\n mnemonic: \"f32.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_sqrt\": {\n value: 145,\n mnemonic: \"f32.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_add\": {\n value: 146,\n mnemonic: \"f32.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_sub\": {\n value: 147,\n mnemonic: \"f32.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_mul\": {\n value: 148,\n mnemonic: \"f32.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_div\": {\n value: 149,\n mnemonic: \"f32.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_min\": {\n value: 150,\n mnemonic: \"f32.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_max\": {\n value: 151,\n mnemonic: \"f32.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_copysign\": {\n value: 152,\n mnemonic: \"f32.copysign\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_abs\": {\n value: 153,\n mnemonic: \"f64.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_neg\": {\n value: 154,\n mnemonic: \"f64.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_ceil\": {\n value: 155,\n mnemonic: \"f64.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_floor\": {\n value: 156,\n mnemonic: \"f64.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_trunc\": {\n value: 157,\n mnemonic: \"f64.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_nearest\": {\n value: 158,\n mnemonic: \"f64.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_sqrt\": {\n value: 159,\n mnemonic: \"f64.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_add\": {\n value: 160,\n mnemonic: \"f64.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_sub\": {\n value: 161,\n mnemonic: \"f64.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_mul\": {\n value: 162,\n mnemonic: \"f64.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_div\": {\n value: 163,\n mnemonic: \"f64.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_min\": {\n value: 164,\n mnemonic: \"f64.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_max\": {\n value: 165,\n mnemonic: \"f64.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_copysign\": {\n value: 166,\n mnemonic: \"f64.copysign\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_wrap_i64\": {\n value: 167,\n mnemonic: \"i32.wrap_i64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f32_s\": {\n value: 168,\n mnemonic: \"i32.trunc_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f32_u\": {\n value: 169,\n mnemonic: \"i32.trunc_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f64_s\": {\n value: 170,\n mnemonic: \"i32.trunc_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f64_u\": {\n value: 171,\n mnemonic: \"i32.trunc_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_extend_i32_s\": {\n value: 172,\n mnemonic: \"i64.extend_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_extend_i32_u\": {\n value: 173,\n mnemonic: \"i64.extend_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f32_s\": {\n value: 174,\n mnemonic: \"i64.trunc_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f32_u\": {\n value: 175,\n mnemonic: \"i64.trunc_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f64_s\": {\n value: 176,\n mnemonic: \"i64.trunc_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f64_u\": {\n value: 177,\n mnemonic: \"i64.trunc_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_convert_i32_s\": {\n value: 178,\n mnemonic: \"f32.convert_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i32_u\": {\n value: 179,\n mnemonic: \"f32.convert_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i64_s\": {\n value: 180,\n mnemonic: \"f32.convert_i64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i64_u\": {\n value: 181,\n mnemonic: \"f32.convert_i64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_demote_f64\": {\n value: 182,\n mnemonic: \"f32.demote_f64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_convert_i32_s\": {\n value: 183,\n mnemonic: \"f64.convert_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i32_u\": {\n value: 184,\n mnemonic: \"f64.convert_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i64_s\": {\n value: 185,\n mnemonic: \"f64.convert_i64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i64_u\": {\n value: 186,\n mnemonic: \"f64.convert_i64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_promote_f32\": {\n value: 187,\n mnemonic: \"f64.promote_f32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_reinterpret_f32\": {\n value: 188,\n mnemonic: \"i32.reinterpret_f32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_reinterpret_f64\": {\n value: 189,\n mnemonic: \"i64.reinterpret_f64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_reinterpret_i32\": {\n value: 190,\n mnemonic: \"f32.reinterpret_i32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_reinterpret_i64\": {\n value: 191,\n mnemonic: \"f64.reinterpret_i64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_extend8_s\": {\n value: 192,\n mnemonic: \"i32.extend8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"sign-extend\",\n },\n \"i32_extend16_s\": {\n value: 193,\n mnemonic: \"i32.extend16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend8_s\": {\n value: 194,\n mnemonic: \"i64.extend8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend16_s\": {\n value: 195,\n mnemonic: \"i64.extend16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend32_s\": {\n value: 196,\n mnemonic: \"i64.extend32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i32_trunc_sat_f32_s\": {\n value: 0,\n mnemonic: \"i32.trunc_sat_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f32_u\": {\n value: 1,\n mnemonic: \"i32.trunc_sat_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f64_s\": {\n value: 2,\n mnemonic: \"i32.trunc_sat_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f64_u\": {\n value: 3,\n mnemonic: \"i32.trunc_sat_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f32_s\": {\n value: 4,\n mnemonic: \"i64.trunc_sat_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f32_u\": {\n value: 5,\n mnemonic: \"i64.trunc_sat_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f64_s\": {\n value: 6,\n mnemonic: \"i64.trunc_sat_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f64_u\": {\n value: 7,\n mnemonic: \"i64.trunc_sat_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"memory_init\": {\n value: 8,\n mnemonic: \"memory.init\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"data_drop\": {\n value: 9,\n mnemonic: \"data.drop\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"memory_copy\": {\n value: 10,\n mnemonic: \"memory.copy\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"memory_fill\": {\n value: 11,\n mnemonic: \"memory.fill\",\n immediate: \"VarUInt1\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_init\": {\n value: 12,\n mnemonic: \"table.init\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"elem_drop\": {\n value: 13,\n mnemonic: \"elem.drop\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_copy\": {\n value: 14,\n mnemonic: \"table.copy\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_grow\": {\n value: 15,\n mnemonic: \"table.grow\",\n immediate: \"VarUInt32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"table_size\": {\n value: 16,\n mnemonic: \"table.size\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"table_fill\": {\n value: 17,\n mnemonic: \"table.fill\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"ref_null\": {\n value: 208,\n mnemonic: \"ref.null\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"ref_is_null\": {\n value: 209,\n mnemonic: \"ref.is_null\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"ref_func\": {\n value: 210,\n mnemonic: \"ref.func\",\n immediate: \"Function\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"table_get\": {\n value: 37,\n mnemonic: \"table.get\",\n immediate: \"VarUInt32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"table_set\": {\n value: 38,\n mnemonic: \"table.set\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"v128_load\": {\n value: 0,\n mnemonic: \"v128.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8x8_s\": {\n value: 1,\n mnemonic: \"v128.load8x8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8x8_u\": {\n value: 2,\n mnemonic: \"v128.load8x8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16x4_s\": {\n value: 3,\n mnemonic: \"v128.load16x4_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16x4_u\": {\n value: 4,\n mnemonic: \"v128.load16x4_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32x2_s\": {\n value: 5,\n mnemonic: \"v128.load32x2_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32x2_u\": {\n value: 6,\n mnemonic: \"v128.load32x2_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8_splat\": {\n value: 7,\n mnemonic: \"v128.load8_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16_splat\": {\n value: 8,\n mnemonic: \"v128.load16_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_splat\": {\n value: 9,\n mnemonic: \"v128.load32_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_splat\": {\n value: 10,\n mnemonic: \"v128.load64_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store\": {\n value: 11,\n mnemonic: \"v128.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_const\": {\n value: 12,\n mnemonic: \"v128.const\",\n immediate: \"V128Const\",\n stackBehavior: \"Push\",\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shuffle\": {\n value: 13,\n mnemonic: \"i8x16.shuffle\",\n immediate: \"ShuffleMask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_swizzle\": {\n value: 14,\n mnemonic: \"i8x16.swizzle\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_splat\": {\n value: 15,\n mnemonic: \"i8x16.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_splat\": {\n value: 16,\n mnemonic: \"i16x8.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_splat\": {\n value: 17,\n mnemonic: \"i32x4.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_splat\": {\n value: 18,\n mnemonic: \"i64x2.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_splat\": {\n value: 19,\n mnemonic: \"f32x4.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_splat\": {\n value: 20,\n mnemonic: \"f64x2.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_extract_lane_s\": {\n value: 21,\n mnemonic: \"i8x16.extract_lane_s\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_extract_lane_u\": {\n value: 22,\n mnemonic: \"i8x16.extract_lane_u\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_replace_lane\": {\n value: 23,\n mnemonic: \"i8x16.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extract_lane_s\": {\n value: 24,\n mnemonic: \"i16x8.extract_lane_s\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extract_lane_u\": {\n value: 25,\n mnemonic: \"i16x8.extract_lane_u\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_replace_lane\": {\n value: 26,\n mnemonic: \"i16x8.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extract_lane\": {\n value: 27,\n mnemonic: \"i32x4.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_replace_lane\": {\n value: 28,\n mnemonic: \"i32x4.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extract_lane\": {\n value: 29,\n mnemonic: \"i64x2.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_replace_lane\": {\n value: 30,\n mnemonic: \"i64x2.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_extract_lane\": {\n value: 31,\n mnemonic: \"f32x4.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Float32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_replace_lane\": {\n value: 32,\n mnemonic: \"f32x4.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Float32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_extract_lane\": {\n value: 33,\n mnemonic: \"f64x2.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Float64\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_replace_lane\": {\n value: 34,\n mnemonic: \"f64x2.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Float64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_eq\": {\n value: 35,\n mnemonic: \"i8x16.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ne\": {\n value: 36,\n mnemonic: \"i8x16.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_lt_s\": {\n value: 37,\n mnemonic: \"i8x16.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_lt_u\": {\n value: 38,\n mnemonic: \"i8x16.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_gt_s\": {\n value: 39,\n mnemonic: \"i8x16.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_gt_u\": {\n value: 40,\n mnemonic: \"i8x16.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_le_s\": {\n value: 41,\n mnemonic: \"i8x16.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_le_u\": {\n value: 42,\n mnemonic: \"i8x16.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ge_s\": {\n value: 43,\n mnemonic: \"i8x16.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ge_u\": {\n value: 44,\n mnemonic: \"i8x16.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_eq\": {\n value: 45,\n mnemonic: \"i16x8.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ne\": {\n value: 46,\n mnemonic: \"i16x8.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_lt_s\": {\n value: 47,\n mnemonic: \"i16x8.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_lt_u\": {\n value: 48,\n mnemonic: \"i16x8.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_gt_s\": {\n value: 49,\n mnemonic: \"i16x8.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_gt_u\": {\n value: 50,\n mnemonic: \"i16x8.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_le_s\": {\n value: 51,\n mnemonic: \"i16x8.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_le_u\": {\n value: 52,\n mnemonic: \"i16x8.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ge_s\": {\n value: 53,\n mnemonic: \"i16x8.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ge_u\": {\n value: 54,\n mnemonic: \"i16x8.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_eq\": {\n value: 55,\n mnemonic: \"i32x4.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ne\": {\n value: 56,\n mnemonic: \"i32x4.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_lt_s\": {\n value: 57,\n mnemonic: \"i32x4.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_lt_u\": {\n value: 58,\n mnemonic: \"i32x4.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_gt_s\": {\n value: 59,\n mnemonic: \"i32x4.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_gt_u\": {\n value: 60,\n mnemonic: \"i32x4.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_le_s\": {\n value: 61,\n mnemonic: \"i32x4.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_le_u\": {\n value: 62,\n mnemonic: \"i32x4.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ge_s\": {\n value: 63,\n mnemonic: \"i32x4.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ge_u\": {\n value: 64,\n mnemonic: \"i32x4.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_eq\": {\n value: 65,\n mnemonic: \"f32x4.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ne\": {\n value: 66,\n mnemonic: \"f32x4.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_lt\": {\n value: 67,\n mnemonic: \"f32x4.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_gt\": {\n value: 68,\n mnemonic: \"f32x4.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_le\": {\n value: 69,\n mnemonic: \"f32x4.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ge\": {\n value: 70,\n mnemonic: \"f32x4.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_eq\": {\n value: 71,\n mnemonic: \"f64x2.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ne\": {\n value: 72,\n mnemonic: \"f64x2.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_lt\": {\n value: 73,\n mnemonic: \"f64x2.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_gt\": {\n value: 74,\n mnemonic: \"f64x2.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_le\": {\n value: 75,\n mnemonic: \"f64x2.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ge\": {\n value: 76,\n mnemonic: \"f64x2.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_not\": {\n value: 77,\n mnemonic: \"v128.not\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_and\": {\n value: 78,\n mnemonic: \"v128.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_andnot\": {\n value: 79,\n mnemonic: \"v128.andnot\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_or\": {\n value: 80,\n mnemonic: \"v128.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_xor\": {\n value: 81,\n mnemonic: \"v128.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_bitselect\": {\n value: 82,\n mnemonic: \"v128.bitselect\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_any_true\": {\n value: 83,\n mnemonic: \"v128.any_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8_lane\": {\n value: 84,\n mnemonic: \"v128.load8_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16_lane\": {\n value: 85,\n mnemonic: \"v128.load16_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_lane\": {\n value: 86,\n mnemonic: \"v128.load32_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_lane\": {\n value: 87,\n mnemonic: \"v128.load64_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store8_lane\": {\n value: 88,\n mnemonic: \"v128.store8_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store16_lane\": {\n value: 89,\n mnemonic: \"v128.store16_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store32_lane\": {\n value: 90,\n mnemonic: \"v128.store32_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store64_lane\": {\n value: 91,\n mnemonic: \"v128.store64_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_zero\": {\n value: 92,\n mnemonic: \"v128.load32_zero\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_zero\": {\n value: 93,\n mnemonic: \"v128.load64_zero\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f32x4_s\": {\n value: 94,\n mnemonic: \"i32x4.trunc_sat_f32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f32x4_u\": {\n value: 95,\n mnemonic: \"i32x4.trunc_sat_f32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_abs\": {\n value: 96,\n mnemonic: \"i8x16.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_neg\": {\n value: 97,\n mnemonic: \"i8x16.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_popcnt\": {\n value: 98,\n mnemonic: \"i8x16.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_all_true\": {\n value: 99,\n mnemonic: \"i8x16.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_bitmask\": {\n value: 100,\n mnemonic: \"i8x16.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_narrow_i16x8_s\": {\n value: 101,\n mnemonic: \"i8x16.narrow_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_narrow_i16x8_u\": {\n value: 102,\n mnemonic: \"i8x16.narrow_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ceil\": {\n value: 103,\n mnemonic: \"f32x4.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_floor\": {\n value: 104,\n mnemonic: \"f32x4.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_trunc\": {\n value: 105,\n mnemonic: \"f32x4.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_nearest\": {\n value: 106,\n mnemonic: \"f32x4.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shl\": {\n value: 107,\n mnemonic: \"i8x16.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shr_s\": {\n value: 108,\n mnemonic: \"i8x16.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shr_u\": {\n value: 109,\n mnemonic: \"i8x16.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add\": {\n value: 110,\n mnemonic: \"i8x16.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add_sat_s\": {\n value: 111,\n mnemonic: \"i8x16.add_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add_sat_u\": {\n value: 112,\n mnemonic: \"i8x16.add_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub\": {\n value: 113,\n mnemonic: \"i8x16.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub_sat_s\": {\n value: 114,\n mnemonic: \"i8x16.sub_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub_sat_u\": {\n value: 115,\n mnemonic: \"i8x16.sub_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ceil\": {\n value: 116,\n mnemonic: \"f64x2.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_floor\": {\n value: 117,\n mnemonic: \"f64x2.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_min_s\": {\n value: 118,\n mnemonic: \"i8x16.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_min_u\": {\n value: 119,\n mnemonic: \"i8x16.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_max_s\": {\n value: 120,\n mnemonic: \"i8x16.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_max_u\": {\n value: 121,\n mnemonic: \"i8x16.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_trunc\": {\n value: 122,\n mnemonic: \"f64x2.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_avgr_u\": {\n value: 123,\n mnemonic: \"i8x16.avgr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extadd_pairwise_i8x16_s\": {\n value: 124,\n mnemonic: \"i16x8.extadd_pairwise_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extadd_pairwise_i8x16_u\": {\n value: 125,\n mnemonic: \"i16x8.extadd_pairwise_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extadd_pairwise_i16x8_s\": {\n value: 126,\n mnemonic: \"i32x4.extadd_pairwise_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extadd_pairwise_i16x8_u\": {\n value: 127,\n mnemonic: \"i32x4.extadd_pairwise_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_abs\": {\n value: 128,\n mnemonic: \"i16x8.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_neg\": {\n value: 129,\n mnemonic: \"i16x8.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_q15mulr_sat_s\": {\n value: 130,\n mnemonic: \"i16x8.q15mulr_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_all_true\": {\n value: 131,\n mnemonic: \"i16x8.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_bitmask\": {\n value: 132,\n mnemonic: \"i16x8.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_narrow_i32x4_s\": {\n value: 133,\n mnemonic: \"i16x8.narrow_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_narrow_i32x4_u\": {\n value: 134,\n mnemonic: \"i16x8.narrow_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_low_i8x16_s\": {\n value: 135,\n mnemonic: \"i16x8.extend_low_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_high_i8x16_s\": {\n value: 136,\n mnemonic: \"i16x8.extend_high_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_low_i8x16_u\": {\n value: 137,\n mnemonic: \"i16x8.extend_low_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_high_i8x16_u\": {\n value: 138,\n mnemonic: \"i16x8.extend_high_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shl\": {\n value: 139,\n mnemonic: \"i16x8.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shr_s\": {\n value: 140,\n mnemonic: \"i16x8.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shr_u\": {\n value: 141,\n mnemonic: \"i16x8.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add\": {\n value: 142,\n mnemonic: \"i16x8.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add_sat_s\": {\n value: 143,\n mnemonic: \"i16x8.add_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add_sat_u\": {\n value: 144,\n mnemonic: \"i16x8.add_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub\": {\n value: 145,\n mnemonic: \"i16x8.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub_sat_s\": {\n value: 146,\n mnemonic: \"i16x8.sub_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub_sat_u\": {\n value: 147,\n mnemonic: \"i16x8.sub_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_nearest\": {\n value: 148,\n mnemonic: \"f64x2.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_mul\": {\n value: 149,\n mnemonic: \"i16x8.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_min_s\": {\n value: 150,\n mnemonic: \"i16x8.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_min_u\": {\n value: 151,\n mnemonic: \"i16x8.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_max_s\": {\n value: 152,\n mnemonic: \"i16x8.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_max_u\": {\n value: 153,\n mnemonic: \"i16x8.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_avgr_u\": {\n value: 155,\n mnemonic: \"i16x8.avgr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_low_i8x16_s\": {\n value: 156,\n mnemonic: \"i16x8.extmul_low_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_high_i8x16_s\": {\n value: 157,\n mnemonic: \"i16x8.extmul_high_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_low_i8x16_u\": {\n value: 158,\n mnemonic: \"i16x8.extmul_low_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_high_i8x16_u\": {\n value: 159,\n mnemonic: \"i16x8.extmul_high_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_abs\": {\n value: 160,\n mnemonic: \"i32x4.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_neg\": {\n value: 161,\n mnemonic: \"i32x4.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_all_true\": {\n value: 163,\n mnemonic: \"i32x4.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_bitmask\": {\n value: 164,\n mnemonic: \"i32x4.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_low_i16x8_s\": {\n value: 167,\n mnemonic: \"i32x4.extend_low_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_high_i16x8_s\": {\n value: 168,\n mnemonic: \"i32x4.extend_high_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_low_i16x8_u\": {\n value: 169,\n mnemonic: \"i32x4.extend_low_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_high_i16x8_u\": {\n value: 170,\n mnemonic: \"i32x4.extend_high_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shl\": {\n value: 171,\n mnemonic: \"i32x4.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shr_s\": {\n value: 172,\n mnemonic: \"i32x4.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shr_u\": {\n value: 173,\n mnemonic: \"i32x4.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_add\": {\n value: 174,\n mnemonic: \"i32x4.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_convert_i32x4_s\": {\n value: 175,\n mnemonic: \"f32x4.convert_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_convert_i32x4_u\": {\n value: 176,\n mnemonic: \"f32x4.convert_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_sub\": {\n value: 177,\n mnemonic: \"i32x4.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_mul\": {\n value: 181,\n mnemonic: \"i32x4.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_min_s\": {\n value: 182,\n mnemonic: \"i32x4.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_min_u\": {\n value: 183,\n mnemonic: \"i32x4.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_max_s\": {\n value: 184,\n mnemonic: \"i32x4.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_max_u\": {\n value: 185,\n mnemonic: \"i32x4.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_dot_i16x8_s\": {\n value: 186,\n mnemonic: \"i32x4.dot_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_low_i16x8_s\": {\n value: 188,\n mnemonic: \"i32x4.extmul_low_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_high_i16x8_s\": {\n value: 189,\n mnemonic: \"i32x4.extmul_high_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_low_i16x8_u\": {\n value: 190,\n mnemonic: \"i32x4.extmul_low_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_high_i16x8_u\": {\n value: 191,\n mnemonic: \"i32x4.extmul_high_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_abs\": {\n value: 192,\n mnemonic: \"i64x2.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_neg\": {\n value: 193,\n mnemonic: \"i64x2.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_all_true\": {\n value: 195,\n mnemonic: \"i64x2.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_bitmask\": {\n value: 196,\n mnemonic: \"i64x2.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_low_i32x4_s\": {\n value: 199,\n mnemonic: \"i64x2.extend_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_high_i32x4_s\": {\n value: 200,\n mnemonic: \"i64x2.extend_high_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_low_i32x4_u\": {\n value: 201,\n mnemonic: \"i64x2.extend_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_high_i32x4_u\": {\n value: 202,\n mnemonic: \"i64x2.extend_high_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shl\": {\n value: 203,\n mnemonic: \"i64x2.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shr_s\": {\n value: 204,\n mnemonic: \"i64x2.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shr_u\": {\n value: 205,\n mnemonic: \"i64x2.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_add\": {\n value: 206,\n mnemonic: \"i64x2.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_sub\": {\n value: 209,\n mnemonic: \"i64x2.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_mul\": {\n value: 213,\n mnemonic: \"i64x2.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_eq\": {\n value: 214,\n mnemonic: \"i64x2.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_ne\": {\n value: 215,\n mnemonic: \"i64x2.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_lt_s\": {\n value: 216,\n mnemonic: \"i64x2.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_gt_s\": {\n value: 217,\n mnemonic: \"i64x2.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_le_s\": {\n value: 218,\n mnemonic: \"i64x2.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_ge_s\": {\n value: 219,\n mnemonic: \"i64x2.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_low_i32x4_s\": {\n value: 220,\n mnemonic: \"i64x2.extmul_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_high_i32x4_s\": {\n value: 221,\n mnemonic: \"i64x2.extmul_high_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_low_i32x4_u\": {\n value: 222,\n mnemonic: \"i64x2.extmul_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_high_i32x4_u\": {\n value: 223,\n mnemonic: \"i64x2.extmul_high_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_abs\": {\n value: 224,\n mnemonic: \"f32x4.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_neg\": {\n value: 225,\n mnemonic: \"f32x4.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_sqrt\": {\n value: 227,\n mnemonic: \"f32x4.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_add\": {\n value: 228,\n mnemonic: \"f32x4.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_sub\": {\n value: 229,\n mnemonic: \"f32x4.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_mul\": {\n value: 230,\n mnemonic: \"f32x4.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_div\": {\n value: 231,\n mnemonic: \"f32x4.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_min\": {\n value: 232,\n mnemonic: \"f32x4.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_max\": {\n value: 233,\n mnemonic: \"f32x4.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_pmin\": {\n value: 234,\n mnemonic: \"f32x4.pmin\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_pmax\": {\n value: 235,\n mnemonic: \"f32x4.pmax\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_abs\": {\n value: 236,\n mnemonic: \"f64x2.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_neg\": {\n value: 237,\n mnemonic: \"f64x2.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_sqrt\": {\n value: 239,\n mnemonic: \"f64x2.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_add\": {\n value: 240,\n mnemonic: \"f64x2.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_sub\": {\n value: 241,\n mnemonic: \"f64x2.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_mul\": {\n value: 242,\n mnemonic: \"f64x2.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_div\": {\n value: 243,\n mnemonic: \"f64x2.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_min\": {\n value: 244,\n mnemonic: \"f64x2.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_max\": {\n value: 245,\n mnemonic: \"f64x2.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_pmin\": {\n value: 246,\n mnemonic: \"f64x2.pmin\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_pmax\": {\n value: 247,\n mnemonic: \"f64x2.pmax\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f64x2_s_zero\": {\n value: 248,\n mnemonic: \"i32x4.trunc_sat_f64x2_s_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f64x2_u_zero\": {\n value: 249,\n mnemonic: \"i32x4.trunc_sat_f64x2_u_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_convert_low_i32x4_s\": {\n value: 250,\n mnemonic: \"f64x2.convert_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_convert_low_i32x4_u\": {\n value: 251,\n mnemonic: \"f64x2.convert_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_demote_f64x2_zero\": {\n value: 252,\n mnemonic: \"f32x4.demote_f64x2_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_promote_low_f32x4\": {\n value: 253,\n mnemonic: \"f64x2.promote_low_f32x4\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n} as const satisfies Record;\n\nexport default OpCodes;\n", "import OpCodes from './OpCodes';\n\nexport default abstract class OpCodeEmitter {\n unreachable(): any {\n return this.emit(OpCodes.unreachable);\n }\n\n nop(): any {\n return this.emit(OpCodes.nop);\n }\n\n block(blockType: any, label?: any): any {\n return this.emit(OpCodes.block, blockType, label);\n }\n\n loop(blockType: any, label?: any): any {\n return this.emit(OpCodes.loop, blockType, label);\n }\n\n if(blockType: any, label?: any): any {\n return this.emit(OpCodes.if, blockType, label);\n }\n\n else(): any {\n return this.emit(OpCodes.else);\n }\n\n end(): any {\n return this.emit(OpCodes.end);\n }\n\n br(labelBuilder: any): any {\n return this.emit(OpCodes.br, labelBuilder);\n }\n\n br_if(labelBuilder: any): any {\n return this.emit(OpCodes.br_if, labelBuilder);\n }\n\n br_table(defaultLabelBuilder: any, ...labelBuilders: any[]): any {\n return this.emit(OpCodes.br_table, defaultLabelBuilder, labelBuilders);\n }\n\n return(): any {\n return this.emit(OpCodes.return);\n }\n\n call(functionBuilder: any): any {\n return this.emit(OpCodes.call, functionBuilder);\n }\n\n call_indirect(funcTypeBuilder: any): any {\n return this.emit(OpCodes.call_indirect, funcTypeBuilder);\n }\n\n drop(): any {\n return this.emit(OpCodes.drop);\n }\n\n select(): any {\n return this.emit(OpCodes.select);\n }\n\n get_local(local: any): any {\n return this.emit(OpCodes.get_local, local);\n }\n\n set_local(local: any): any {\n return this.emit(OpCodes.set_local, local);\n }\n\n tee_local(local: any): any {\n return this.emit(OpCodes.tee_local, local);\n }\n\n get_global(global: any): any {\n return this.emit(OpCodes.get_global, global);\n }\n\n set_global(global: any): any {\n return this.emit(OpCodes.set_global, global);\n }\n\n load_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load, alignment, offset);\n }\n\n load_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load, alignment, offset);\n }\n\n load_f32(alignment: number, offset: number): any {\n return this.emit(OpCodes.f32_load, alignment, offset);\n }\n\n load_f64(alignment: number, offset: number): any {\n return this.emit(OpCodes.f64_load, alignment, offset);\n }\n\n load8_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load8_s, alignment, offset);\n }\n\n load8_i32_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load8_u, alignment, offset);\n }\n\n load16_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load16_s, alignment, offset);\n }\n\n load16_i32_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load16_u, alignment, offset);\n }\n\n load8_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load8_s, alignment, offset);\n }\n\n load8_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load8_u, alignment, offset);\n }\n\n load16_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load16_s, alignment, offset);\n }\n\n load16_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load16_u, alignment, offset);\n }\n\n load32_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load32_s, alignment, offset);\n }\n\n load32_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load32_u, alignment, offset);\n }\n\n store_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store, alignment, offset);\n }\n\n store_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store, alignment, offset);\n }\n\n store_f32(alignment: number, offset: number): any {\n return this.emit(OpCodes.f32_store, alignment, offset);\n }\n\n store_f64(alignment: number, offset: number): any {\n return this.emit(OpCodes.f64_store, alignment, offset);\n }\n\n store8_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store8, alignment, offset);\n }\n\n store16_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store16, alignment, offset);\n }\n\n store8_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store8, alignment, offset);\n }\n\n store16_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store16, alignment, offset);\n }\n\n store32_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store32, alignment, offset);\n }\n\n mem_size(varUInt1: number): any {\n return this.emit(OpCodes.mem_size, varUInt1);\n }\n\n mem_grow(varUInt1: number): any {\n return this.emit(OpCodes.mem_grow, varUInt1);\n }\n\n const_i32(varInt32: number): any {\n return this.emit(OpCodes.i32_const, varInt32);\n }\n\n const_i64(varInt64: number | bigint): any {\n return this.emit(OpCodes.i64_const, varInt64);\n }\n\n const_f32(float32: number): any {\n return this.emit(OpCodes.f32_const, float32);\n }\n\n const_f64(float64: number): any {\n return this.emit(OpCodes.f64_const, float64);\n }\n\n eqz_i32(): any {\n return this.emit(OpCodes.i32_eqz);\n }\n\n eq_i32(): any {\n return this.emit(OpCodes.i32_eq);\n }\n\n ne_i32(): any {\n return this.emit(OpCodes.i32_ne);\n }\n\n lt_i32(): any {\n return this.emit(OpCodes.i32_lt_s);\n }\n\n lt_i32_u(): any {\n return this.emit(OpCodes.i32_lt_u);\n }\n\n gt_i32(): any {\n return this.emit(OpCodes.i32_gt_s);\n }\n\n gt_i32_u(): any {\n return this.emit(OpCodes.i32_gt_u);\n }\n\n le_i32(): any {\n return this.emit(OpCodes.i32_le_s);\n }\n\n le_i32_u(): any {\n return this.emit(OpCodes.i32_le_u);\n }\n\n ge_i32(): any {\n return this.emit(OpCodes.i32_ge_s);\n }\n\n ge_i32_u(): any {\n return this.emit(OpCodes.i32_ge_u);\n }\n\n eqz_i64(): any {\n return this.emit(OpCodes.i64_eqz);\n }\n\n eq_i64(): any {\n return this.emit(OpCodes.i64_eq);\n }\n\n ne_i64(): any {\n return this.emit(OpCodes.i64_ne);\n }\n\n lt_i64(): any {\n return this.emit(OpCodes.i64_lt_s);\n }\n\n lt_i64_u(): any {\n return this.emit(OpCodes.i64_lt_u);\n }\n\n gt_i64(): any {\n return this.emit(OpCodes.i64_gt_s);\n }\n\n gt_i64_u(): any {\n return this.emit(OpCodes.i64_gt_u);\n }\n\n le_i64(): any {\n return this.emit(OpCodes.i64_le_s);\n }\n\n le_i64_u(): any {\n return this.emit(OpCodes.i64_le_u);\n }\n\n ge_i64(): any {\n return this.emit(OpCodes.i64_ge_s);\n }\n\n ge_i64_u(): any {\n return this.emit(OpCodes.i64_ge_u);\n }\n\n eq_f32(): any {\n return this.emit(OpCodes.f32_eq);\n }\n\n ne_f32(): any {\n return this.emit(OpCodes.f32_ne);\n }\n\n lt_f32(): any {\n return this.emit(OpCodes.f32_lt);\n }\n\n gt_f32(): any {\n return this.emit(OpCodes.f32_gt);\n }\n\n le_f32(): any {\n return this.emit(OpCodes.f32_le);\n }\n\n ge_f32(): any {\n return this.emit(OpCodes.f32_ge);\n }\n\n eq_f64(): any {\n return this.emit(OpCodes.f64_eq);\n }\n\n ne_f64(): any {\n return this.emit(OpCodes.f64_ne);\n }\n\n lt_f64(): any {\n return this.emit(OpCodes.f64_lt);\n }\n\n gt_f64(): any {\n return this.emit(OpCodes.f64_gt);\n }\n\n le_f64(): any {\n return this.emit(OpCodes.f64_le);\n }\n\n ge_f64(): any {\n return this.emit(OpCodes.f64_ge);\n }\n\n clz_i32(): any {\n return this.emit(OpCodes.i32_clz);\n }\n\n ctz_i32(): any {\n return this.emit(OpCodes.i32_ctz);\n }\n\n popcnt_i32(): any {\n return this.emit(OpCodes.i32_popcnt);\n }\n\n add_i32(): any {\n return this.emit(OpCodes.i32_add);\n }\n\n sub_i32(): any {\n return this.emit(OpCodes.i32_sub);\n }\n\n mul_i32(): any {\n return this.emit(OpCodes.i32_mul);\n }\n\n div_i32(): any {\n return this.emit(OpCodes.i32_div_s);\n }\n\n div_i32_u(): any {\n return this.emit(OpCodes.i32_div_u);\n }\n\n rem_i32(): any {\n return this.emit(OpCodes.i32_rem_s);\n }\n\n rem_i32_u(): any {\n return this.emit(OpCodes.i32_rem_u);\n }\n\n and_i32(): any {\n return this.emit(OpCodes.i32_and);\n }\n\n or_i32(): any {\n return this.emit(OpCodes.i32_or);\n }\n\n xor_i32(): any {\n return this.emit(OpCodes.i32_xor);\n }\n\n shl_i32(): any {\n return this.emit(OpCodes.i32_shl);\n }\n\n shr_i32(): any {\n return this.emit(OpCodes.i32_shr_s);\n }\n\n shr_i32_u(): any {\n return this.emit(OpCodes.i32_shr_u);\n }\n\n rotl_i32(): any {\n return this.emit(OpCodes.i32_rotl);\n }\n\n rotr_i32(): any {\n return this.emit(OpCodes.i32_rotr);\n }\n\n clz_i64(): any {\n return this.emit(OpCodes.i64_clz);\n }\n\n ctz_i64(): any {\n return this.emit(OpCodes.i64_ctz);\n }\n\n popcnt_i64(): any {\n return this.emit(OpCodes.i64_popcnt);\n }\n\n add_i64(): any {\n return this.emit(OpCodes.i64_add);\n }\n\n sub_i64(): any {\n return this.emit(OpCodes.i64_sub);\n }\n\n mul_i64(): any {\n return this.emit(OpCodes.i64_mul);\n }\n\n div_i64(): any {\n return this.emit(OpCodes.i64_div_s);\n }\n\n div_i64_u(): any {\n return this.emit(OpCodes.i64_div_u);\n }\n\n rem_i64(): any {\n return this.emit(OpCodes.i64_rem_s);\n }\n\n rem_i64_u(): any {\n return this.emit(OpCodes.i64_rem_u);\n }\n\n and_i64(): any {\n return this.emit(OpCodes.i64_and);\n }\n\n or_i64(): any {\n return this.emit(OpCodes.i64_or);\n }\n\n xor_i64(): any {\n return this.emit(OpCodes.i64_xor);\n }\n\n shl_i64(): any {\n return this.emit(OpCodes.i64_shl);\n }\n\n shr_i64(): any {\n return this.emit(OpCodes.i64_shr_s);\n }\n\n shr_i64_u(): any {\n return this.emit(OpCodes.i64_shr_u);\n }\n\n rotl_i64(): any {\n return this.emit(OpCodes.i64_rotl);\n }\n\n rotr_i64(): any {\n return this.emit(OpCodes.i64_rotr);\n }\n\n abs_f32(): any {\n return this.emit(OpCodes.f32_abs);\n }\n\n neg_f32(): any {\n return this.emit(OpCodes.f32_neg);\n }\n\n ceil_f32(): any {\n return this.emit(OpCodes.f32_ceil);\n }\n\n floor_f32(): any {\n return this.emit(OpCodes.f32_floor);\n }\n\n trunc_f32(): any {\n return this.emit(OpCodes.f32_trunc);\n }\n\n nearest_f32(): any {\n return this.emit(OpCodes.f32_nearest);\n }\n\n sqrt_f32(): any {\n return this.emit(OpCodes.f32_sqrt);\n }\n\n add_f32(): any {\n return this.emit(OpCodes.f32_add);\n }\n\n sub_f32(): any {\n return this.emit(OpCodes.f32_sub);\n }\n\n mul_f32(): any {\n return this.emit(OpCodes.f32_mul);\n }\n\n div_f32(): any {\n return this.emit(OpCodes.f32_div);\n }\n\n min_f32(): any {\n return this.emit(OpCodes.f32_min);\n }\n\n max_f32(): any {\n return this.emit(OpCodes.f32_max);\n }\n\n copysign_f32(): any {\n return this.emit(OpCodes.f32_copysign);\n }\n\n abs_f64(): any {\n return this.emit(OpCodes.f64_abs);\n }\n\n neg_f64(): any {\n return this.emit(OpCodes.f64_neg);\n }\n\n ceil_f64(): any {\n return this.emit(OpCodes.f64_ceil);\n }\n\n floor_f64(): any {\n return this.emit(OpCodes.f64_floor);\n }\n\n trunc_f64(): any {\n return this.emit(OpCodes.f64_trunc);\n }\n\n nearest_f64(): any {\n return this.emit(OpCodes.f64_nearest);\n }\n\n sqrt_f64(): any {\n return this.emit(OpCodes.f64_sqrt);\n }\n\n add_f64(): any {\n return this.emit(OpCodes.f64_add);\n }\n\n sub_f64(): any {\n return this.emit(OpCodes.f64_sub);\n }\n\n mul_f64(): any {\n return this.emit(OpCodes.f64_mul);\n }\n\n div_f64(): any {\n return this.emit(OpCodes.f64_div);\n }\n\n min_f64(): any {\n return this.emit(OpCodes.f64_min);\n }\n\n max_f64(): any {\n return this.emit(OpCodes.f64_max);\n }\n\n copysign_f64(): any {\n return this.emit(OpCodes.f64_copysign);\n }\n\n wrap_i64_i32(): any {\n return this.emit(OpCodes.i32_wrap_i64);\n }\n\n trunc_f32_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_f32_s);\n }\n\n trunc_f32_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_f32_u);\n }\n\n trunc_f64_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_f64_s);\n }\n\n trunc_f64_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_f64_u);\n }\n\n extend_i32_s_i64(): any {\n return this.emit(OpCodes.i64_extend_i32_s);\n }\n\n extend_i32_u_i64(): any {\n return this.emit(OpCodes.i64_extend_i32_u);\n }\n\n trunc_f32_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_f32_s);\n }\n\n trunc_f32_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_f32_u);\n }\n\n trunc_f64_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_f64_s);\n }\n\n trunc_f64_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_f64_u);\n }\n\n convert_i32_s_f32(): any {\n return this.emit(OpCodes.f32_convert_i32_s);\n }\n\n convert_i32_u_f32(): any {\n return this.emit(OpCodes.f32_convert_i32_u);\n }\n\n convert_i64_s_f32(): any {\n return this.emit(OpCodes.f32_convert_i64_s);\n }\n\n convert_i64_u_f32(): any {\n return this.emit(OpCodes.f32_convert_i64_u);\n }\n\n demote_f64_f32(): any {\n return this.emit(OpCodes.f32_demote_f64);\n }\n\n convert_i32_s_f64(): any {\n return this.emit(OpCodes.f64_convert_i32_s);\n }\n\n convert_i32_u_f64(): any {\n return this.emit(OpCodes.f64_convert_i32_u);\n }\n\n convert_i64_s_f64(): any {\n return this.emit(OpCodes.f64_convert_i64_s);\n }\n\n convert_i64_u_f64(): any {\n return this.emit(OpCodes.f64_convert_i64_u);\n }\n\n promote_f32_f64(): any {\n return this.emit(OpCodes.f64_promote_f32);\n }\n\n reinterpret_f32_i32(): any {\n return this.emit(OpCodes.i32_reinterpret_f32);\n }\n\n reinterpret_f64_i64(): any {\n return this.emit(OpCodes.i64_reinterpret_f64);\n }\n\n reinterpret_i32_f32(): any {\n return this.emit(OpCodes.f32_reinterpret_i32);\n }\n\n reinterpret_i64_f64(): any {\n return this.emit(OpCodes.f64_reinterpret_i64);\n }\n\n extend8_s_i32(): any {\n return this.emit(OpCodes.i32_extend8_s);\n }\n\n extend16_s_i32(): any {\n return this.emit(OpCodes.i32_extend16_s);\n }\n\n extend8_s_i64(): any {\n return this.emit(OpCodes.i64_extend8_s);\n }\n\n extend16_s_i64(): any {\n return this.emit(OpCodes.i64_extend16_s);\n }\n\n extend32_s_i64(): any {\n return this.emit(OpCodes.i64_extend32_s);\n }\n\n trunc_sat_f32_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f32_s);\n }\n\n trunc_sat_f32_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f32_u);\n }\n\n trunc_sat_f64_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f64_s);\n }\n\n trunc_sat_f64_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f64_u);\n }\n\n trunc_sat_f32_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f32_s);\n }\n\n trunc_sat_f32_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f32_u);\n }\n\n trunc_sat_f64_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f64_s);\n }\n\n trunc_sat_f64_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f64_u);\n }\n\n memory_init(alignment: number, offset: number): any {\n return this.emit(OpCodes.memory_init, alignment, offset);\n }\n\n data_drop(varUInt32: number): any {\n return this.emit(OpCodes.data_drop, varUInt32);\n }\n\n memory_copy(alignment: number, offset: number): any {\n return this.emit(OpCodes.memory_copy, alignment, offset);\n }\n\n memory_fill(varUInt1: number): any {\n return this.emit(OpCodes.memory_fill, varUInt1);\n }\n\n table_init(alignment: number, offset: number): any {\n return this.emit(OpCodes.table_init, alignment, offset);\n }\n\n elem_drop(varUInt32: number): any {\n return this.emit(OpCodes.elem_drop, varUInt32);\n }\n\n table_copy(alignment: number, offset: number): any {\n return this.emit(OpCodes.table_copy, alignment, offset);\n }\n\n table_grow(varUInt32: number): any {\n return this.emit(OpCodes.table_grow, varUInt32);\n }\n\n table_size(varUInt32: number): any {\n return this.emit(OpCodes.table_size, varUInt32);\n }\n\n table_fill(varUInt32: number): any {\n return this.emit(OpCodes.table_fill, varUInt32);\n }\n\n ref_null(varUInt32: number): any {\n return this.emit(OpCodes.ref_null, varUInt32);\n }\n\n ref_is_null(): any {\n return this.emit(OpCodes.ref_is_null);\n }\n\n ref_func(functionBuilder: any): any {\n return this.emit(OpCodes.ref_func, functionBuilder);\n }\n\n table_get(varUInt32: number): any {\n return this.emit(OpCodes.table_get, varUInt32);\n }\n\n table_set(varUInt32: number): any {\n return this.emit(OpCodes.table_set, varUInt32);\n }\n\n load_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load, alignment, offset);\n }\n\n load8x8_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8x8_s, alignment, offset);\n }\n\n load8x8_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8x8_u, alignment, offset);\n }\n\n load16x4_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16x4_s, alignment, offset);\n }\n\n load16x4_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16x4_u, alignment, offset);\n }\n\n load32x2_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32x2_s, alignment, offset);\n }\n\n load32x2_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32x2_u, alignment, offset);\n }\n\n load8_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8_splat, alignment, offset);\n }\n\n load16_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16_splat, alignment, offset);\n }\n\n load32_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_splat, alignment, offset);\n }\n\n load64_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_splat, alignment, offset);\n }\n\n store_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store, alignment, offset);\n }\n\n const_v128(bytes: Uint8Array): any {\n return this.emit(OpCodes.v128_const, bytes);\n }\n\n shuffle_i8x16(mask: Uint8Array): any {\n return this.emit(OpCodes.i8x16_shuffle, mask);\n }\n\n swizzle_i8x16(): any {\n return this.emit(OpCodes.i8x16_swizzle);\n }\n\n splat_i8x16(): any {\n return this.emit(OpCodes.i8x16_splat);\n }\n\n splat_i16x8(): any {\n return this.emit(OpCodes.i16x8_splat);\n }\n\n splat_i32x4(): any {\n return this.emit(OpCodes.i32x4_splat);\n }\n\n splat_i64x2(): any {\n return this.emit(OpCodes.i64x2_splat);\n }\n\n splat_f32x4(): any {\n return this.emit(OpCodes.f32x4_splat);\n }\n\n splat_f64x2(): any {\n return this.emit(OpCodes.f64x2_splat);\n }\n\n extract_lane_s_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_extract_lane_s, laneIndex);\n }\n\n extract_lane_u_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_extract_lane_u, laneIndex);\n }\n\n replace_lane_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_replace_lane, laneIndex);\n }\n\n extract_lane_s_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_extract_lane_s, laneIndex);\n }\n\n extract_lane_u_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_extract_lane_u, laneIndex);\n }\n\n replace_lane_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_replace_lane, laneIndex);\n }\n\n extract_lane_i32x4(laneIndex: number): any {\n return this.emit(OpCodes.i32x4_extract_lane, laneIndex);\n }\n\n replace_lane_i32x4(laneIndex: number): any {\n return this.emit(OpCodes.i32x4_replace_lane, laneIndex);\n }\n\n extract_lane_i64x2(laneIndex: number): any {\n return this.emit(OpCodes.i64x2_extract_lane, laneIndex);\n }\n\n replace_lane_i64x2(laneIndex: number): any {\n return this.emit(OpCodes.i64x2_replace_lane, laneIndex);\n }\n\n extract_lane_f32x4(laneIndex: number): any {\n return this.emit(OpCodes.f32x4_extract_lane, laneIndex);\n }\n\n replace_lane_f32x4(laneIndex: number): any {\n return this.emit(OpCodes.f32x4_replace_lane, laneIndex);\n }\n\n extract_lane_f64x2(laneIndex: number): any {\n return this.emit(OpCodes.f64x2_extract_lane, laneIndex);\n }\n\n replace_lane_f64x2(laneIndex: number): any {\n return this.emit(OpCodes.f64x2_replace_lane, laneIndex);\n }\n\n eq_i8x16(): any {\n return this.emit(OpCodes.i8x16_eq);\n }\n\n ne_i8x16(): any {\n return this.emit(OpCodes.i8x16_ne);\n }\n\n lt_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_lt_s);\n }\n\n lt_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_lt_u);\n }\n\n gt_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_gt_s);\n }\n\n gt_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_gt_u);\n }\n\n le_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_le_s);\n }\n\n le_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_le_u);\n }\n\n ge_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_ge_s);\n }\n\n ge_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_ge_u);\n }\n\n eq_i16x8(): any {\n return this.emit(OpCodes.i16x8_eq);\n }\n\n ne_i16x8(): any {\n return this.emit(OpCodes.i16x8_ne);\n }\n\n lt_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_lt_s);\n }\n\n lt_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_lt_u);\n }\n\n gt_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_gt_s);\n }\n\n gt_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_gt_u);\n }\n\n le_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_le_s);\n }\n\n le_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_le_u);\n }\n\n ge_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_ge_s);\n }\n\n ge_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_ge_u);\n }\n\n eq_i32x4(): any {\n return this.emit(OpCodes.i32x4_eq);\n }\n\n ne_i32x4(): any {\n return this.emit(OpCodes.i32x4_ne);\n }\n\n lt_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_lt_s);\n }\n\n lt_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_lt_u);\n }\n\n gt_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_gt_s);\n }\n\n gt_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_gt_u);\n }\n\n le_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_le_s);\n }\n\n le_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_le_u);\n }\n\n ge_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_ge_s);\n }\n\n ge_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_ge_u);\n }\n\n eq_f32x4(): any {\n return this.emit(OpCodes.f32x4_eq);\n }\n\n ne_f32x4(): any {\n return this.emit(OpCodes.f32x4_ne);\n }\n\n lt_f32x4(): any {\n return this.emit(OpCodes.f32x4_lt);\n }\n\n gt_f32x4(): any {\n return this.emit(OpCodes.f32x4_gt);\n }\n\n le_f32x4(): any {\n return this.emit(OpCodes.f32x4_le);\n }\n\n ge_f32x4(): any {\n return this.emit(OpCodes.f32x4_ge);\n }\n\n eq_f64x2(): any {\n return this.emit(OpCodes.f64x2_eq);\n }\n\n ne_f64x2(): any {\n return this.emit(OpCodes.f64x2_ne);\n }\n\n lt_f64x2(): any {\n return this.emit(OpCodes.f64x2_lt);\n }\n\n gt_f64x2(): any {\n return this.emit(OpCodes.f64x2_gt);\n }\n\n le_f64x2(): any {\n return this.emit(OpCodes.f64x2_le);\n }\n\n ge_f64x2(): any {\n return this.emit(OpCodes.f64x2_ge);\n }\n\n not_v128(): any {\n return this.emit(OpCodes.v128_not);\n }\n\n and_v128(): any {\n return this.emit(OpCodes.v128_and);\n }\n\n andnot_v128(): any {\n return this.emit(OpCodes.v128_andnot);\n }\n\n or_v128(): any {\n return this.emit(OpCodes.v128_or);\n }\n\n xor_v128(): any {\n return this.emit(OpCodes.v128_xor);\n }\n\n bitselect_v128(): any {\n return this.emit(OpCodes.v128_bitselect);\n }\n\n any_true_v128(): any {\n return this.emit(OpCodes.v128_any_true);\n }\n\n load8_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8_lane, alignment, offset);\n }\n\n load16_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16_lane, alignment, offset);\n }\n\n load32_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_lane, alignment, offset);\n }\n\n load64_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_lane, alignment, offset);\n }\n\n store8_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store8_lane, alignment, offset);\n }\n\n store16_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store16_lane, alignment, offset);\n }\n\n store32_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store32_lane, alignment, offset);\n }\n\n store64_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store64_lane, alignment, offset);\n }\n\n load32_zero_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_zero, alignment, offset);\n }\n\n load64_zero_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_zero, alignment, offset);\n }\n\n trunc_sat_f32x4_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f32x4_s);\n }\n\n trunc_sat_f32x4_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f32x4_u);\n }\n\n abs_i8x16(): any {\n return this.emit(OpCodes.i8x16_abs);\n }\n\n neg_i8x16(): any {\n return this.emit(OpCodes.i8x16_neg);\n }\n\n popcnt_i8x16(): any {\n return this.emit(OpCodes.i8x16_popcnt);\n }\n\n all_true_i8x16(): any {\n return this.emit(OpCodes.i8x16_all_true);\n }\n\n bitmask_i8x16(): any {\n return this.emit(OpCodes.i8x16_bitmask);\n }\n\n narrow_i16x8_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_narrow_i16x8_s);\n }\n\n narrow_i16x8_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_narrow_i16x8_u);\n }\n\n ceil_f32x4(): any {\n return this.emit(OpCodes.f32x4_ceil);\n }\n\n floor_f32x4(): any {\n return this.emit(OpCodes.f32x4_floor);\n }\n\n trunc_f32x4(): any {\n return this.emit(OpCodes.f32x4_trunc);\n }\n\n nearest_f32x4(): any {\n return this.emit(OpCodes.f32x4_nearest);\n }\n\n shl_i8x16(): any {\n return this.emit(OpCodes.i8x16_shl);\n }\n\n shr_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_shr_s);\n }\n\n shr_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_shr_u);\n }\n\n add_i8x16(): any {\n return this.emit(OpCodes.i8x16_add);\n }\n\n add_sat_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_add_sat_s);\n }\n\n add_sat_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_add_sat_u);\n }\n\n sub_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub);\n }\n\n sub_sat_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub_sat_s);\n }\n\n sub_sat_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub_sat_u);\n }\n\n ceil_f64x2(): any {\n return this.emit(OpCodes.f64x2_ceil);\n }\n\n floor_f64x2(): any {\n return this.emit(OpCodes.f64x2_floor);\n }\n\n min_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_min_s);\n }\n\n min_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_min_u);\n }\n\n max_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_max_s);\n }\n\n max_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_max_u);\n }\n\n trunc_f64x2(): any {\n return this.emit(OpCodes.f64x2_trunc);\n }\n\n avgr_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_avgr_u);\n }\n\n extadd_pairwise_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extadd_pairwise_i8x16_s);\n }\n\n extadd_pairwise_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extadd_pairwise_i8x16_u);\n }\n\n extadd_pairwise_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extadd_pairwise_i16x8_s);\n }\n\n extadd_pairwise_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extadd_pairwise_i16x8_u);\n }\n\n abs_i16x8(): any {\n return this.emit(OpCodes.i16x8_abs);\n }\n\n neg_i16x8(): any {\n return this.emit(OpCodes.i16x8_neg);\n }\n\n q15mulr_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_q15mulr_sat_s);\n }\n\n all_true_i16x8(): any {\n return this.emit(OpCodes.i16x8_all_true);\n }\n\n bitmask_i16x8(): any {\n return this.emit(OpCodes.i16x8_bitmask);\n }\n\n narrow_i32x4_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_narrow_i32x4_s);\n }\n\n narrow_i32x4_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_narrow_i32x4_u);\n }\n\n extend_low_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_low_i8x16_s);\n }\n\n extend_high_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_high_i8x16_s);\n }\n\n extend_low_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_low_i8x16_u);\n }\n\n extend_high_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_high_i8x16_u);\n }\n\n shl_i16x8(): any {\n return this.emit(OpCodes.i16x8_shl);\n }\n\n shr_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_shr_s);\n }\n\n shr_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_shr_u);\n }\n\n add_i16x8(): any {\n return this.emit(OpCodes.i16x8_add);\n }\n\n add_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_add_sat_s);\n }\n\n add_sat_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_add_sat_u);\n }\n\n sub_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub);\n }\n\n sub_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub_sat_s);\n }\n\n sub_sat_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub_sat_u);\n }\n\n nearest_f64x2(): any {\n return this.emit(OpCodes.f64x2_nearest);\n }\n\n mul_i16x8(): any {\n return this.emit(OpCodes.i16x8_mul);\n }\n\n min_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_min_s);\n }\n\n min_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_min_u);\n }\n\n max_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_max_s);\n }\n\n max_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_max_u);\n }\n\n avgr_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_avgr_u);\n }\n\n extmul_low_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_low_i8x16_s);\n }\n\n extmul_high_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_high_i8x16_s);\n }\n\n extmul_low_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_low_i8x16_u);\n }\n\n extmul_high_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_high_i8x16_u);\n }\n\n abs_i32x4(): any {\n return this.emit(OpCodes.i32x4_abs);\n }\n\n neg_i32x4(): any {\n return this.emit(OpCodes.i32x4_neg);\n }\n\n all_true_i32x4(): any {\n return this.emit(OpCodes.i32x4_all_true);\n }\n\n bitmask_i32x4(): any {\n return this.emit(OpCodes.i32x4_bitmask);\n }\n\n extend_low_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_low_i16x8_s);\n }\n\n extend_high_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_high_i16x8_s);\n }\n\n extend_low_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_low_i16x8_u);\n }\n\n extend_high_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_high_i16x8_u);\n }\n\n shl_i32x4(): any {\n return this.emit(OpCodes.i32x4_shl);\n }\n\n shr_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_shr_s);\n }\n\n shr_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_shr_u);\n }\n\n add_i32x4(): any {\n return this.emit(OpCodes.i32x4_add);\n }\n\n convert_i32x4_s_f32x4(): any {\n return this.emit(OpCodes.f32x4_convert_i32x4_s);\n }\n\n convert_i32x4_u_f32x4(): any {\n return this.emit(OpCodes.f32x4_convert_i32x4_u);\n }\n\n sub_i32x4(): any {\n return this.emit(OpCodes.i32x4_sub);\n }\n\n mul_i32x4(): any {\n return this.emit(OpCodes.i32x4_mul);\n }\n\n min_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_min_s);\n }\n\n min_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_min_u);\n }\n\n max_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_max_s);\n }\n\n max_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_max_u);\n }\n\n dot_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_dot_i16x8_s);\n }\n\n extmul_low_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_low_i16x8_s);\n }\n\n extmul_high_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_high_i16x8_s);\n }\n\n extmul_low_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_low_i16x8_u);\n }\n\n extmul_high_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_high_i16x8_u);\n }\n\n abs_i64x2(): any {\n return this.emit(OpCodes.i64x2_abs);\n }\n\n neg_i64x2(): any {\n return this.emit(OpCodes.i64x2_neg);\n }\n\n all_true_i64x2(): any {\n return this.emit(OpCodes.i64x2_all_true);\n }\n\n bitmask_i64x2(): any {\n return this.emit(OpCodes.i64x2_bitmask);\n }\n\n extend_low_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_low_i32x4_s);\n }\n\n extend_high_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_high_i32x4_s);\n }\n\n extend_low_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_low_i32x4_u);\n }\n\n extend_high_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_high_i32x4_u);\n }\n\n shl_i64x2(): any {\n return this.emit(OpCodes.i64x2_shl);\n }\n\n shr_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_shr_s);\n }\n\n shr_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_shr_u);\n }\n\n add_i64x2(): any {\n return this.emit(OpCodes.i64x2_add);\n }\n\n sub_i64x2(): any {\n return this.emit(OpCodes.i64x2_sub);\n }\n\n mul_i64x2(): any {\n return this.emit(OpCodes.i64x2_mul);\n }\n\n eq_i64x2(): any {\n return this.emit(OpCodes.i64x2_eq);\n }\n\n ne_i64x2(): any {\n return this.emit(OpCodes.i64x2_ne);\n }\n\n lt_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_lt_s);\n }\n\n gt_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_gt_s);\n }\n\n le_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_le_s);\n }\n\n ge_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_ge_s);\n }\n\n extmul_low_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_low_i32x4_s);\n }\n\n extmul_high_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_high_i32x4_s);\n }\n\n extmul_low_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_low_i32x4_u);\n }\n\n extmul_high_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_high_i32x4_u);\n }\n\n abs_f32x4(): any {\n return this.emit(OpCodes.f32x4_abs);\n }\n\n neg_f32x4(): any {\n return this.emit(OpCodes.f32x4_neg);\n }\n\n sqrt_f32x4(): any {\n return this.emit(OpCodes.f32x4_sqrt);\n }\n\n add_f32x4(): any {\n return this.emit(OpCodes.f32x4_add);\n }\n\n sub_f32x4(): any {\n return this.emit(OpCodes.f32x4_sub);\n }\n\n mul_f32x4(): any {\n return this.emit(OpCodes.f32x4_mul);\n }\n\n div_f32x4(): any {\n return this.emit(OpCodes.f32x4_div);\n }\n\n min_f32x4(): any {\n return this.emit(OpCodes.f32x4_min);\n }\n\n max_f32x4(): any {\n return this.emit(OpCodes.f32x4_max);\n }\n\n pmin_f32x4(): any {\n return this.emit(OpCodes.f32x4_pmin);\n }\n\n pmax_f32x4(): any {\n return this.emit(OpCodes.f32x4_pmax);\n }\n\n abs_f64x2(): any {\n return this.emit(OpCodes.f64x2_abs);\n }\n\n neg_f64x2(): any {\n return this.emit(OpCodes.f64x2_neg);\n }\n\n sqrt_f64x2(): any {\n return this.emit(OpCodes.f64x2_sqrt);\n }\n\n add_f64x2(): any {\n return this.emit(OpCodes.f64x2_add);\n }\n\n sub_f64x2(): any {\n return this.emit(OpCodes.f64x2_sub);\n }\n\n mul_f64x2(): any {\n return this.emit(OpCodes.f64x2_mul);\n }\n\n div_f64x2(): any {\n return this.emit(OpCodes.f64x2_div);\n }\n\n min_f64x2(): any {\n return this.emit(OpCodes.f64x2_min);\n }\n\n max_f64x2(): any {\n return this.emit(OpCodes.f64x2_max);\n }\n\n pmin_f64x2(): any {\n return this.emit(OpCodes.f64x2_pmin);\n }\n\n pmax_f64x2(): any {\n return this.emit(OpCodes.f64x2_pmax);\n }\n\n trunc_sat_f64x2_s_zero_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f64x2_s_zero);\n }\n\n trunc_sat_f64x2_u_zero_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f64x2_u_zero);\n }\n\n convert_low_i32x4_s_f64x2(): any {\n return this.emit(OpCodes.f64x2_convert_low_i32x4_s);\n }\n\n convert_low_i32x4_u_f64x2(): any {\n return this.emit(OpCodes.f64x2_convert_low_i32x4_u);\n }\n\n demote_f64x2_zero_f32x4(): any {\n return this.emit(OpCodes.f32x4_demote_f64x2_zero);\n }\n\n promote_low_f32x4_f64x2(): any {\n return this.emit(OpCodes.f64x2_promote_low_f32x4);\n }\n\n abstract emit(opCode: any, ...args: any[]): any;\n}\n", "import { BlockTypeDescriptor } from '../types';\r\nimport OperandStack from './OperandStack';\r\n\r\nexport default class ControlFlowBlock {\r\n stack: OperandStack;\r\n blockType: BlockTypeDescriptor;\r\n parent: ControlFlowBlock | null;\r\n index: number;\r\n depth: number;\r\n childrenCount: number;\r\n isLoop: boolean;\r\n\r\n constructor(\r\n stack: OperandStack,\r\n blockType: BlockTypeDescriptor,\r\n parent: ControlFlowBlock | null,\r\n index: number,\r\n depth: number,\r\n childrenCount: number,\r\n isLoop: boolean = false\r\n ) {\r\n this.stack = stack;\r\n this.blockType = blockType;\r\n this.parent = parent;\r\n this.index = index;\r\n this.depth = depth;\r\n this.childrenCount = childrenCount;\r\n this.isLoop = isLoop;\r\n }\r\n\r\n canReference(block: ControlFlowBlock): boolean {\r\n if (this.depth > block.depth) {\r\n return false;\r\n }\r\n\r\n let potentialMatch: ControlFlowBlock = block;\r\n for (let index = 0; index < block.depth - this.depth; index++) {\r\n potentialMatch = potentialMatch.parent!;\r\n }\r\n\r\n return potentialMatch === this;\r\n }\r\n\r\n findParent(other: ControlFlowBlock): ControlFlowBlock | null {\r\n let potentialParent: ControlFlowBlock;\r\n let potentialMatch: ControlFlowBlock;\r\n\r\n if (other.depth > this.depth) {\r\n potentialParent = this;\r\n potentialMatch = other;\r\n } else {\r\n potentialParent = other;\r\n potentialMatch = this;\r\n }\r\n\r\n for (let index = 0; index < Math.abs(potentialParent.depth - potentialMatch.depth); index++) {\r\n potentialMatch = potentialMatch.parent!;\r\n }\r\n\r\n return potentialParent === potentialMatch ? potentialParent : null;\r\n }\r\n}\r\n", "export default class VerificationError extends Error {\r\n constructor(message?: string) {\r\n super(message);\r\n this.name = 'VerificationError';\r\n }\r\n}\r\n", "import { BlockType, BlockTypeDescriptor } from '../types';\r\nimport ControlFlowBlock from './ControlFlowBlock';\r\nimport LabelBuilder from '../LabelBuilder';\r\nimport OperandStack from './OperandStack';\r\nimport VerificationError from './VerificationError';\r\n\r\nexport default class ControlFlowVerifier {\r\n _stack: LabelBuilder[] = [];\r\n _unresolvedLabels: LabelBuilder[] = [];\r\n _disableVerification: boolean;\r\n\r\n constructor(disableVerification: boolean) {\r\n this._disableVerification = disableVerification;\r\n }\r\n\r\n get size(): number {\r\n return this._stack.length;\r\n }\r\n\r\n push(\r\n operandStack: OperandStack,\r\n blockType: BlockTypeDescriptor,\r\n label: LabelBuilder | null = null,\r\n isLoop: boolean = false\r\n ): LabelBuilder {\r\n const current = this.peek();\r\n if (label) {\r\n if (!this._disableVerification && label.isResolved) {\r\n throw new VerificationError(\r\n 'Cannot use a label that has already been associated with another block.'\r\n );\r\n }\r\n\r\n const labelIndex = this._unresolvedLabels.findIndex((x) => x === label);\r\n if (labelIndex === -1) {\r\n throw new VerificationError('The label was not created for this function.');\r\n }\r\n\r\n if (\r\n !this._disableVerification &&\r\n label.block &&\r\n current &&\r\n !current.block!.canReference(label.block)\r\n ) {\r\n throw new VerificationError(\r\n 'Label has been referenced by an instruction in an enclosing block that ' +\r\n 'cannot branch to the current enclosing block.'\r\n );\r\n }\r\n\r\n this._unresolvedLabels.splice(labelIndex, 1);\r\n } else {\r\n label = new LabelBuilder();\r\n }\r\n\r\n const block = !current\r\n ? new ControlFlowBlock(operandStack, BlockType.Void, null, 0, 0, 0)\r\n : new ControlFlowBlock(\r\n operandStack,\r\n blockType,\r\n current.block!,\r\n current.block!.childrenCount++,\r\n current.block!.depth + 1,\r\n 0,\r\n isLoop\r\n );\r\n\r\n label.resolve(block);\r\n this._stack.push(label);\r\n return label;\r\n }\r\n\r\n pop(): void {\r\n if (this._stack.length === 0) {\r\n throw new VerificationError('Cannot end the block, the stack is empty.');\r\n }\r\n this._stack.pop();\r\n }\r\n\r\n peek(): LabelBuilder | null {\r\n return this._stack.length === 0 ? null : this._stack[this._stack.length - 1];\r\n }\r\n\r\n defineLabel(): LabelBuilder {\r\n const label = new LabelBuilder();\r\n this._unresolvedLabels.push(label);\r\n return label;\r\n }\r\n\r\n reference(label: LabelBuilder): void {\r\n if (this._disableVerification) {\r\n return;\r\n }\r\n\r\n const current = this.peek();\r\n if (label.isResolved) {\r\n if (!current || !label.block!.canReference(current.block!)) {\r\n throw new VerificationError(\r\n 'The label cannot be referenced by the current enclosing block.'\r\n );\r\n }\r\n } else {\r\n if (!this._unresolvedLabels.find((x) => x === label)) {\r\n throw new VerificationError('The label was not created for this function.');\r\n }\r\n\r\n if (!label.block) {\r\n throw new VerificationError('Label has not been associated with any block.');\r\n }\r\n\r\n const potentialParent = label.block.findParent(current!.block!);\r\n if (!potentialParent) {\r\n throw new VerificationError('The reference to this label is invalid.');\r\n }\r\n\r\n label.reference(potentialParent);\r\n }\r\n }\r\n\r\n verify(): void {\r\n if (this._disableVerification) {\r\n return;\r\n }\r\n\r\n if (this._unresolvedLabels.some((x) => x.block)) {\r\n throw new VerificationError('The function contains unresolved labels.');\r\n }\r\n\r\n if (this._stack.length === 1) {\r\n throw new VerificationError('Function is missing closing end instruction.');\r\n } else if (this._stack.length !== 0) {\r\n throw new VerificationError(\r\n `Function has ${this._stack.length} control structures ` +\r\n 'that are not closed. Every block, if, and loop must have a corresponding end instruction.'\r\n );\r\n }\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from '../types';\r\n\r\nexport default class OperandStack {\r\n static Empty: OperandStack = (() => {\r\n const operandStack = Object.create(OperandStack.prototype) as OperandStack;\r\n operandStack._valueType = null!;\r\n operandStack._previous = null;\r\n operandStack._length = 0;\r\n return operandStack;\r\n })();\r\n\r\n _previous: OperandStack | null;\r\n _length: number;\r\n _valueType: ValueTypeDescriptor;\r\n\r\n constructor(valueType: ValueTypeDescriptor, previous: OperandStack | null = null) {\r\n this._valueType = valueType;\r\n this._previous = previous;\r\n this._length = this._previous ? this._previous._length + 1 : 1;\r\n }\r\n\r\n get length(): number {\r\n return this._length;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n if (this.isEmpty) {\r\n throw new Error('The stack is empty.');\r\n }\r\n return this._valueType;\r\n }\r\n\r\n get isEmpty(): boolean {\r\n return this._length === 0;\r\n }\r\n\r\n push(valueType: ValueTypeDescriptor): OperandStack {\r\n return new OperandStack(valueType, this);\r\n }\r\n\r\n pop(): OperandStack {\r\n if (this.isEmpty) {\r\n throw new Error('The stack is empty.');\r\n }\r\n return this._previous!;\r\n }\r\n\r\n peek(): OperandStack | null {\r\n return this._previous;\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FuncTypeSignature {\r\n static empty = new FuncTypeSignature([], []);\r\n\r\n returnTypes: ValueTypeDescriptor[];\r\n parameterTypes: ValueTypeDescriptor[];\r\n\r\n constructor(returnTypes: ValueTypeDescriptor[], parameterTypes: ValueTypeDescriptor[]) {\r\n this.returnTypes = returnTypes;\r\n this.parameterTypes = parameterTypes;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { TypeForm, ValueTypeDescriptor } from './types';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\n\r\nexport default class FuncTypeBuilder {\r\n key: string;\r\n index: number;\r\n returnTypes: ValueTypeDescriptor[];\r\n parameterTypes: ValueTypeDescriptor[];\r\n\r\n constructor(\r\n key: string,\r\n returnTypes: ValueTypeDescriptor[],\r\n parameterTypes: ValueTypeDescriptor[],\r\n index: number\r\n ) {\r\n this.key = key;\r\n this.returnTypes = returnTypes;\r\n this.parameterTypes = parameterTypes;\r\n this.index = index;\r\n }\r\n\r\n get typeForm() {\r\n return TypeForm.Func;\r\n }\r\n\r\n static createKey(returnTypes: ValueTypeDescriptor[], parameterTypes: ValueTypeDescriptor[]): string {\r\n let key = '(';\r\n returnTypes.forEach((x, i) => {\r\n key += x.short;\r\n if (i !== returnTypes.length - 1) {\r\n key += ', ';\r\n }\r\n });\r\n\r\n key += ')(';\r\n parameterTypes.forEach((x, i) => {\r\n key += x.short;\r\n if (i !== parameterTypes.length - 1) {\r\n key += ', ';\r\n }\r\n });\r\n\r\n key += ')';\r\n return key;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarInt7(TypeForm.Func.value);\r\n writer.writeVarUInt32(this.parameterTypes.length);\r\n this.parameterTypes.forEach((x) => {\r\n writer.writeVarInt7(x.value);\r\n });\r\n\r\n writer.writeVarUInt1(this.returnTypes.length);\r\n this.returnTypes.forEach((x) => {\r\n writer.writeVarInt7(x.value);\r\n });\r\n }\r\n\r\n toSignature(): FuncTypeSignature {\r\n return new FuncTypeSignature(this.returnTypes, this.parameterTypes);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import OperandStack from './OperandStack';\r\nimport OpCodes from '../OpCodes';\r\nimport { ValueType, BlockType, ImmediateType, ValueTypeDescriptor, BlockTypeDescriptor, OpCodeDef } from '../types';\r\nimport { OperandStackBehavior, OperandStackType, ControlFlowType } from './types';\r\nimport Immediate from '../Immediate';\r\nimport ControlFlowBlock from './ControlFlowBlock';\r\nimport type FunctionBuilder from '../FunctionBuilder';\r\nimport ImportBuilder from '../ImportBuilder';\r\nimport FuncTypeBuilder from '../FuncTypeBuilder';\r\nimport LocalBuilder from '../LocalBuilder';\r\nimport GlobalBuilder from '../GlobalBuilder';\r\nimport FunctionParameterBuilder from '../FunctionParameterBuilder';\r\nimport FuncTypeSignature from '../FuncTypeSignature';\r\nimport VerificationError from './VerificationError';\r\n\r\nexport default class OperandStackVerifier {\r\n _operandStack: OperandStack;\r\n _instructionCount: number;\r\n _funcType: FuncTypeSignature;\r\n\r\n constructor(funcType: FuncTypeSignature) {\r\n this._operandStack = OperandStack.Empty;\r\n this._instructionCount = 0;\r\n this._funcType = funcType;\r\n }\r\n\r\n get stack(): OperandStack {\r\n return this._operandStack;\r\n }\r\n\r\n verifyInstruction(\r\n controlBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null\r\n ): void {\r\n let modifiedStack = this._operandStack;\r\n if (opCode.stackBehavior !== OperandStackBehavior.None) {\r\n modifiedStack = this._verifyStack(controlBlock, opCode, immediate);\r\n }\r\n\r\n if (opCode.controlFlow === ControlFlowType.Pop) {\r\n this._verifyControlFlowPop(controlBlock, modifiedStack);\r\n } else if (opCode === (OpCodes as any).return) {\r\n modifiedStack = this._verifyReturnValues(modifiedStack, true);\r\n }\r\n\r\n if (immediate && immediate.type === ImmediateType.RelativeDepth) {\r\n this._verifyBranch(modifiedStack, immediate);\r\n }\r\n\r\n this._operandStack = modifiedStack;\r\n this._instructionCount++;\r\n }\r\n\r\n verifyElse(controlBlock: ControlFlowBlock): void {\r\n if (controlBlock.blockType !== BlockType.Void) {\r\n // Non-void if block: the true branch must have the result on stack\r\n if (this._operandStack.isEmpty) {\r\n throw new VerificationError(\r\n `else: expected ${(controlBlock.blockType as BlockTypeDescriptor).name} on the stack from the if-branch but the stack is empty.`\r\n );\r\n }\r\n const expectedType = controlBlock.blockType as ValueTypeDescriptor;\r\n if (this._operandStack.valueType !== expectedType) {\r\n throw new VerificationError(\r\n `else: expected ${expectedType.name} on the stack but found ${this._operandStack.valueType.name}.`\r\n );\r\n }\r\n const stackAfterPop = this._operandStack.pop();\r\n if (stackAfterPop !== controlBlock.stack) {\r\n throw new VerificationError(\r\n 'else: stack (minus result value) does not match the if-block entry stack.'\r\n );\r\n }\r\n } else {\r\n // Void if block: stack must match entry\r\n if (this._operandStack !== controlBlock.stack) {\r\n throw new VerificationError(\r\n 'else: stack does not match the if-block entry stack.'\r\n );\r\n }\r\n }\r\n // Reset stack for else branch\r\n this._operandStack = controlBlock.stack;\r\n }\r\n\r\n _verifyBranch(stack: OperandStack, immediate: Immediate): void {\r\n const targetBlock = immediate.values[0].block as ControlFlowBlock;\r\n const targetEntryStack = targetBlock.stack;\r\n\r\n if (targetBlock.isLoop) {\r\n // Branch to loop header: no result values needed, stack must match entry\r\n if (targetEntryStack !== stack) {\r\n throw new VerificationError(\r\n 'Branch to loop: stack does not match the loop entry stack.'\r\n );\r\n }\r\n return;\r\n }\r\n\r\n if (targetBlock.blockType !== BlockType.Void) {\r\n // Non-void block: branch must carry the result value\r\n if (stack.isEmpty) {\r\n throw new VerificationError(\r\n `Branch expects ${(targetBlock.blockType as BlockTypeDescriptor).name} on the stack but the stack is empty.`\r\n );\r\n }\r\n const expectedType = targetBlock.blockType as ValueTypeDescriptor;\r\n if (stack.valueType !== expectedType) {\r\n throw new VerificationError(\r\n `Branch expects ${expectedType.name} but found ${stack.valueType.name} on the stack.`\r\n );\r\n }\r\n stack = stack.pop();\r\n }\r\n\r\n if (targetEntryStack !== stack) {\r\n throw new VerificationError(\r\n 'Branch: stack does not match the target block entry stack.'\r\n );\r\n }\r\n }\r\n\r\n _verifyReturnValues(stack: OperandStack, pop: boolean = false): OperandStack {\r\n const remaining = this._getStackValueTypes(stack, stack.length);\r\n if (remaining.length !== this._funcType.returnTypes.length) {\r\n if (remaining.length === 0) {\r\n throw new VerificationError(\r\n `Function expected to return ${this._formatAndList(this._funcType.returnTypes, (x) => x.name)} ` +\r\n 'but stack is empty.'\r\n );\r\n } else if (this._funcType.returnTypes.length === 0) {\r\n throw new VerificationError(\r\n `Function does not have any return values but ${this._formatAndList(remaining, (x) => x.name)} ` +\r\n `was found on the stack.`\r\n );\r\n }\r\n\r\n throw new VerificationError(\r\n `Function return values do not match the items on the stack. ` +\r\n `Expected: ${this._formatAndList(this._funcType.returnTypes, (x) => x.name)} ` +\r\n `Found on stack: ${this._formatAndList(remaining, (x) => x.name)}.`\r\n );\r\n }\r\n\r\n let errorMessage = '';\r\n for (let index = 0; index < remaining.length; index++) {\r\n if (remaining[index] !== this._funcType.returnTypes[index]) {\r\n errorMessage =\r\n `A ${this._funcType.returnTypes[index]} was expected at ${remaining.length - index} ` +\r\n `but a ${remaining[index]} was found. `;\r\n }\r\n }\r\n\r\n if (errorMessage !== '') {\r\n throw new VerificationError('Error returning from function: ' + errorMessage);\r\n }\r\n\r\n if (pop) {\r\n for (let index = 0; index < remaining.length; index++) {\r\n stack = stack.pop();\r\n }\r\n }\r\n\r\n return stack;\r\n }\r\n\r\n _verifyControlFlowPop(controlBlock: ControlFlowBlock, stack: OperandStack): void {\r\n if (controlBlock.depth === 0) {\r\n this._verifyReturnValues(stack);\r\n } else {\r\n const expectedStack =\r\n controlBlock.blockType !== BlockType.Void ? stack.pop() : stack;\r\n if (controlBlock.stack !== expectedStack) {\r\n throw new VerificationError();\r\n }\r\n }\r\n }\r\n\r\n _verifyStack(\r\n controlFlowBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null\r\n ): OperandStack {\r\n let modifiedStack = this._operandStack;\r\n const funcType = this._getFuncType(opCode, immediate);\r\n\r\n if (\r\n opCode.stackBehavior === OperandStackBehavior.Pop ||\r\n opCode.stackBehavior === OperandStackBehavior.PopPush\r\n ) {\r\n modifiedStack = this._verifyStackPop(modifiedStack, opCode, funcType);\r\n }\r\n\r\n if (\r\n opCode.stackBehavior === OperandStackBehavior.Push ||\r\n opCode.stackBehavior === OperandStackBehavior.PopPush\r\n ) {\r\n modifiedStack = this._stackPush(\r\n modifiedStack,\r\n controlFlowBlock,\r\n opCode,\r\n immediate,\r\n funcType\r\n );\r\n }\r\n\r\n return modifiedStack;\r\n }\r\n\r\n _verifyStackPop(\r\n stack: OperandStack,\r\n opCode: OpCodeDef,\r\n funcType: FuncTypeBuilder | null\r\n ): OperandStack {\r\n if (funcType) {\r\n stack = funcType.parameterTypes.reduce((i, x) => {\r\n if (x !== i.valueType) {\r\n throw new VerificationError(\r\n `Unexpected type found on stack at offset ${this._instructionCount + 1}. ` +\r\n `A ${x} was expected but a ${i.valueType} was found.`\r\n );\r\n }\r\n return i.pop();\r\n }, stack);\r\n }\r\n\r\n stack = (opCode.popOperands || []).reduce((i, x) => {\r\n if (x === OperandStackType.Any) {\r\n return i.pop();\r\n }\r\n\r\n const valueType = (ValueType as any)[x] as ValueTypeDescriptor;\r\n if (valueType !== i.valueType) {\r\n throw new VerificationError(\r\n `Unexpected type found on stack at offset ${this._instructionCount + 1}. ` +\r\n `A ${valueType} was expected but a ${i.valueType} was found.`\r\n );\r\n }\r\n return i.pop();\r\n }, stack);\r\n\r\n return stack;\r\n }\r\n\r\n _stackPush(\r\n stack: OperandStack,\r\n controlBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n funcType: FuncTypeBuilder | null\r\n ): OperandStack {\r\n const stackStart = stack;\r\n if (funcType) {\r\n stack = funcType.returnTypes.reduce((i, x) => {\r\n return i.push(x);\r\n }, stack);\r\n }\r\n\r\n stack = (opCode.pushOperands || []).reduce((i, x) => {\r\n let valueType: ValueTypeDescriptor;\r\n if (x !== OperandStackType.Any) {\r\n valueType = (ValueType as any)[x] as ValueTypeDescriptor;\r\n } else {\r\n const popCount = this._operandStack.length - stackStart.length;\r\n valueType = this._getStackObjectValueType(opCode, immediate, popCount);\r\n }\r\n return i.push(valueType);\r\n }, stack);\r\n\r\n return stack;\r\n }\r\n\r\n _getFuncType(opCode: OpCodeDef, immediate: Immediate | null): FuncTypeBuilder | null {\r\n let funcType: FuncTypeBuilder | null = null;\r\n\r\n if (opCode === (OpCodes as any).call) {\r\n if (immediate!.values[0] instanceof ImportBuilder) {\r\n funcType = immediate!.values[0].data as FuncTypeBuilder;\r\n } else if (immediate!.values[0] && 'funcTypeBuilder' in immediate!.values[0]) {\r\n funcType = (immediate!.values[0] as FunctionBuilder).funcTypeBuilder;\r\n } else {\r\n throw new VerificationError('Error getting funcType for call, invalid immediate.');\r\n }\r\n } else if (opCode === (OpCodes as any).call_indirect) {\r\n if (immediate!.values[0] instanceof FuncTypeBuilder) {\r\n funcType = immediate!.values[0];\r\n } else {\r\n throw new VerificationError(\r\n 'Error getting funcType for call_indirect, invalid immediate.'\r\n );\r\n }\r\n }\r\n\r\n return funcType;\r\n }\r\n\r\n _getStackObjectValueType(\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n argCount: number\r\n ): ValueTypeDescriptor {\r\n if (\r\n opCode === (OpCodes as any).get_global ||\r\n opCode === (OpCodes as any).set_global\r\n ) {\r\n if (immediate!.values[0] instanceof GlobalBuilder) {\r\n return immediate!.values[0].valueType;\r\n } else if (immediate!.values[0] instanceof ImportBuilder) {\r\n return (immediate!.values[0].data as GlobalType).valueType;\r\n }\r\n throw new VerificationError('Invalid operand for global instruction.');\r\n } else if (\r\n opCode === (OpCodes as any).get_local ||\r\n opCode === (OpCodes as any).set_local ||\r\n opCode === (OpCodes as any).tee_local\r\n ) {\r\n if (\r\n !(immediate!.values[0] instanceof LocalBuilder) &&\r\n !(immediate!.values[0] instanceof FunctionParameterBuilder)\r\n ) {\r\n throw new VerificationError('Invalid operand for local instruction.');\r\n }\r\n return immediate!.values[0].valueType;\r\n }\r\n\r\n const stackArgTypes = this._getStackValueTypes(this._operandStack, argCount);\r\n return stackArgTypes[0];\r\n }\r\n\r\n _getStackValueTypes(stack: OperandStack, count: number): ValueTypeDescriptor[] {\r\n const results: ValueTypeDescriptor[] = [];\r\n let current = stack;\r\n\r\n for (let index = 0; index < count; index++) {\r\n results.push(current.valueType);\r\n current = current.pop();\r\n }\r\n\r\n return results.reverse();\r\n }\r\n\r\n _formatAndList(values: T[], getText?: (item: T) => string): string {\r\n if (values.length === 1) {\r\n return getText ? getText(values[0]) : String(values[0]);\r\n }\r\n\r\n let text = '';\r\n for (let index = 0; index < values.length; index++) {\r\n text += getText ? getText(values[index]) : String(values[index]);\r\n if (index === values.length - 2) {\r\n text += ' and ';\r\n } else if (index !== values.length - 1) {\r\n text += ', ';\r\n }\r\n }\r\n\r\n return text;\r\n }\r\n}\r\n\r\n// Import at the end to avoid circular dependency issues at type level\r\nimport type GlobalType from '../GlobalType';\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport { BlockTypeDescriptor, ImmediateType, OpCodeDef, WasmFeature } from './types';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport Immediate from './Immediate';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport Instruction from './Instruction';\r\nimport LabelBuilder from './LabelBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport OpCodeEmitter from './OpCodeEmitter';\r\nimport OpCodes from './OpCodes';\r\nimport ControlFlowVerifier from './verification/ControlFlowVerifier';\r\nimport { ControlFlowType } from './verification/types';\r\nimport OperandStackVerifier from './verification/OperandStackVerifier';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\nimport { BlockType } from './types';\r\n\r\nconst validateParameters = (immediateType: string, values: any[] | undefined, length: number): void => {\r\n if (!values || values.length !== length) {\r\n throw new Error(`Unexpected number of values for ${immediateType}.`);\r\n }\r\n};\r\n\r\nexport interface AssemblyEmitterOptions {\r\n disableVerification: boolean;\r\n features?: Set;\r\n}\r\n\r\nexport default class AssemblyEmitter extends OpCodeEmitter {\r\n _instructions: Instruction[];\r\n _locals: LocalBuilder[];\r\n _entryLabel: LabelBuilder;\r\n _controlFlowVerifier: ControlFlowVerifier;\r\n _operandStackVerifier: OperandStackVerifier;\r\n _options: AssemblyEmitterOptions;\r\n\r\n constructor(\r\n funcSignature: FuncTypeSignature,\r\n options: AssemblyEmitterOptions = { disableVerification: false }\r\n ) {\r\n super();\r\n\r\n Arg.instanceOf('funcSignature', funcSignature, FuncTypeSignature);\r\n this._instructions = [];\r\n this._locals = [];\r\n this._controlFlowVerifier = new ControlFlowVerifier(options.disableVerification);\r\n this._operandStackVerifier = new OperandStackVerifier(funcSignature);\r\n this._entryLabel = this._controlFlowVerifier.push(\r\n this._operandStackVerifier.stack,\r\n BlockType.Void\r\n );\r\n this._options = options;\r\n }\r\n\r\n get returnValues(): any {\r\n return this;\r\n }\r\n\r\n get parameters(): FunctionParameterBuilder[] {\r\n return [];\r\n }\r\n\r\n get entryLabel(): LabelBuilder {\r\n return this._entryLabel;\r\n }\r\n\r\n get disableVerification(): boolean {\r\n return this._options.disableVerification;\r\n }\r\n\r\n getParameter(_index: number): FunctionParameterBuilder | LocalBuilder {\r\n throw new Error('Not supported.');\r\n }\r\n\r\n declareLocal(\r\n type: any,\r\n name: string | null = null,\r\n count: number = 1\r\n ): LocalBuilder {\r\n const localBuilder = new LocalBuilder(\r\n type,\r\n name,\r\n this._locals.length + this.parameters.length,\r\n count\r\n );\r\n this._locals.push(localBuilder);\r\n return localBuilder;\r\n }\r\n\r\n defineLabel(): LabelBuilder {\r\n return this._controlFlowVerifier.defineLabel();\r\n }\r\n\r\n emit(opCode: OpCodeDef, ...args: any[]): any {\r\n Arg.notNull('opCode', opCode);\r\n const depth = this._controlFlowVerifier.size - 1;\r\n let result: any = null;\r\n let immediate: Immediate | null = null;\r\n let pushLabel: LabelBuilder | null = null;\r\n let labelCallback: ((label: any) => void) | null = null;\r\n\r\n if (depth < 0) {\r\n throw new Error(\r\n 'Cannot add any instructions after the main control enclosure has been closed.'\r\n );\r\n }\r\n\r\n if (opCode.controlFlow === ControlFlowType.Push && args.length > 1) {\r\n if (args.length > 2) {\r\n throw new Error(`Unexpected number of values for ${ImmediateType.BlockSignature}.`);\r\n }\r\n\r\n if (args[1]) {\r\n if (args[1] instanceof LabelBuilder) {\r\n pushLabel = args[1];\r\n } else if (typeof args[1] === 'function') {\r\n const userFunction = args[1];\r\n labelCallback = (x: any) => {\r\n userFunction(x);\r\n };\r\n } else {\r\n throw new Error('Error');\r\n }\r\n }\r\n\r\n args = [args[0]];\r\n }\r\n\r\n if (opCode.feature && this._options.features && !this._options.features.has(opCode.feature as WasmFeature)) {\r\n throw new Error(\r\n `Opcode ${opCode.mnemonic} requires the '${opCode.feature}' feature. ` +\r\n `Enable it via the 'features' or 'target' option in ModuleBuilder.`\r\n );\r\n }\r\n\r\n if (opCode.immediate) {\r\n immediate = this._createImmediate(\r\n opCode.immediate as ImmediateType,\r\n args,\r\n depth\r\n );\r\n\r\n if (immediate.type === ImmediateType.RelativeDepth) {\r\n this._controlFlowVerifier.reference(args[0]);\r\n }\r\n }\r\n\r\n if (!this.disableVerification) {\r\n this._operandStackVerifier.verifyInstruction(\r\n this._controlFlowVerifier.peek()!.block!,\r\n opCode,\r\n immediate\r\n );\r\n\r\n if (opCode === (OpCodes as any).else) {\r\n this._operandStackVerifier.verifyElse(\r\n this._controlFlowVerifier.peek()!.block!\r\n );\r\n }\r\n }\r\n\r\n if (opCode.controlFlow) {\r\n result = this._updateControlFlow(opCode, immediate, pushLabel);\r\n }\r\n\r\n this._instructions.push(new Instruction(opCode, immediate));\r\n if (labelCallback) {\r\n labelCallback(result);\r\n this.end();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n _updateControlFlow(\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n label: LabelBuilder | null\r\n ): any {\r\n let result: any = null;\r\n if (opCode.controlFlow === ControlFlowType.Push) {\r\n const blockType = immediate!.values[0] as BlockTypeDescriptor;\r\n const isLoop = opCode === (OpCodes as any).loop;\r\n result = this._controlFlowVerifier.push(\r\n this._operandStackVerifier.stack,\r\n blockType,\r\n label,\r\n isLoop\r\n );\r\n } else if (opCode.controlFlow === ControlFlowType.Pop) {\r\n this._controlFlowVerifier.pop();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._controlFlowVerifier.verify();\r\n\r\n const bodyWriter = new BinaryWriter();\r\n this._writeLocals(bodyWriter);\r\n\r\n for (let index = 0; index < this._instructions.length; index++) {\r\n this._instructions[index].write(bodyWriter);\r\n }\r\n\r\n writer.writeVarUInt32(bodyWriter.length);\r\n writer.writeBytes(bodyWriter);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n\r\n _writeLocals(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this._locals.length);\r\n for (let index = 0; index < this._locals.length; index++) {\r\n this._locals[index].write(writer);\r\n }\r\n }\r\n\r\n _createImmediate(immediateType: ImmediateType, values: any[], depth: number): Immediate {\r\n switch (immediateType) {\r\n case ImmediateType.BlockSignature:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createBlockSignature(values[0]);\r\n\r\n case ImmediateType.BranchTable:\r\n validateParameters(immediateType, values, 2);\r\n return Immediate.createBranchTable(values[0], values[1], depth);\r\n\r\n case ImmediateType.Float32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createFloat32(values[0]);\r\n\r\n case ImmediateType.Float64:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createFloat64(values[0]);\r\n\r\n case ImmediateType.Function:\r\n validateParameters(immediateType, values, 1);\r\n if (!(values[0] instanceof ImportBuilder) && !(values[0] && '_index' in values[0] && 'funcTypeBuilder' in values[0])) {\r\n throw new Error('functionBuilder must be a FunctionBuilder or ImportBuilder.');\r\n }\r\n return Immediate.createFunction(values[0]);\r\n\r\n case ImmediateType.Global:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createGlobal(values[0]);\r\n\r\n case ImmediateType.IndirectFunction:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createIndirectFunction(values[0]);\r\n\r\n case ImmediateType.Local:\r\n validateParameters(immediateType, values, 1);\r\n let local = values[0];\r\n if (typeof local === 'number') {\r\n local = this.getParameter(local);\r\n }\r\n Arg.instanceOf('local', local, LocalBuilder, FunctionParameterBuilder);\r\n return Immediate.createLocal(local);\r\n\r\n case ImmediateType.MemoryImmediate:\r\n validateParameters(immediateType, values, 2);\r\n return Immediate.createMemoryImmediate(values[0], values[1]);\r\n\r\n case ImmediateType.RelativeDepth:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createRelativeDepth(values[0], depth);\r\n\r\n case ImmediateType.VarInt32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarInt32(values[0]);\r\n\r\n case ImmediateType.VarInt64:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarInt64(values[0]);\r\n\r\n case ImmediateType.VarUInt1:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarUInt1(values[0]);\r\n\r\n case ImmediateType.VarUInt32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarUInt32(values[0]);\r\n\r\n case ImmediateType.V128Const:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createV128Const(values[0]);\r\n\r\n case ImmediateType.LaneIndex:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createLaneIndex(values[0]);\r\n\r\n case ImmediateType.ShuffleMask:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createShuffleMask(values[0]);\r\n\r\n default:\r\n throw new Error('Unknown operand type.');\r\n }\r\n }\r\n}\r\n", "import AssemblyEmitter from './AssemblyEmitter';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { InitExpressionType, ValueTypeDescriptor, OpCodeDef } from './types';\r\nimport OpCodes from './OpCodes';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class InitExpressionEmitter extends AssemblyEmitter {\r\n _initExpressionType: InitExpressionType;\r\n\r\n constructor(initExpressionType: InitExpressionType, valueType: ValueTypeDescriptor) {\r\n super(new FuncTypeSignature([valueType], []));\r\n this._initExpressionType = initExpressionType;\r\n }\r\n\r\n getParameter(_index: number): never {\r\n throw new Error('An initialization expression does not have any parameters.');\r\n }\r\n\r\n declareLocal(): never {\r\n throw new Error('An initialization expression cannot have locals.');\r\n }\r\n\r\n emit(opCode: OpCodeDef, ...args: any[]): any {\r\n this._isValidateOp(opCode, args);\r\n return super.emit(opCode, ...args);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n for (let index = 0; index < this._instructions.length; index++) {\r\n this._instructions[index].write(writer);\r\n }\r\n }\r\n\r\n _isValidateOp(opCode: OpCodeDef, args?: any[]): void {\r\n if (this._instructions.length === 2) {\r\n return;\r\n }\r\n\r\n if (this._instructions.length === 1) {\r\n if (opCode !== OpCodes.end) {\r\n throw new Error(`Opcode ${opCode.mnemonic} is not valid after init expression value.`);\r\n }\r\n return;\r\n }\r\n\r\n switch (opCode) {\r\n case OpCodes.f32_const:\r\n case OpCodes.f64_const:\r\n case OpCodes.i32_const:\r\n case OpCodes.i64_const:\r\n break;\r\n\r\n case OpCodes.get_global: {\r\n const globalBuilder = args?.[0];\r\n if (this._initExpressionType === InitExpressionType.Element) {\r\n throw new Error(\r\n 'The only valid instruction for an element initializer expression is a constant i32, ' +\r\n 'global not supported.'\r\n );\r\n }\r\n\r\n if (!(globalBuilder instanceof GlobalBuilder)) {\r\n throw new Error('A global builder was expected.');\r\n }\r\n\r\n if (globalBuilder.globalType.mutable) {\r\n throw new Error(\r\n 'An initializer expression cannot reference a mutable global.'\r\n );\r\n }\r\n\r\n break;\r\n }\r\n\r\n default:\r\n throw new Error(\r\n `Opcode ${opCode.mnemonic} is not supported in an initializer expression.`\r\n );\r\n }\r\n }\r\n}\r\n", "import InitExpressionEmitter from './InitExpressionEmitter';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { InitExpressionType, ValueType } from './types';\r\n\r\nexport default class DataSegmentBuilder {\r\n _data: Uint8Array;\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n\r\n constructor(data: Uint8Array) {\r\n this._data = data;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Data,\r\n ValueType.Int32\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n offset(value: number | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number') {\r\n this.createInitEmitter((asm) => {\r\n asm.const_i32(value);\r\n });\r\n } else {\r\n throw new Error('Unsupported offset');\r\n }\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n writer.writeVarUInt32(0);\r\n this._initExpressionEmitter.write(writer);\r\n writer.writeVarUInt32(this._data.length);\r\n writer.writeBytes(this._data);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import AssemblyEmitter, { AssemblyEmitterOptions } from './AssemblyEmitter';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FunctionEmitter extends AssemblyEmitter {\r\n _functionBuilder: FunctionBuilder;\r\n\r\n constructor(functionBuilder: FunctionBuilder, options?: AssemblyEmitterOptions) {\r\n super(functionBuilder.funcTypeBuilder.toSignature(), options);\r\n this._functionBuilder = functionBuilder;\r\n this._locals = [];\r\n }\r\n\r\n get returnValues(): ValueTypeDescriptor[] {\r\n return this._functionBuilder.funcTypeBuilder.returnTypes;\r\n }\r\n\r\n get parameters(): FunctionParameterBuilder[] {\r\n return this._functionBuilder.parameters;\r\n }\r\n\r\n getParameter(index: number): FunctionParameterBuilder | LocalBuilder {\r\n if (index >= 0) {\r\n if (index < this.parameters.length) {\r\n return this._functionBuilder.getParameter(index);\r\n }\r\n\r\n const localIndex = index - this.parameters.length;\r\n if (localIndex < this._locals.length) {\r\n return this._locals[localIndex];\r\n }\r\n }\r\n\r\n throw new Error('Invalid parameter index.');\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport { ValueTypeDescriptor } from './types';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class FunctionBuilder {\r\n name: string;\r\n funcTypeBuilder: FuncTypeBuilder;\r\n parameters: FunctionParameterBuilder[];\r\n _index: number;\r\n functionEmitter: FunctionEmitter | null = null;\r\n _moduleBuilder: ModuleBuilder;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n name: string,\r\n funcTypeBuilder: FuncTypeBuilder,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this.name = name;\r\n this.funcTypeBuilder = funcTypeBuilder;\r\n this._index = index;\r\n this.parameters = funcTypeBuilder.parameterTypes.map(\r\n (x, i) => new FunctionParameterBuilder(x, i)\r\n );\r\n }\r\n\r\n get returnType(): ValueTypeDescriptor[] {\r\n return this.funcTypeBuilder.returnTypes;\r\n }\r\n\r\n get parameterTypes(): ValueTypeDescriptor[] {\r\n return this.funcTypeBuilder.parameterTypes;\r\n }\r\n\r\n getParameter(index: number): FunctionParameterBuilder {\r\n return this.parameters[index];\r\n }\r\n\r\n createEmitter(callback?: (asm: FunctionEmitter) => void): FunctionEmitter {\r\n if (this.functionEmitter) {\r\n throw new Error('Function emitter has already been created.');\r\n }\r\n\r\n this.functionEmitter = new FunctionEmitter(this, {\r\n disableVerification: this._moduleBuilder.disableVerification,\r\n features: this._moduleBuilder.features,\r\n });\r\n if (callback) {\r\n callback(this.functionEmitter);\r\n this.functionEmitter.end();\r\n }\r\n\r\n return this.functionEmitter;\r\n }\r\n\r\n withExport(name?: string): this {\r\n this._moduleBuilder.exportFunction(this, name || null);\r\n return this;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this.functionEmitter) {\r\n throw new Error('Function body has not been defined.');\r\n }\r\n\r\n this.functionEmitter.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport InitExpressionEmitter from './InitExpressionEmitter';\r\nimport TableBuilder from './TableBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport { InitExpressionType, ValueType } from './types';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class ElementSegmentBuilder {\r\n _table: TableBuilder;\r\n _functions: (FunctionBuilder | ImportBuilder)[] = [];\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n\r\n constructor(table: TableBuilder, functions: (FunctionBuilder | ImportBuilder)[]) {\r\n this._table = table;\r\n this._functions = functions;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Element,\r\n ValueType.Int32\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n offset(value: number | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number') {\r\n this.createInitEmitter((asm) => {\r\n asm.const_i32(value);\r\n });\r\n } else {\r\n throw new Error('Unsupported offset');\r\n }\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n writer.writeVarUInt32(this._table._index);\r\n this._initExpressionEmitter.write(writer);\r\n writer.writeVarUInt32(this._functions.length);\r\n this._functions.forEach((x) => {\r\n if (x instanceof FunctionBuilder) {\r\n writer.writeVarUInt32(x._index);\r\n } else if (x instanceof ImportBuilder) {\r\n writer.writeVarUInt32(x.index);\r\n }\r\n });\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ExternalKind, ExternalKindType } from './types';\r\n\r\nexport default class ExportBuilder {\r\n name: string;\r\n externalKind: ExternalKindType;\r\n data: { _index: number };\r\n\r\n constructor(name: string, externalKind: ExternalKindType, data: { _index: number }) {\r\n this.name = name;\r\n this.externalKind = externalKind;\r\n this.data = data;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.name.length);\r\n writer.writeString(this.name);\r\n writer.writeUInt8(this.externalKind.value);\r\n switch (this.externalKind) {\r\n case ExternalKind.Function:\r\n case ExternalKind.Global:\r\n case ExternalKind.Memory:\r\n case ExternalKind.Table:\r\n writer.writeVarUInt32(this.data._index);\r\n break;\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\n\r\nexport default class ResizableLimits {\r\n initial: number;\r\n maximum: number | null;\r\n\r\n constructor(initial: number, maximum: number | null = null) {\r\n this.initial = initial;\r\n this.maximum = maximum;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt1(this.maximum !== null ? 1 : 0);\r\n writer.writeVarUInt32(this.initial);\r\n if (this.maximum !== null) {\r\n writer.writeVarUInt32(this.maximum);\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\n\r\nexport default class MemoryType {\r\n resizableLimits: ResizableLimits;\r\n\r\n constructor(resizableLimits: ResizableLimits) {\r\n Arg.instanceOf('resizableLimits', resizableLimits, ResizableLimits);\r\n this.resizableLimits = resizableLimits;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this.resizableLimits.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport MemoryType from './MemoryType';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class MemoryBuilder {\r\n _moduleBuilder: ModuleBuilder;\r\n _memoryType: MemoryType;\r\n _index: number;\r\n\r\n constructor(moduleBuilder: ModuleBuilder, resizableLimits: ResizableLimits, index: number) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._memoryType = new MemoryType(resizableLimits);\r\n this._index = index;\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportMemory(this, name);\r\n return this;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._memoryType.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport { ElementTypeDescriptor } from './types';\r\n\r\nexport default class TableType {\r\n private _elementType: ElementTypeDescriptor;\r\n private _resizableLimits: ResizableLimits;\r\n\r\n constructor(elementType: ElementTypeDescriptor, resizableLimits: ResizableLimits) {\r\n this._elementType = elementType;\r\n this._resizableLimits = resizableLimits;\r\n }\r\n\r\n get elementType(): ElementTypeDescriptor {\r\n return this._elementType;\r\n }\r\n\r\n get resizableLimits(): ResizableLimits {\r\n return this._resizableLimits;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this._elementType.value);\r\n this._resizableLimits.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport TableType from './TableType';\r\nimport { ElementTypeDescriptor } from './types';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport type ImportBuilder from './ImportBuilder';\r\n\r\nexport default class TableBuilder {\r\n _moduleBuilder: ModuleBuilder;\r\n _tableType: TableType;\r\n _index: number;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n elementType: ElementTypeDescriptor,\r\n resizableLimits: ResizableLimits,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._tableType = new TableType(elementType, resizableLimits);\r\n this._index = index;\r\n }\r\n\r\n get elementType(): ElementTypeDescriptor {\r\n return this._tableType.elementType;\r\n }\r\n\r\n get resizableLimits(): ResizableLimits {\r\n return this._tableType.resizableLimits;\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportTable(this, name);\r\n return this;\r\n }\r\n\r\n defineTableSegment(\r\n elements: (FunctionBuilder | ImportBuilder)[],\r\n offset?: number | ((asm: any) => void)\r\n ): void {\r\n this._moduleBuilder.defineTableSegment(this, elements, offset);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._tableType.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import ModuleBuilder from './ModuleBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { ExternalKind, ImmediateType, ValueTypeDescriptor } from './types';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalType from './GlobalType';\r\nimport MemoryType from './MemoryType';\r\nimport TableType from './TableType';\r\nimport Instruction from './Instruction';\r\nimport LabelBuilder from './LabelBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\n\r\nexport default class TextModuleWriter {\r\n moduleBuilder: ModuleBuilder;\r\n\r\n constructor(moduleBuilder: ModuleBuilder) {\r\n this.moduleBuilder = moduleBuilder;\r\n }\r\n\r\n toString(): string {\r\n const lines: string[] = [];\r\n const mod = this.moduleBuilder;\r\n\r\n lines.push(`(module $${mod._name}`);\r\n\r\n this.writeTypes(lines, mod);\r\n this.writeImports(lines, mod);\r\n this.writeFunctions(lines, mod);\r\n this.writeTables(lines, mod);\r\n this.writeMemories(lines, mod);\r\n this.writeGlobals(lines, mod);\r\n this.writeExports(lines, mod);\r\n this.writeStart(lines, mod);\r\n this.writeElements(lines, mod);\r\n this.writeData(lines, mod);\r\n\r\n lines.push(')');\r\n return lines.join('\\n');\r\n }\r\n\r\n private writeTypes(lines: string[], mod: ModuleBuilder): void {\r\n mod._types.forEach((type, i) => {\r\n const params = type.parameterTypes.map((p) => p.name).join(' ');\r\n const results = type.returnTypes.map((r) => r.name).join(' ');\r\n let sig = `(func`;\r\n if (params.length > 0) sig += ` (param ${params})`;\r\n if (results.length > 0) sig += ` (result ${results})`;\r\n sig += ')';\r\n lines.push(` (type (;${i};) ${sig})`);\r\n });\r\n }\r\n\r\n private writeImports(lines: string[], mod: ModuleBuilder): void {\r\n mod._imports.forEach((imp, i) => {\r\n let desc = '';\r\n switch (imp.externalKind) {\r\n case ExternalKind.Function: {\r\n const funcType = imp.data as FuncTypeBuilder;\r\n desc = `(func (;${imp.index};) (type ${funcType.index}))`;\r\n break;\r\n }\r\n case ExternalKind.Table: {\r\n const tableType = imp.data as TableType;\r\n const limits = tableType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n desc = `(table (;${imp.index};) ${limits.initial}${max} ${tableType.elementType.name})`;\r\n break;\r\n }\r\n case ExternalKind.Memory: {\r\n const memType = imp.data as MemoryType;\r\n const limits = memType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n desc = `(memory (;${imp.index};) ${limits.initial}${max})`;\r\n break;\r\n }\r\n case ExternalKind.Global: {\r\n const globalType = imp.data as GlobalType;\r\n const valType = globalType.valueType.name;\r\n desc = globalType.mutable\r\n ? `(global (;${imp.index};) (mut ${valType}))`\r\n : `(global (;${imp.index};) ${valType})`;\r\n break;\r\n }\r\n }\r\n lines.push(` (import \"${imp.moduleName}\" \"${imp.fieldName}\" ${desc})`);\r\n });\r\n }\r\n\r\n private writeFunctions(lines: string[], mod: ModuleBuilder): void {\r\n mod._functions.forEach((func) => {\r\n const typeIdx = func.funcTypeBuilder.index;\r\n let header = ` (func $${func.name} (;${func._index};) (type ${typeIdx})`;\r\n\r\n if (func.funcTypeBuilder.parameterTypes.length > 0) {\r\n const params = func.funcTypeBuilder.parameterTypes\r\n .map((p, i) => {\r\n const param = func.parameters[i];\r\n return p.name;\r\n })\r\n .join(' ');\r\n header += ` (param ${params})`;\r\n }\r\n\r\n if (func.funcTypeBuilder.returnTypes.length > 0) {\r\n const results = func.funcTypeBuilder.returnTypes.map((r) => r.name).join(' ');\r\n header += ` (result ${results})`;\r\n }\r\n\r\n if (!func.functionEmitter) {\r\n lines.push(header + ')');\r\n return;\r\n }\r\n\r\n const emitter = func.functionEmitter;\r\n\r\n // Locals\r\n if (emitter._locals.length > 0) {\r\n const locals = emitter._locals.map((l) => {\r\n if (l.count === 1) return `(local ${l.valueType.name})`;\r\n return `(local ${l.valueType.name})`.repeat(l.count);\r\n });\r\n header += ' ' + locals.join(' ');\r\n }\r\n\r\n lines.push(header);\r\n\r\n // Instructions\r\n this.writeInstructions(lines, emitter._instructions, 2);\r\n lines.push(' )');\r\n });\r\n }\r\n\r\n private writeInstructions(lines: string[], instructions: Instruction[], baseIndent: number): void {\r\n let indent = baseIndent;\r\n\r\n for (const instr of instructions) {\r\n const mnemonic = instr.opCode.mnemonic;\r\n\r\n // Decrease indent before end/else\r\n if (mnemonic === 'end' || mnemonic === 'else') {\r\n indent = Math.max(baseIndent, indent - 1);\r\n }\r\n\r\n const prefix = ' '.repeat(indent);\r\n let line = `${prefix}${mnemonic}`;\r\n\r\n // Add immediate operand text\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) {\r\n line += ` ${immText}`;\r\n }\r\n }\r\n\r\n lines.push(line);\r\n\r\n // Increase indent after block/loop/if/else\r\n if (mnemonic === 'block' || mnemonic === 'loop' || mnemonic === 'if' || mnemonic === 'else') {\r\n indent++;\r\n }\r\n }\r\n }\r\n\r\n private immediateToText(type: ImmediateType, values: any[]): string {\r\n switch (type) {\r\n case ImmediateType.BlockSignature: {\r\n const blockType = values[0];\r\n if (blockType && blockType.name !== 'void') {\r\n return `(result ${blockType.name})`;\r\n }\r\n return '';\r\n }\r\n case ImmediateType.VarInt32:\r\n case ImmediateType.VarInt64:\r\n case ImmediateType.Float32:\r\n case ImmediateType.Float64:\r\n case ImmediateType.VarUInt1:\r\n return String(values[0]);\r\n\r\n case ImmediateType.Local: {\r\n const local = values[0];\r\n return String(local.index);\r\n }\r\n case ImmediateType.Global: {\r\n const global = values[0];\r\n if (global instanceof GlobalBuilder) {\r\n return String(global._index);\r\n }\r\n if (global && typeof global.index === 'number') {\r\n return String(global.index);\r\n }\r\n return '';\r\n }\r\n case ImmediateType.Function: {\r\n const func = values[0];\r\n if (func instanceof FunctionBuilder) {\r\n return String(func._index);\r\n }\r\n if (func instanceof ImportBuilder) {\r\n return String(func.index);\r\n }\r\n return '';\r\n }\r\n case ImmediateType.IndirectFunction: {\r\n const funcType = values[0];\r\n return `(type ${funcType.index})`;\r\n }\r\n case ImmediateType.RelativeDepth: {\r\n const label = values[0];\r\n const depth = values[1];\r\n if (label instanceof LabelBuilder && label.block) {\r\n return String(depth - label.block.depth);\r\n }\r\n return String(label);\r\n }\r\n case ImmediateType.BranchTable: {\r\n const defaultDepth = values[0];\r\n const depths = values[1] as number[];\r\n return depths.join(' ') + ' ' + defaultDepth;\r\n }\r\n case ImmediateType.MemoryImmediate: {\r\n const alignment = values[0];\r\n const offset = values[1];\r\n let text = '';\r\n if (offset !== 0) text += `offset=${offset}`;\r\n if (alignment !== 0) {\r\n if (text) text += ' ';\r\n text += `align=${1 << alignment}`;\r\n }\r\n return text;\r\n }\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n private writeTables(lines: string[], mod: ModuleBuilder): void {\r\n mod._tables.forEach((table, i) => {\r\n const limits = table.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n lines.push(` (table (;${table._index};) ${limits.initial}${max} ${table.elementType.name})`);\r\n });\r\n }\r\n\r\n private writeMemories(lines: string[], mod: ModuleBuilder): void {\r\n mod._memories.forEach((mem) => {\r\n const limits = mem._memoryType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n lines.push(` (memory (;${mem._index};) ${limits.initial}${max})`);\r\n });\r\n }\r\n\r\n private writeGlobals(lines: string[], mod: ModuleBuilder): void {\r\n mod._globals.forEach((g) => {\r\n const valType = g.globalType.valueType.name;\r\n const typeStr = g.globalType.mutable ? `(mut ${valType})` : valType;\r\n\r\n let initExpr = '';\r\n if (g._initExpressionEmitter) {\r\n const instrs = g._initExpressionEmitter._instructions;\r\n // Init expression is typically one const instruction + end\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n initExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) initExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n lines.push(` (global (;${g._index};) ${typeStr} (${initExpr}))`);\r\n });\r\n }\r\n\r\n private writeExports(lines: string[], mod: ModuleBuilder): void {\r\n mod._exports.forEach((exp) => {\r\n let kindName = '';\r\n let index = exp.data._index;\r\n switch (exp.externalKind) {\r\n case ExternalKind.Function:\r\n kindName = 'func';\r\n break;\r\n case ExternalKind.Table:\r\n kindName = 'table';\r\n break;\r\n case ExternalKind.Memory:\r\n kindName = 'memory';\r\n break;\r\n case ExternalKind.Global:\r\n kindName = 'global';\r\n break;\r\n }\r\n lines.push(` (export \"${exp.name}\" (${kindName} ${index}))`);\r\n });\r\n }\r\n\r\n private writeStart(lines: string[], mod: ModuleBuilder): void {\r\n if (mod._startFunction) {\r\n lines.push(` (start ${mod._startFunction._index})`);\r\n }\r\n }\r\n\r\n private writeElements(lines: string[], mod: ModuleBuilder): void {\r\n mod._elements.forEach((elem, i) => {\r\n let offsetExpr = '';\r\n if (elem._initExpressionEmitter) {\r\n const instrs = elem._initExpressionEmitter._instructions;\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n offsetExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) offsetExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n const funcIndices = elem._functions\r\n .map((f) => {\r\n if (f instanceof FunctionBuilder) return f._index;\r\n if (f instanceof ImportBuilder) return f.index;\r\n return 0;\r\n })\r\n .join(' ');\r\n\r\n lines.push(` (elem (;${i};) (${offsetExpr}) func ${funcIndices})`);\r\n });\r\n }\r\n\r\n private writeData(lines: string[], mod: ModuleBuilder): void {\r\n mod._data.forEach((seg, i) => {\r\n let offsetExpr = '';\r\n if (seg._initExpressionEmitter) {\r\n const instrs = seg._initExpressionEmitter._instructions;\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n offsetExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) offsetExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n const dataStr = this.bytesToWatString(seg._data);\r\n lines.push(` (data (;${i};) (${offsetExpr}) \"${dataStr}\")`);\r\n });\r\n }\r\n\r\n private bytesToWatString(data: Uint8Array): string {\r\n let result = '';\r\n for (let i = 0; i < data.length; i++) {\r\n const byte = data[i];\r\n if (byte >= 0x20 && byte < 0x7f && byte !== 0x22 && byte !== 0x5c) {\r\n result += String.fromCharCode(byte);\r\n } else {\r\n result += '\\\\' + byte.toString(16).padStart(2, '0');\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryModuleWriter from './BinaryModuleWriter';\r\nimport DataSegmentBuilder from './DataSegmentBuilder';\r\nimport ElementSegmentBuilder from './ElementSegmentBuilder';\r\nimport ExportBuilder from './ExportBuilder';\r\nimport {\r\n ExternalKind,\r\n ElementTypeDescriptor,\r\n ValueTypeDescriptor,\r\n ModuleBuilderOptions,\r\n WasmFeature,\r\n WasmTarget,\r\n} from './types';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport GlobalType from './GlobalType';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport MemoryBuilder from './MemoryBuilder';\r\nimport MemoryType from './MemoryType';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport TableBuilder from './TableBuilder';\r\nimport TableType from './TableType';\r\nimport TextModuleWriter from './TextModuleWriter';\r\nimport CustomSectionBuilder from './CustomSectionBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport VerificationError from './verification/VerificationError';\r\n\r\nexport default class ModuleBuilder {\r\n static defaultOptions: ModuleBuilderOptions = {\r\n generateNameSection: true,\r\n disableVerification: false,\r\n };\r\n\r\n static readonly targetFeatures: Record = {\r\n 'mvp': [],\r\n '2.0': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'multi-value'],\r\n 'latest': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'simd', 'multi-value'],\r\n };\r\n\r\n _name: string;\r\n _types: FuncTypeBuilder[] = [];\r\n _imports: ImportBuilder[] = [];\r\n _functions: FunctionBuilder[] = [];\r\n _tables: TableBuilder[] = [];\r\n _memories: MemoryBuilder[] = [];\r\n _globals: GlobalBuilder[] = [];\r\n _exports: ExportBuilder[] = [];\r\n _elements: ElementSegmentBuilder[] = [];\r\n _data: DataSegmentBuilder[] = [];\r\n _customSections: CustomSectionBuilder[] = [];\r\n _startFunction: FunctionBuilder | null = null;\r\n _importsIndexSpace = {\r\n function: 0,\r\n table: 0,\r\n memory: 0,\r\n global: 0,\r\n };\r\n _options: ModuleBuilderOptions;\r\n _resolvedFeatures: Set;\r\n\r\n constructor(\r\n name: string,\r\n options: ModuleBuilderOptions = { generateNameSection: true, disableVerification: false }\r\n ) {\r\n Arg.notNull('name', name);\r\n this._name = name;\r\n this._options = options || ModuleBuilder.defaultOptions;\r\n this._resolvedFeatures = ModuleBuilder._resolveFeatures(this._options);\r\n }\r\n\r\n static _resolveFeatures(options: ModuleBuilderOptions): Set {\r\n const target = options.target || 'latest';\r\n const baseFeatures = ModuleBuilder.targetFeatures[target];\r\n const extra = options.features || [];\r\n return new Set([...baseFeatures, ...extra]);\r\n }\r\n\r\n get features(): Set {\r\n return this._resolvedFeatures;\r\n }\r\n\r\n hasFeature(feature: WasmFeature): boolean {\r\n return this._resolvedFeatures.has(feature);\r\n }\r\n\r\n get disableVerification(): boolean {\r\n return this._options && this._options.disableVerification === true;\r\n }\r\n\r\n defineFuncType(\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[]\r\n ): FuncTypeBuilder {\r\n let normalizedReturnTypes: ValueTypeDescriptor[];\r\n if (!returnTypes) {\r\n normalizedReturnTypes = [];\r\n } else if (!Array.isArray(returnTypes)) {\r\n normalizedReturnTypes = [returnTypes];\r\n } else {\r\n normalizedReturnTypes = returnTypes;\r\n }\r\n\r\n if (normalizedReturnTypes.length > 1) {\r\n throw new Error('A method can only return zero to one values.');\r\n }\r\n\r\n const funcTypeKey = FuncTypeBuilder.createKey(normalizedReturnTypes, parameters);\r\n let funcType = this._types.find((x) => x.key === funcTypeKey);\r\n if (!funcType) {\r\n funcType = new FuncTypeBuilder(\r\n funcTypeKey,\r\n normalizedReturnTypes,\r\n parameters,\r\n this._types.length\r\n );\r\n this._types.push(funcType);\r\n }\r\n\r\n return funcType;\r\n }\r\n\r\n importFunction(\r\n moduleName: string,\r\n name: string,\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[]\r\n ): ImportBuilder {\r\n const funcType = this.defineFuncType(returnTypes, parameters);\r\n if (\r\n this._imports.some(\r\n (x) =>\r\n x.externalKind === ExternalKind.Function &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Function,\r\n funcType,\r\n this._importsIndexSpace.function++\r\n );\r\n this._imports.push(importBuilder);\r\n this._functions.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n importTable(\r\n moduleName: string,\r\n name: string,\r\n elementType: ElementTypeDescriptor,\r\n initialSize: number,\r\n maximumSize: number | null = null\r\n ): ImportBuilder {\r\n if (\r\n this._imports.find(\r\n (x) =>\r\n x.externalKind === ExternalKind.Table &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const tableType = new TableType(\r\n elementType,\r\n new ResizableLimits(initialSize, maximumSize)\r\n );\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Table,\r\n tableType,\r\n this._importsIndexSpace.table++\r\n );\r\n this._imports.push(importBuilder);\r\n this._tables.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n importMemory(\r\n moduleName: string,\r\n name: string,\r\n initialSize: number,\r\n maximumSize: number | null = null\r\n ): ImportBuilder {\r\n Arg.string('moduleName', moduleName);\r\n Arg.string('name', name);\r\n Arg.number('initialSize', initialSize);\r\n\r\n if (\r\n this._imports.find(\r\n (x) =>\r\n x.externalKind === ExternalKind.Memory &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n if (this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) {\r\n throw new VerificationError('Only one memory is allowed per module.');\r\n }\r\n\r\n const memoryType = new MemoryType(new ResizableLimits(initialSize, maximumSize));\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Memory,\r\n memoryType,\r\n this._importsIndexSpace.memory++\r\n );\r\n this._imports.push(importBuilder);\r\n\r\n return importBuilder;\r\n }\r\n\r\n importGlobal(\r\n moduleName: string,\r\n name: string,\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean\r\n ): ImportBuilder {\r\n if (\r\n this._imports.some(\r\n (x) =>\r\n x.externalKind === ExternalKind.Global &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const globalType = new GlobalType(valueType, mutable);\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Global,\r\n globalType,\r\n this._importsIndexSpace.global++\r\n );\r\n this._imports.push(importBuilder);\r\n this._globals.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n defineFunction(\r\n name: string,\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[],\r\n createCallback?: (func: FunctionBuilder, asm: FunctionEmitter) => void\r\n ): FunctionBuilder {\r\n const existing = this._functions.find((x) => x.name === name);\r\n if (existing) {\r\n throw new Error(`Function has already been defined with the name ${name}`);\r\n }\r\n\r\n const funcType = this.defineFuncType(returnTypes, parameters);\r\n const functionBuilder = new FunctionBuilder(\r\n this,\r\n name,\r\n funcType,\r\n this._functions.length + this._importsIndexSpace.function\r\n );\r\n this._functions.push(functionBuilder);\r\n\r\n if (createCallback) {\r\n functionBuilder.createEmitter((x) => {\r\n createCallback(functionBuilder, x);\r\n });\r\n }\r\n\r\n return functionBuilder;\r\n }\r\n\r\n defineTable(\r\n elementType: ElementTypeDescriptor,\r\n initialSize: number,\r\n maximumSize: number | null = null\r\n ): TableBuilder {\r\n if (this._tables.length === 1) {\r\n throw new Error('Only one table can be created per module.');\r\n }\r\n\r\n const table = new TableBuilder(\r\n this,\r\n elementType,\r\n new ResizableLimits(initialSize, maximumSize),\r\n this._tables.length + this._importsIndexSpace.table\r\n );\r\n this._tables.push(table);\r\n return table;\r\n }\r\n\r\n defineMemory(initialSize: number, maximumSize: number | null = null): MemoryBuilder {\r\n if (this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) {\r\n throw new VerificationError('Only one memory is allowed per module.');\r\n }\r\n\r\n const memory = new MemoryBuilder(\r\n this,\r\n new ResizableLimits(initialSize, maximumSize),\r\n this._memories.length + this._importsIndexSpace.memory\r\n );\r\n this._memories.push(memory);\r\n return memory;\r\n }\r\n\r\n defineGlobal(\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean,\r\n value?: number | GlobalBuilder | ((asm: any) => void)\r\n ): GlobalBuilder {\r\n const globalBuilder = new GlobalBuilder(\r\n this,\r\n valueType,\r\n mutable,\r\n this._globals.length + this._importsIndexSpace.global\r\n );\r\n if (value !== undefined) {\r\n globalBuilder.value(value);\r\n }\r\n\r\n this._globals.push(globalBuilder);\r\n return globalBuilder;\r\n }\r\n\r\n setStartFunction(functionBuilder: FunctionBuilder): void {\r\n Arg.instanceOf('functionBuilder', functionBuilder, FunctionBuilder);\r\n this._startFunction = functionBuilder;\r\n }\r\n\r\n exportFunction(functionBuilder: FunctionBuilder, name: string | null = null): ExportBuilder {\r\n Arg.instanceOf('functionBuilder', functionBuilder, FunctionBuilder);\r\n\r\n const functionName = name || functionBuilder.name;\r\n Arg.notEmptyString('name', functionName);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Function && x.name === functionName\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a function named ${functionName}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(\r\n functionName,\r\n ExternalKind.Function,\r\n functionBuilder\r\n );\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportMemory(memoryBuilder: MemoryBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('memoryBuilder', memoryBuilder, MemoryBuilder);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Memory && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for memory named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Memory, memoryBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportTable(tableBuilder: TableBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('tableBuilder', tableBuilder, TableBuilder);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Table && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a table named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Table, tableBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportGlobal(globalBuilder: GlobalBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('globalBuilder', globalBuilder, GlobalBuilder);\r\n if (globalBuilder.globalType.mutable && !this.disableVerification) {\r\n throw new VerificationError('Cannot export a mutable global.');\r\n }\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Global && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a global named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Global, globalBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n defineTableSegment(\r\n table: TableBuilder,\r\n elements: (FunctionBuilder | ImportBuilder)[],\r\n offset?: number | GlobalBuilder | ((asm: any) => void)\r\n ): void {\r\n const segment = new ElementSegmentBuilder(table, elements);\r\n if (offset !== undefined) {\r\n segment.offset(offset as any);\r\n }\r\n\r\n this._elements.push(segment);\r\n }\r\n\r\n defineData(\r\n data: Uint8Array,\r\n offset?: number | GlobalBuilder | ((asm: any) => void)\r\n ): DataSegmentBuilder {\r\n Arg.instanceOf('data', data, Uint8Array);\r\n\r\n const dataSegmentBuilder = new DataSegmentBuilder(data);\r\n if (offset !== undefined) {\r\n dataSegmentBuilder.offset(offset as any);\r\n }\r\n\r\n this._data.push(dataSegmentBuilder);\r\n return dataSegmentBuilder;\r\n }\r\n\r\n defineCustomSection(name: string, data?: Uint8Array): CustomSectionBuilder {\r\n Arg.notEmptyString('name', name);\r\n\r\n if (this._customSections.find((x) => x.name === name)) {\r\n throw new Error(`A custom section already exists with the name ${name}.`);\r\n }\r\n\r\n if (name === 'name') {\r\n throw new Error(\"The 'name' custom section is reserved.\");\r\n }\r\n\r\n const customSectionBuilder = new CustomSectionBuilder(name, data);\r\n this._customSections.push(customSectionBuilder);\r\n return customSectionBuilder;\r\n }\r\n\r\n async instantiate(imports?: WebAssembly.Imports): Promise {\r\n const moduleBytes = this.toBytes();\r\n return WebAssembly.instantiate(moduleBytes.buffer as ArrayBuffer, imports);\r\n }\r\n\r\n async compile(): Promise {\r\n const moduleBytes = this.toBytes();\r\n return WebAssembly.compile(moduleBytes.buffer as ArrayBuffer);\r\n }\r\n\r\n toString(): string {\r\n const writer = new TextModuleWriter(this);\r\n return writer.toString();\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const writer = new BinaryModuleWriter(this);\r\n return writer.write();\r\n }\r\n}\r\n", "import ModuleBuilder from './ModuleBuilder';\r\nimport OpCodes from './OpCodes';\r\nimport {\r\n ValueType,\r\n ValueTypeDescriptor,\r\n BlockType,\r\n BlockTypeDescriptor,\r\n ElementType,\r\n ExternalKind,\r\n OpCodeDef,\r\n ModuleBuilderOptions,\r\n} from './types';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport ImportBuilder from './ImportBuilder';\r\n\r\n// --- Tokenizer ---\r\n\r\nenum TokenType {\r\n LeftParen = 'LeftParen',\r\n RightParen = 'RightParen',\r\n String = 'String',\r\n Number = 'Number',\r\n Keyword = 'Keyword',\r\n Id = 'Id',\r\n EOF = 'EOF',\r\n}\r\n\r\ninterface Token {\r\n type: TokenType;\r\n value: string;\r\n line: number;\r\n col: number;\r\n}\r\n\r\nfunction tokenize(source: string): Token[] {\r\n const tokens: Token[] = [];\r\n let pos = 0;\r\n let line = 1;\r\n let col = 1;\r\n\r\n function advance(n: number = 1): void {\r\n for (let i = 0; i < n; i++) {\r\n if (source[pos] === '\\n') {\r\n line++;\r\n col = 1;\r\n } else {\r\n col++;\r\n }\r\n pos++;\r\n }\r\n }\r\n\r\n while (pos < source.length) {\r\n const ch = source[pos];\r\n\r\n // Whitespace\r\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\r\n advance();\r\n continue;\r\n }\r\n\r\n // Line comment\r\n if (ch === ';' && source[pos + 1] === ';') {\r\n while (pos < source.length && source[pos] !== '\\n') advance();\r\n continue;\r\n }\r\n\r\n // Block comment (;...;) - skip entirely\r\n if (ch === '(' && source[pos + 1] === ';') {\r\n advance(2);\r\n let depth = 1;\r\n while (pos < source.length && depth > 0) {\r\n if (source[pos] === '(' && source[pos + 1] === ';') {\r\n depth++;\r\n advance(2);\r\n } else if (source[pos] === ';' && source[pos + 1] === ')') {\r\n depth--;\r\n advance(2);\r\n } else {\r\n advance();\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n const startLine = line;\r\n const startCol = col;\r\n\r\n if (ch === '(') {\r\n tokens.push({ type: TokenType.LeftParen, value: '(', line: startLine, col: startCol });\r\n advance();\r\n continue;\r\n }\r\n\r\n if (ch === ')') {\r\n tokens.push({ type: TokenType.RightParen, value: ')', line: startLine, col: startCol });\r\n advance();\r\n continue;\r\n }\r\n\r\n // String literal\r\n if (ch === '\"') {\r\n advance();\r\n let str = '';\r\n while (pos < source.length && source[pos] !== '\"') {\r\n if (source[pos] === '\\\\') {\r\n advance();\r\n const esc = source[pos];\r\n if (esc === 'n') str += '\\n';\r\n else if (esc === 't') str += '\\t';\r\n else if (esc === '\\\\') str += '\\\\';\r\n else if (esc === '\"') str += '\"';\r\n else if (esc === '\\'') str += '\\'';\r\n else {\r\n // Hex escape \\XX\r\n const hex = source.substring(pos, pos + 2);\r\n str += String.fromCharCode(parseInt(hex, 16));\r\n advance();\r\n }\r\n advance();\r\n } else {\r\n str += source[pos];\r\n advance();\r\n }\r\n }\r\n advance(); // closing \"\r\n tokens.push({ type: TokenType.String, value: str, line: startLine, col: startCol });\r\n continue;\r\n }\r\n\r\n // Id ($name)\r\n if (ch === '$') {\r\n let id = '';\r\n advance();\r\n while (pos < source.length && !isDelimiter(source[pos])) {\r\n id += source[pos];\r\n advance();\r\n }\r\n tokens.push({ type: TokenType.Id, value: '$' + id, line: startLine, col: startCol });\r\n continue;\r\n }\r\n\r\n // Number or keyword\r\n let word = '';\r\n while (pos < source.length && !isDelimiter(source[pos])) {\r\n word += source[pos];\r\n advance();\r\n }\r\n\r\n if (isNumericToken(word)) {\r\n tokens.push({ type: TokenType.Number, value: word, line: startLine, col: startCol });\r\n } else {\r\n tokens.push({ type: TokenType.Keyword, value: word, line: startLine, col: startCol });\r\n }\r\n }\r\n\r\n tokens.push({ type: TokenType.EOF, value: '', line, col });\r\n return tokens;\r\n}\r\n\r\nfunction isDelimiter(ch: string): boolean {\r\n return ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r' ||\r\n ch === '(' || ch === ')' || ch === ';' || ch === '\"';\r\n}\r\n\r\nfunction isNumericToken(word: string): boolean {\r\n if (/^[+-]?\\d/.test(word)) return true;\r\n if (/^[+-]?0x[0-9a-fA-F]/.test(word)) return true;\r\n if (/^[+-]?inf$/.test(word)) return true;\r\n if (/^[+-]?nan/.test(word)) return true;\r\n return false;\r\n}\r\n\r\n// --- Parser ---\r\n\r\nconst valueTypeMap: Record = {\r\n 'i32': ValueType.Int32,\r\n 'i64': ValueType.Int64,\r\n 'f32': ValueType.Float32,\r\n 'f64': ValueType.Float64,\r\n 'v128': ValueType.V128,\r\n};\r\n\r\nconst blockTypeMap: Record = {\r\n 'i32': BlockType.Int32,\r\n 'i64': BlockType.Int64,\r\n 'f32': BlockType.Float32,\r\n 'f64': BlockType.Float64,\r\n 'v128': BlockType.V128,\r\n};\r\n\r\n// Build mnemonic \u2192 opcode lookup\r\nconst mnemonicToOpCode: Map = new Map();\r\nfor (const [, opCode] of Object.entries(OpCodes)) {\r\n const op = opCode as OpCodeDef;\r\n mnemonicToOpCode.set(op.mnemonic, op);\r\n}\r\n\r\nclass WatParserImpl {\r\n tokens: Token[];\r\n pos: number;\r\n moduleBuilder!: ModuleBuilder;\r\n funcNames: Map = new Map();\r\n globalNames: Map = new Map();\r\n typeNames: Map = new Map();\r\n funcList: (FunctionBuilder | ImportBuilder)[] = [];\r\n labelStack: { name: string; label: any }[] = [];\r\n\r\n constructor(tokens: Token[]) {\r\n this.tokens = tokens;\r\n this.pos = 0;\r\n }\r\n\r\n // --- Token navigation ---\r\n\r\n peek(): Token {\r\n return this.tokens[this.pos];\r\n }\r\n\r\n advance(): Token {\r\n return this.tokens[this.pos++];\r\n }\r\n\r\n expect(type: TokenType, value?: string): Token {\r\n const tok = this.advance();\r\n if (tok.type !== type) {\r\n throw this.error(`Expected ${type}${value ? ` '${value}'` : ''} but got ${tok.type} '${tok.value}'`, tok);\r\n }\r\n if (value !== undefined && tok.value !== value) {\r\n throw this.error(`Expected '${value}' but got '${tok.value}'`, tok);\r\n }\r\n return tok;\r\n }\r\n\r\n expectKeyword(value: string): Token {\r\n return this.expect(TokenType.Keyword, value);\r\n }\r\n\r\n isKeyword(value: string): boolean {\r\n const tok = this.peek();\r\n return tok.type === TokenType.Keyword && tok.value === value;\r\n }\r\n\r\n isLeftParen(): boolean {\r\n return this.peek().type === TokenType.LeftParen;\r\n }\r\n\r\n isRightParen(): boolean {\r\n return this.peek().type === TokenType.RightParen;\r\n }\r\n\r\n // Skip optional inline comment like (;0;)\r\n skipInlineComment(): void {\r\n while (this.isLeftParen() && this.tokens[this.pos + 1]?.type === TokenType.Keyword &&\r\n this.tokens[this.pos + 1]?.value.startsWith(';')) {\r\n // This is a (;N;) comment \u2014 tokenizer should have removed it, but skip manually\r\n this.advance(); // (\r\n while (!this.isRightParen()) this.advance();\r\n this.advance(); // )\r\n }\r\n }\r\n\r\n error(message: string, tok?: Token): Error {\r\n const t = tok || this.peek();\r\n return new Error(`WAT parse error at ${t.line}:${t.col}: ${message}`);\r\n }\r\n\r\n // --- Parsing ---\r\n\r\n parse(options?: ModuleBuilderOptions): ModuleBuilder {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('module');\r\n\r\n let name = 'module';\r\n if (this.peek().type === TokenType.Id) {\r\n name = this.advance().value.substring(1); // strip $\r\n }\r\n\r\n this.moduleBuilder = new ModuleBuilder(name, options);\r\n\r\n // First pass: parse all sections\r\n while (!this.isRightParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const section = this.advance();\r\n\r\n switch (section.value) {\r\n case 'type':\r\n this.parseType();\r\n break;\r\n case 'import':\r\n this.parseImport();\r\n break;\r\n case 'func':\r\n this.parseFunc();\r\n break;\r\n case 'table':\r\n this.parseTable();\r\n break;\r\n case 'memory':\r\n this.parseMemory();\r\n break;\r\n case 'global':\r\n this.parseGlobal();\r\n break;\r\n case 'export':\r\n this.parseExport();\r\n break;\r\n case 'start':\r\n this.parseStart();\r\n break;\r\n case 'elem':\r\n this.parseElem();\r\n break;\r\n case 'data':\r\n this.parseData();\r\n break;\r\n default:\r\n // Skip unknown section\r\n this.skipSExpr();\r\n break;\r\n }\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing module paren\r\n return this.moduleBuilder;\r\n }\r\n\r\n // Skip remainder of current S-expression (we've already consumed opening keyword)\r\n skipSExpr(): void {\r\n let depth = 0;\r\n while (true) {\r\n const tok = this.peek();\r\n if (tok.type === TokenType.EOF) break;\r\n if (tok.type === TokenType.LeftParen) {\r\n depth++;\r\n this.advance();\r\n } else if (tok.type === TokenType.RightParen) {\r\n if (depth === 0) {\r\n this.advance();\r\n return;\r\n }\r\n depth--;\r\n this.advance();\r\n } else {\r\n this.advance();\r\n }\r\n }\r\n }\r\n\r\n // --- Type section ---\r\n\r\n parseType(): void {\r\n // (type $name (func (param i32 i32) (result i32)))\r\n // (type (;0;) (func (param i32 i32) (result i32)))\r\n // We already consumed: ( type\r\n let typeName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n typeName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('func');\r\n\r\n const params: ValueTypeDescriptor[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n\r\n while (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.advance().value;\r\n if (kw === 'param') {\r\n while (!this.isRightParen()) {\r\n // skip $name in param\r\n if (this.peek().type === TokenType.Id) this.advance();\r\n else params.push(this.parseValueType());\r\n }\r\n } else if (kw === 'result') {\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n this.expect(TokenType.RightParen); // closing type\r\n\r\n const funcType = this.moduleBuilder.defineFuncType(results.length > 0 ? results : null, params);\r\n if (typeName) {\r\n this.typeNames.set(typeName, funcType.index);\r\n }\r\n }\r\n\r\n // --- Import section ---\r\n\r\n parseImport(): void {\r\n // (import \"module\" \"name\" (func (;0;) (type 0)))\r\n const moduleName = this.expect(TokenType.String).value;\r\n const fieldName = this.expect(TokenType.String).value;\r\n\r\n this.expect(TokenType.LeftParen);\r\n const kind = this.advance().value;\r\n\r\n if (kind === 'func') {\r\n this.parseImportFunc(moduleName, fieldName);\r\n } else if (kind === 'table') {\r\n this.parseImportTable(moduleName, fieldName);\r\n } else if (kind === 'memory') {\r\n this.parseImportMemory(moduleName, fieldName);\r\n } else if (kind === 'global') {\r\n this.parseImportGlobal(moduleName, fieldName);\r\n } else {\r\n throw this.error(`Unknown import kind: ${kind}`);\r\n }\r\n }\r\n\r\n parseImportFunc(moduleName: string, fieldName: string): void {\r\n // (func $name (type 0))\r\n // OR: (func $name (param i32) (result i32))\r\n let importFuncName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n importFuncName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n\r\n let funcReturnTypes: ValueTypeDescriptor[] | null = null;\r\n let funcParamTypes: ValueTypeDescriptor[] = [];\r\n\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'type') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n const typeIndex = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n const funcType = this.moduleBuilder._types[typeIndex];\r\n funcReturnTypes = funcType.returnTypes.length > 0 ? funcType.returnTypes : null;\r\n funcParamTypes = funcType.parameterTypes;\r\n } else {\r\n // Parse inline (param ...) (result ...)\r\n const params: ValueTypeDescriptor[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n while (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.peek().value;\r\n if (kw === 'param') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) this.advance();\r\n else params.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'result') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n break;\r\n }\r\n }\r\n funcReturnTypes = results.length > 0 ? results : null;\r\n funcParamTypes = params;\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n const imp = this.moduleBuilder.importFunction(moduleName, fieldName,\r\n funcReturnTypes, funcParamTypes\r\n );\r\n if (importFuncName) {\r\n this.funcNames.set(importFuncName, imp.index);\r\n }\r\n this.funcList.push(imp);\r\n }\r\n\r\n parseImportTable(moduleName: string, fieldName: string): void {\r\n // (table (;0;) 1 10 anyfunc)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n let elemType = 'anyfunc';\r\n\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n if (this.peek().type === TokenType.Keyword) {\r\n elemType = this.advance().value;\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing table\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importTable(moduleName, fieldName, ElementType.AnyFunc, initial, maximum);\r\n }\r\n\r\n parseImportMemory(moduleName: string, fieldName: string): void {\r\n // (memory (;0;) 1 2)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen); // closing memory\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importMemory(moduleName, fieldName, initial, maximum);\r\n }\r\n\r\n parseImportGlobal(moduleName: string, fieldName: string): void {\r\n // (global (;0;) i32) or (global (;0;) (mut i32))\r\n let mutable = false;\r\n let valueType: ValueTypeDescriptor;\r\n\r\n if (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('mut');\r\n valueType = this.parseValueType();\r\n mutable = true;\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n valueType = this.parseValueType();\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing global\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importGlobal(moduleName, fieldName, valueType, mutable);\r\n }\r\n\r\n // --- Function section ---\r\n\r\n parseFunc(): void {\r\n // (func $name (;1;) (type 0) (param i32) (result i32) (local i32) ...)\r\n // OR: (func $name (param i32) (param i32) (result i32) ...)\r\n let name: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n name = this.advance().value.substring(1);\r\n }\r\n\r\n this.skipInlineComment();\r\n\r\n // Check if there's an explicit (type N)\r\n let hasExplicitType = false;\r\n let typeIndex = -1;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'type') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n typeIndex = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n hasExplicitType = true;\r\n }\r\n\r\n const params: ValueTypeDescriptor[] = [];\r\n const paramNames: (string | null)[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n\r\n // Parse optional (param ...) and (result ...)\r\n while (this.isLeftParen() && !this.isInstruction()) {\r\n const savedPos = this.pos;\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.peek().value;\r\n\r\n if (kw === 'param') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) {\r\n const pName = this.advance().value.substring(1); // strip $\r\n params.push(this.parseValueType());\r\n paramNames.push(pName);\r\n } else {\r\n params.push(this.parseValueType());\r\n paramNames.push(null);\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'result') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'local') {\r\n // Will be handled in instruction parsing\r\n this.pos = savedPos;\r\n break;\r\n } else {\r\n this.pos = savedPos;\r\n break;\r\n }\r\n }\r\n\r\n let funcReturnTypes: ValueTypeDescriptor[] | null;\r\n let funcParamTypes: ValueTypeDescriptor[];\r\n\r\n if (hasExplicitType) {\r\n const funcType = this.moduleBuilder._types[typeIndex];\r\n funcReturnTypes = funcType.returnTypes.length > 0 ? funcType.returnTypes : null;\r\n funcParamTypes = funcType.parameterTypes;\r\n } else {\r\n funcReturnTypes = results.length > 0 ? results : null;\r\n funcParamTypes = params;\r\n }\r\n\r\n const funcBuilder = this.moduleBuilder.defineFunction(\r\n name || `func_${this.moduleBuilder._functions.length - 1 + this.moduleBuilder._importsIndexSpace.function}`,\r\n funcReturnTypes,\r\n funcParamTypes\r\n );\r\n\r\n // Apply parameter names\r\n if (!hasExplicitType) {\r\n paramNames.forEach((pName, i) => {\r\n if (pName !== null && i < funcBuilder.parameters.length) {\r\n funcBuilder.parameters[i].withName(pName);\r\n }\r\n });\r\n }\r\n\r\n if (name) {\r\n this.funcNames.set('$' + name, funcBuilder._index);\r\n }\r\n this.funcList.push(funcBuilder);\r\n\r\n // Check if there are locals or instructions\r\n if (this.isRightParen()) {\r\n this.expect(TokenType.RightParen);\r\n return;\r\n }\r\n\r\n // Parse body\r\n this.labelStack = [];\r\n funcBuilder.createEmitter((asm) => {\r\n this.parseFuncBody(asm, funcBuilder);\r\n });\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n }\r\n\r\n parseFuncBody(asm: FunctionEmitter, func: FunctionBuilder): void {\r\n // Parse locals first\r\n while (this.isLeftParen()) {\r\n const savedPos = this.pos;\r\n this.expect(TokenType.LeftParen);\r\n if (this.isKeyword('local')) {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) {\r\n const localName = this.advance().value.substring(1); // strip $\r\n const vt = this.parseValueType();\r\n asm.declareLocal(vt, localName);\r\n } else {\r\n const vt = this.parseValueType();\r\n asm.declareLocal(vt);\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n this.pos = savedPos;\r\n break;\r\n }\r\n }\r\n\r\n // Parse instructions until closing )\r\n while (!this.isRightParen()) {\r\n this.parseInstruction(asm, func);\r\n }\r\n }\r\n\r\n parseInstruction(asm: FunctionEmitter, func: FunctionBuilder): void {\r\n const tok = this.advance();\r\n const mnemonic = tok.value;\r\n\r\n // Special handling for block/loop/if which have block signatures\r\n if (mnemonic === 'block' || mnemonic === 'loop' || mnemonic === 'if') {\r\n // Check for optional $label\r\n let labelName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n labelName = this.advance().value;\r\n }\r\n let blockType: BlockTypeDescriptor = BlockType.Void;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'result') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('result');\r\n const vt = this.parseValueType();\r\n blockType = blockTypeMap[vt.name] || BlockType.Void;\r\n this.expect(TokenType.RightParen);\r\n }\r\n const label = asm.emit(mnemonicToOpCode.get(mnemonic)!, blockType);\r\n if (labelName && label) {\r\n this.labelStack.push({ name: labelName, label });\r\n }\r\n return;\r\n }\r\n\r\n // Handle 'end' \u2014 pop label stack\r\n if (mnemonic === 'end') {\r\n asm.emit(mnemonicToOpCode.get(mnemonic)!);\r\n if (this.labelStack.length > 0) {\r\n // Check if the most recent label matches current depth\r\n const cfStack = (asm as any)._controlFlowVerifier._stack;\r\n // After 'end' pops, check if the popped label was named\r\n const top = this.labelStack[this.labelStack.length - 1];\r\n // If the label's block depth matches, pop it\r\n if (top.label.block && !cfStack.includes(top.label)) {\r\n this.labelStack.pop();\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const opCode = mnemonicToOpCode.get(mnemonic);\r\n if (!opCode) {\r\n throw this.error(`Unknown instruction: ${mnemonic}`, tok);\r\n }\r\n\r\n // Parse immediates based on opcode definition\r\n if (!opCode.immediate) {\r\n asm.emit(opCode);\r\n return;\r\n }\r\n\r\n switch (opCode.immediate) {\r\n case 'VarInt32':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'VarInt64':\r\n asm.emit(opCode, this.parseI64Value());\r\n break;\r\n case 'Float32':\r\n asm.emit(opCode, this.parseFloat());\r\n break;\r\n case 'Float64':\r\n asm.emit(opCode, this.parseFloat());\r\n break;\r\n case 'VarUInt1':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'VarUInt32':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'Local':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'Global':\r\n asm.emit(opCode, this.resolveGlobal());\r\n break;\r\n case 'Function':\r\n asm.emit(opCode, this.resolveFunction());\r\n break;\r\n case 'IndirectFunction': {\r\n // (type N) or (type $name)\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n let typeIdx: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n typeIdx = this.typeNames.get(id)!;\r\n if (typeIdx === undefined) throw this.error(`Unknown type: ${id}`);\r\n } else {\r\n typeIdx = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n asm.emit(opCode, this.moduleBuilder._types[typeIdx]);\r\n break;\r\n }\r\n case 'RelativeDepth':\r\n asm.emit(opCode, this.resolveBranchTarget(asm));\r\n break;\r\n case 'BranchTable': {\r\n // default_target target1 target2 ...\r\n // Last one is default\r\n const targets: number[] = [];\r\n while (this.peek().type === TokenType.Number) {\r\n targets.push(this.parseNumber());\r\n }\r\n if (targets.length < 1) throw this.error('br_table requires at least a default target');\r\n const defaultTarget = targets.pop()!;\r\n // This is tricky with our label system; for now use raw depth values\r\n // by looking up labels on the control flow stack\r\n const defaultLabel = this.getLabelAtDepth(asm, defaultTarget);\r\n const labels = targets.map((t) => this.getLabelAtDepth(asm, t));\r\n asm.emit(opCode, defaultLabel, labels);\r\n break;\r\n }\r\n case 'MemoryImmediate': {\r\n let alignment = 0;\r\n let offset = 0;\r\n // Parse offset=N align=N\r\n while (this.peek().type === TokenType.Keyword && (\r\n this.peek().value.startsWith('offset=') || this.peek().value.startsWith('align=')\r\n )) {\r\n const kv = this.advance().value;\r\n const [key, val] = kv.split('=');\r\n if (key === 'offset') offset = parseInt(val, 10);\r\n else if (key === 'align') {\r\n const alignVal = parseInt(val, 10);\r\n alignment = Math.log2(alignVal);\r\n }\r\n }\r\n asm.emit(opCode, alignment, offset);\r\n break;\r\n }\r\n case 'BlockSignature': {\r\n // Already handled above for block/loop/if\r\n let blockType: BlockTypeDescriptor = BlockType.Void;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'result') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('result');\r\n const vt = this.parseValueType();\r\n blockType = blockTypeMap[vt.name] || BlockType.Void;\r\n this.expect(TokenType.RightParen);\r\n }\r\n asm.emit(opCode, blockType);\r\n break;\r\n }\r\n case 'V128Const': {\r\n // v128.const i8x16 0 1 2 ... or hex format\r\n // For simplicity, parse 16 bytes\r\n const bytes = new Uint8Array(16);\r\n // Skip the lane type keyword (i8x16, i16x8, etc.)\r\n if (this.peek().type === TokenType.Keyword) this.advance();\r\n for (let i = 0; i < 16; i++) {\r\n bytes[i] = this.parseNumber() & 0xff;\r\n }\r\n asm.emit(opCode, bytes);\r\n break;\r\n }\r\n case 'LaneIndex':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'ShuffleMask': {\r\n const mask = new Uint8Array(16);\r\n for (let i = 0; i < 16; i++) {\r\n mask[i] = this.parseNumber();\r\n }\r\n asm.emit(opCode, mask);\r\n break;\r\n }\r\n default:\r\n asm.emit(opCode);\r\n break;\r\n }\r\n }\r\n\r\n getLabelAtDepth(asm: FunctionEmitter, relativeDepth: number): any {\r\n const stack = (asm as any)._controlFlowVerifier._stack;\r\n const targetIndex = stack.length - 1 - relativeDepth;\r\n if (targetIndex < 0 || targetIndex >= stack.length) {\r\n throw this.error(`Invalid branch depth: ${relativeDepth}`);\r\n }\r\n return stack[targetIndex];\r\n }\r\n\r\n resolveBranchTarget(asm: FunctionEmitter): any {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n // Search label stack for matching name (search from top = most recent)\r\n for (let i = this.labelStack.length - 1; i >= 0; i--) {\r\n if (this.labelStack[i].name === id) {\r\n return this.labelStack[i].label;\r\n }\r\n }\r\n throw this.error(`Unknown label: ${id}`);\r\n }\r\n const depth = this.parseNumber();\r\n return this.getLabelAtDepth(asm, depth);\r\n }\r\n\r\n resolveFunction(): FunctionBuilder | ImportBuilder {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const index = this.funcNames.get(id);\r\n if (index === undefined) throw this.error(`Unknown function: ${id}`);\r\n return this.funcList[index];\r\n }\r\n const index = this.parseNumber();\r\n return this.funcList[index];\r\n }\r\n\r\n resolveGlobal(): any {\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const resolved = this.globalNames.get(id);\r\n if (resolved === undefined) throw this.error(`Unknown global: ${id}`);\r\n index = resolved;\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n const importedGlobals = this.moduleBuilder._imports.filter(\r\n (x) => x.externalKind === ExternalKind.Global\r\n );\r\n if (index < importedGlobals.length) {\r\n return importedGlobals[index];\r\n }\r\n return this.moduleBuilder._globals[index - importedGlobals.length];\r\n }\r\n\r\n // --- Table section ---\r\n\r\n parseTable(): void {\r\n // (table (;0;) 1 10 anyfunc)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n\r\n // element type\r\n if (this.peek().type === TokenType.Keyword) {\r\n this.advance(); // anyfunc or funcref\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.defineTable(ElementType.AnyFunc, initial, maximum);\r\n }\r\n\r\n // --- Memory section ---\r\n\r\n parseMemory(): void {\r\n // (memory (;0;) 1 2)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.defineMemory(initial, maximum);\r\n }\r\n\r\n // --- Global section ---\r\n\r\n parseGlobal(): void {\r\n // (global $name i32 (i32.const 0))\r\n // (global $name (mut i32) (i32.const 0))\r\n // (global (;0;) i32 (i32.const 0))\r\n let globalName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n globalName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n\r\n let mutable = false;\r\n let valueType: ValueTypeDescriptor;\r\n\r\n if (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('mut');\r\n valueType = this.parseValueType();\r\n mutable = true;\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n valueType = this.parseValueType();\r\n }\r\n\r\n // Parse init expression (instr)\r\n this.expect(TokenType.LeftParen);\r\n const initInstr = this.advance().value;\r\n let initValue: number | bigint = 0;\r\n\r\n if (initInstr === 'i32.const') {\r\n initValue = this.parseNumber();\r\n } else if (initInstr === 'i64.const') {\r\n initValue = this.parseI64Value();\r\n } else if (initInstr === 'f32.const') {\r\n initValue = this.parseFloat();\r\n } else if (initInstr === 'f64.const') {\r\n initValue = this.parseFloat();\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing init expr\r\n this.expect(TokenType.RightParen); // closing global\r\n\r\n const globalBuilder = this.moduleBuilder.defineGlobal(valueType, mutable, initValue as number);\r\n if (globalName) {\r\n globalBuilder.withName(globalName.substring(1)); // strip $\r\n this.globalNames.set(globalName, globalBuilder._index);\r\n }\r\n }\r\n\r\n // --- Export section ---\r\n\r\n parseExportIndex(): number {\r\n if (this.peek().type === TokenType.Id) {\r\n return -1; // handled by caller\r\n }\r\n return this.parseNumber();\r\n }\r\n\r\n parseExport(): void {\r\n // (export \"name\" (func 0))\r\n // (export \"name\" (func $name))\r\n const name = this.expect(TokenType.String).value;\r\n this.expect(TokenType.LeftParen);\r\n const kind = this.advance().value;\r\n\r\n switch (kind) {\r\n case 'func': {\r\n let funcIndex: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n funcIndex = this.funcNames.get(id)!;\r\n if (funcIndex === undefined) throw this.error(`Unknown function: ${id}`);\r\n } else {\r\n funcIndex = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen); // closing kind\r\n this.expect(TokenType.RightParen); // closing export\r\n const func = this.funcList[funcIndex];\r\n if (func instanceof ImportBuilder) {\r\n throw this.error('Cannot export an imported function directly');\r\n }\r\n this.moduleBuilder.exportFunction(func as FunctionBuilder, name);\r\n break;\r\n }\r\n case 'table': {\r\n const index = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.exportTable(this.moduleBuilder._tables[index], name);\r\n break;\r\n }\r\n case 'memory': {\r\n const index = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.exportMemory(this.moduleBuilder._memories[index], name);\r\n break;\r\n }\r\n case 'global': {\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n index = this.globalNames.get(id)!;\r\n if (index === undefined) throw this.error(`Unknown global: ${id}`);\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n const importedGlobals = this.moduleBuilder._imports.filter(\r\n (x) => x.externalKind === ExternalKind.Global\r\n );\r\n if (index < importedGlobals.length) {\r\n throw this.error('Cannot export an imported global directly');\r\n }\r\n this.moduleBuilder.exportGlobal(\r\n this.moduleBuilder._globals[index - importedGlobals.length], name\r\n );\r\n break;\r\n }\r\n default: {\r\n this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n }\r\n }\r\n }\r\n\r\n // --- Start section ---\r\n\r\n parseStart(): void {\r\n // (start 0) or (start $name)\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n index = this.funcNames.get(id)!;\r\n if (index === undefined) throw this.error(`Unknown function: ${id}`);\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n const func = this.funcList[index];\r\n if (func instanceof FunctionBuilder) {\r\n this.moduleBuilder.setStartFunction(func);\r\n }\r\n }\r\n\r\n // --- Element section ---\r\n\r\n parseElem(): void {\r\n // (elem (;0;) (i32.const 0) func 0 1 2)\r\n // Parse offset expression\r\n this.expect(TokenType.LeftParen);\r\n const offsetInstr = this.advance().value;\r\n let offset = 0;\r\n if (offsetInstr === 'i32.const') {\r\n offset = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n\r\n // \"func\" keyword\r\n if (this.isKeyword('func')) {\r\n this.advance();\r\n }\r\n\r\n // Parse function indices or $name references\r\n const elements: (FunctionBuilder | ImportBuilder)[] = [];\r\n while (this.peek().type === TokenType.Number || this.peek().type === TokenType.Id) {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const idx = this.funcNames.get(id);\r\n if (idx === undefined) throw this.error(`Unknown function: ${id}`);\r\n elements.push(this.funcList[idx]);\r\n } else {\r\n const idx = this.parseNumber();\r\n elements.push(this.funcList[idx]);\r\n }\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n\r\n const table = this.moduleBuilder._tables[0];\r\n this.moduleBuilder.defineTableSegment(table, elements, offset);\r\n }\r\n\r\n // --- Data section ---\r\n\r\n parseData(): void {\r\n // (data (;0;) (i32.const 0) \"hello\\00world\")\r\n this.expect(TokenType.LeftParen);\r\n const offsetInstr = this.advance().value;\r\n let offset = 0;\r\n if (offsetInstr === 'i32.const') {\r\n offset = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n\r\n const dataStr = this.expect(TokenType.String).value;\r\n const bytes = new Uint8Array(dataStr.length);\r\n for (let i = 0; i < dataStr.length; i++) {\r\n bytes[i] = dataStr.charCodeAt(i);\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n\r\n this.moduleBuilder.defineData(bytes, offset);\r\n }\r\n\r\n // --- Helpers ---\r\n\r\n parseValueType(): ValueTypeDescriptor {\r\n const tok = this.advance();\r\n const vt = valueTypeMap[tok.value];\r\n if (!vt) throw this.error(`Unknown value type: ${tok.value}`, tok);\r\n return vt;\r\n }\r\n\r\n parseNumber(): number {\r\n const tok = this.advance();\r\n if (tok.value.startsWith('0x') || tok.value.startsWith('-0x') || tok.value.startsWith('+0x')) {\r\n return parseInt(tok.value.replace(/_/g, ''), 16);\r\n }\r\n return parseInt(tok.value.replace(/_/g, ''), 10);\r\n }\r\n\r\n parseFloat(): number {\r\n const tok = this.advance();\r\n const val = tok.value.replace(/_/g, '');\r\n if (val === 'inf' || val === '+inf') return Infinity;\r\n if (val === '-inf') return -Infinity;\r\n if (val.includes('nan')) return NaN;\r\n if (val.startsWith('0x') || val.startsWith('-0x') || val.startsWith('+0x')) {\r\n return this.parseHexFloat(val);\r\n }\r\n return parseFloat(val);\r\n }\r\n\r\n parseHexFloat(val: string): number {\r\n // Hex float format: 0xHH.HHpEE\r\n const negative = val.startsWith('-');\r\n const clean = val.replace(/^[+-]?0x/, '');\r\n const parts = clean.split('p');\r\n const mantissa = parts[0];\r\n const exponent = parts.length > 1 ? parseInt(parts[1], 10) : 0;\r\n\r\n let result: number;\r\n if (mantissa.includes('.')) {\r\n const [intPart, fracPart] = mantissa.split('.');\r\n result = parseInt(intPart || '0', 16) +\r\n parseInt(fracPart || '0', 16) / Math.pow(16, (fracPart || '').length);\r\n } else {\r\n result = parseInt(mantissa, 16);\r\n }\r\n\r\n result *= Math.pow(2, exponent);\r\n return negative ? -result : result;\r\n }\r\n\r\n parseI64Value(): number | bigint {\r\n const tok = this.advance();\r\n const val = tok.value.replace(/_/g, '');\r\n try {\r\n return BigInt(val);\r\n } catch {\r\n return parseInt(val, 10);\r\n }\r\n }\r\n\r\n isInstruction(): boolean {\r\n // Check if the next s-expr is an instruction (local or something else)\r\n if (!this.isLeftParen()) return false;\r\n const nextTok = this.tokens[this.pos + 1];\r\n if (!nextTok) return false;\r\n return nextTok.value !== 'param' && nextTok.value !== 'result' && nextTok.value !== 'type';\r\n }\r\n}\r\n\r\n/**\r\n * Parse a WAT (WebAssembly Text Format) string into a ModuleBuilder.\r\n */\r\nexport function parseWat(source: string, options?: ModuleBuilderOptions): ModuleBuilder {\r\n const tokens = tokenize(source);\r\n const parser = new WatParserImpl(tokens);\r\n return parser.parse(options);\r\n}\r\n", "import {\r\n ModuleBuilder,\r\n ValueType,\r\n BlockType,\r\n ElementType,\r\n TextModuleWriter,\r\n BinaryReader,\r\n parseWat,\r\n} from '../src/index';\r\n\r\nconst EXAMPLES: Record = {\r\n // \u2500\u2500\u2500 Basics \u2500\u2500\u2500\r\n 'hello-wasm': {\r\n label: 'Hello WASM',\r\n group: 'Basics',\r\n code: `// Hello WASM \u2014 the simplest possible module\r\nconst mod = new webasmjs.ModuleBuilder('hello');\r\n\r\nmod.defineFunction('answer', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.const_i32(42);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst answer = instance.instance.exports.answer;\r\nlog('The answer to everything: ' + answer());`,\r\n },\r\n\r\n factorial: {\r\n label: 'Factorial',\r\n group: 'Basics',\r\n code: `// Factorial \u2014 iterative with loop and block\r\nconst mod = new webasmjs.ModuleBuilder('factorial');\r\n\r\nmod.defineFunction('factorial', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const result = a.declareLocal(webasmjs.ValueType.Int32, 'result');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.const_i32(1);\r\n a.set_local(result);\r\n a.const_i32(1);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(result);\r\n a.get_local(i);\r\n a.mul_i32();\r\n a.set_local(result);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(result);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst factorial = instance.instance.exports.factorial;\r\nfor (let n = 0; n <= 10; n++) {\r\n log(n + '! = ' + factorial(n));\r\n}`,\r\n },\r\n\r\n fibonacci: {\r\n label: 'Fibonacci',\r\n group: 'Basics',\r\n code: `// Fibonacci sequence \u2014 iterative\r\nconst mod = new webasmjs.ModuleBuilder('fibonacci');\r\n\r\nmod.defineFunction('fib', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const prev = a.declareLocal(webasmjs.ValueType.Int32, 'prev');\r\n const curr = a.declareLocal(webasmjs.ValueType.Int32, 'curr');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.get_local(n);\r\n a.return();\r\n });\r\n\r\n a.const_i32(0);\r\n a.set_local(prev);\r\n a.const_i32(1);\r\n a.set_local(curr);\r\n a.const_i32(2);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(curr);\r\n a.set_local(temp);\r\n a.get_local(curr);\r\n a.get_local(prev);\r\n a.add_i32();\r\n a.set_local(curr);\r\n a.get_local(temp);\r\n a.set_local(prev);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(curr);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst fib = instance.instance.exports.fib;\r\nfor (let n = 0; n <= 15; n++) {\r\n log('fib(' + n + ') = ' + fib(n));\r\n}`,\r\n },\r\n\r\n 'if-else': {\r\n label: 'If/Else',\r\n group: 'Basics',\r\n code: `// If/Else \u2014 absolute value and sign function\r\nconst mod = new webasmjs.ModuleBuilder('ifElse');\r\n\r\n// Absolute value using if/else with typed block\r\nmod.defineFunction('abs', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.lt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(0);\r\n a.get_local(f.getParameter(0));\r\n a.sub_i32();\r\n a.else();\r\n a.get_local(f.getParameter(0));\r\n a.end();\r\n}).withExport();\r\n\r\n// Sign function: returns -1, 0, or 1\r\nmod.defineFunction('sign', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.lt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(-1);\r\n a.else();\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.gt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(1);\r\n a.else();\r\n a.const_i32(0);\r\n a.end();\r\n a.end();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { abs, sign } = instance.instance.exports;\r\n\r\nlog('abs(5) = ' + abs(5));\r\nlog('abs(-5) = ' + abs(-5));\r\nlog('abs(0) = ' + abs(0));\r\nlog('');\r\nlog('sign(42) = ' + sign(42));\r\nlog('sign(-7) = ' + sign(-7));\r\nlog('sign(0) = ' + sign(0));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Memory \u2500\u2500\u2500\r\n memory: {\r\n label: 'Memory Basics',\r\n group: 'Memory',\r\n code: `// Memory: store and load values\r\nconst mod = new webasmjs.ModuleBuilder('memoryExample');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\nmod.defineFunction('store', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('load', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { store, load } = instance.instance.exports;\r\n\r\nstore(0, 42);\r\nstore(4, 100);\r\nlog('Value at address 0: ' + load(0));\r\nlog('Value at address 4: ' + load(4));\r\nstore(0, load(0) + load(4));\r\nlog('Sum stored at 0: ' + load(0));`,\r\n },\r\n\r\n 'byte-array': {\r\n label: 'Byte Array',\r\n group: 'Memory',\r\n code: `// Byte array \u2014 store and sum individual bytes\r\nconst mod = new webasmjs.ModuleBuilder('byteArray');\r\nmod.defineMemory(1);\r\n\r\n// Store a byte at offset\r\nmod.defineFunction('setByte', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store8_i32(0, 0);\r\n}).withExport();\r\n\r\n// Load a byte from offset\r\nmod.defineFunction('getByte', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load8_i32_u(0, 0);\r\n}).withExport();\r\n\r\n// Sum bytes from offset 0 to length-1\r\nmod.defineFunction('sumBytes', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const len = f.getParameter(0);\r\n const sum = a.declareLocal(webasmjs.ValueType.Int32, 'sum');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.const_i32(0);\r\n a.set_local(sum);\r\n a.const_i32(0);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(len);\r\n a.ge_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(sum);\r\n a.get_local(i);\r\n a.load8_i32_u(0, 0);\r\n a.add_i32();\r\n a.set_local(sum);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(sum);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { setByte, getByte, sumBytes } = instance.instance.exports;\r\n\r\n// Fill bytes 0..9 with values 10, 20, 30, ...\r\nfor (let i = 0; i < 10; i++) {\r\n setByte(i, (i + 1) * 10);\r\n}\r\n\r\nlog('Stored bytes:');\r\nfor (let i = 0; i < 10; i++) {\r\n log(' [' + i + '] = ' + getByte(i));\r\n}\r\nlog('Sum of 10 bytes: ' + sumBytes(10));`,\r\n },\r\n\r\n 'string-memory': {\r\n label: 'Strings in Memory',\r\n group: 'Memory',\r\n code: `// Strings in memory \u2014 store a string, compute its length\r\nconst mod = new webasmjs.ModuleBuilder('stringMem');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// Store a data segment with a string at offset 0\r\nconst greeting = new TextEncoder().encode('Hello, WebAssembly!');\r\nmod.defineData(new Uint8Array([...greeting, 0]), 0); // null-terminated\r\n\r\n// strlen: count bytes until null\r\nmod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const ptr = f.getParameter(0);\r\n const len = a.declareLocal(webasmjs.ValueType.Int32, 'len');\r\n\r\n a.const_i32(0);\r\n a.set_local(len);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n // Load byte at ptr + len\r\n a.get_local(ptr);\r\n a.get_local(len);\r\n a.add_i32();\r\n a.load8_i32_u(0, 0);\r\n a.eqz_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(len);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(len);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { strlen, memory } = instance.instance.exports;\r\n\r\n// Read the string from memory\r\nconst memView = new Uint8Array(memory.buffer);\r\nconst strLen = strlen(0);\r\nconst str = new TextDecoder().decode(memView.slice(0, strLen));\r\n\r\nlog('String in memory: \"' + str + '\"');\r\nlog('Length: ' + strLen);`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Globals & State \u2500\u2500\u2500\r\n globals: {\r\n label: 'Global Counter',\r\n group: 'Globals',\r\n code: `// Globals: mutable counter\r\nconst mod = new webasmjs.ModuleBuilder('globals');\r\n\r\nconst counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\nmod.defineFunction('increment', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(counter);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_global(counter);\r\n a.get_global(counter);\r\n}).withExport();\r\n\r\nmod.defineFunction('getCount', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(counter);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { increment, getCount } = instance.instance.exports;\r\n\r\nlog('Initial: ' + getCount());\r\nincrement();\r\nincrement();\r\nincrement();\r\nlog('After 3 increments: ' + getCount());\r\nfor (let i = 0; i < 7; i++) increment();\r\nlog('After 7 more: ' + getCount());`,\r\n },\r\n\r\n 'start-function': {\r\n label: 'Start Function',\r\n group: 'Globals',\r\n code: `// Start function \u2014 runs automatically on instantiation\r\nconst mod = new webasmjs.ModuleBuilder('startExample');\r\n\r\nconst initialized = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\n// This function runs automatically at instantiation\r\nconst initFn = mod.defineFunction('init', null, [], (f, a) => {\r\n a.const_i32(1);\r\n a.set_global(initialized);\r\n});\r\nmod.setStartFunction(initFn);\r\n\r\n// Exported getter\r\nmod.defineFunction('isInitialized', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(initialized);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isInitialized } = instance.instance.exports;\r\nlog('isInitialized (should be 1): ' + isInitialized());\r\nlog('The start function ran automatically!');`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Functions & Calls \u2500\u2500\u2500\r\n 'multi-func': {\r\n label: 'Function Calls',\r\n group: 'Functions',\r\n code: `// Multiple functions calling each other\r\nconst mod = new webasmjs.ModuleBuilder('multiFn');\r\n\r\n// Helper: square\r\nmod.defineFunction('square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(0));\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Helper: double\r\nmod.defineFunction('double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(2);\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Composed: 2 * x^2\r\nconst squareFn = mod._functions[0];\r\nconst doubleFn = mod._functions[1];\r\n\r\nmod.defineFunction('doubleSquare', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.call(squareFn);\r\n a.call(doubleFn);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { square, double: dbl, doubleSquare } = instance.instance.exports;\r\n\r\nfor (let x = 1; x <= 5; x++) {\r\n log('x=' + x + ': square=' + square(x) + ', double=' + dbl(x) + ', 2x\u00B2=' + doubleSquare(x));\r\n}`,\r\n },\r\n\r\n 'imports': {\r\n label: 'Import Functions',\r\n group: 'Functions',\r\n code: `// Importing host functions \u2014 WASM calling JavaScript\r\nconst mod = new webasmjs.ModuleBuilder('imports');\r\n\r\n// Declare an import: env.print takes an i32\r\nconst printImport = mod.importFunction('env', 'print', null, [webasmjs.ValueType.Int32]);\r\n\r\n// Declare another import: env.getTime returns an i32\r\nconst getTimeImport = mod.importFunction('env', 'getTime', [webasmjs.ValueType.Int32], []);\r\n\r\nmod.defineFunction('run', null, [], (f, a) => {\r\n // Call getTime, then print it\r\n a.call(getTimeImport);\r\n a.call(printImport);\r\n\r\n // Print some constants\r\n a.const_i32(100);\r\n a.call(printImport);\r\n a.const_i32(200);\r\n a.call(printImport);\r\n a.const_i32(300);\r\n a.call(printImport);\r\n}).withExport();\r\n\r\nconst logged = [];\r\nconst instance = await mod.instantiate({\r\n env: {\r\n print: (v) => { logged.push(v); },\r\n getTime: () => Date.now() & 0x7FFFFFFF,\r\n },\r\n});\r\n\r\ninstance.instance.exports.run();\r\n\r\nlog('Values printed by WASM:');\r\nlogged.forEach((v, i) => log(' [' + i + '] ' + v));`,\r\n },\r\n\r\n 'indirect-call': {\r\n label: 'Indirect Calls (Table)',\r\n group: 'Functions',\r\n code: `// Indirect calls via function table\r\nconst mod = new webasmjs.ModuleBuilder('indirectCall');\r\n\r\nconst add = mod.defineFunction('add', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n});\r\n\r\nconst sub = mod.defineFunction('sub', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.sub_i32();\r\n});\r\n\r\nconst mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i32();\r\n});\r\n\r\n// Create a table with 3 entries\r\nconst table = mod.defineTable(webasmjs.ElementType.AnyFunc, 3);\r\nmod.defineTableSegment(table, [add, sub, mul], 0);\r\n\r\n// Dispatcher: call function at table[opIndex](a, b)\r\nmod.defineFunction('dispatch', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(1)); // a\r\n a.get_local(f.getParameter(2)); // b\r\n a.get_local(f.getParameter(0)); // table index\r\n a.call_indirect(add.funcTypeBuilder);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { dispatch } = instance.instance.exports;\r\n\r\nconst ops = ['add', 'sub', 'mul'];\r\nfor (let op = 0; op < 3; op++) {\r\n log(ops[op] + '(10, 3) = ' + dispatch(op, 10, 3));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Numeric Types \u2500\u2500\u2500\r\n 'float-math': {\r\n label: 'Float Math',\r\n group: 'Numeric',\r\n code: `// Floating-point operations \u2014 f64 math functions\r\nconst mod = new webasmjs.ModuleBuilder('floatMath');\r\n\r\n// Distance: sqrt(dx*dx + dy*dy)\r\nmod.defineFunction('distance', [webasmjs.ValueType.Float64],\r\n [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64,\r\n webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => {\r\n const x1 = f.getParameter(0);\r\n const y1 = f.getParameter(1);\r\n const x2 = f.getParameter(2);\r\n const y2 = f.getParameter(3);\r\n const dx = a.declareLocal(webasmjs.ValueType.Float64, 'dx');\r\n const dy = a.declareLocal(webasmjs.ValueType.Float64, 'dy');\r\n\r\n // dx = x2 - x1\r\n a.get_local(x2);\r\n a.get_local(x1);\r\n a.sub_f64();\r\n a.set_local(dx);\r\n\r\n // dy = y2 - y1\r\n a.get_local(y2);\r\n a.get_local(y1);\r\n a.sub_f64();\r\n a.set_local(dy);\r\n\r\n // sqrt(dx*dx + dy*dy)\r\n a.get_local(dx);\r\n a.get_local(dx);\r\n a.mul_f64();\r\n a.get_local(dy);\r\n a.get_local(dy);\r\n a.mul_f64();\r\n a.add_f64();\r\n a.sqrt_f64();\r\n}).withExport();\r\n\r\n// Rounding functions\r\nmod.defineFunction('roundUp', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.ceil_f64();\r\n}).withExport();\r\n\r\nmod.defineFunction('roundDown', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.floor_f64();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { distance, roundUp, roundDown } = instance.instance.exports;\r\n\r\nlog('distance((0,0), (3,4)) = ' + distance(0, 0, 3, 4));\r\nlog('distance((1,1), (4,5)) = ' + distance(1, 1, 4, 5));\r\nlog('');\r\nlog('roundUp(2.3) = ' + roundUp(2.3));\r\nlog('roundUp(2.7) = ' + roundUp(2.7));\r\nlog('roundDown(2.3) = ' + roundDown(2.3));\r\nlog('roundDown(2.7) = ' + roundDown(2.7));`,\r\n },\r\n\r\n 'i64-bigint': {\r\n label: 'i64 / BigInt',\r\n group: 'Numeric',\r\n code: `// 64-bit integers \u2014 BigInt interop\r\nconst mod = new webasmjs.ModuleBuilder('i64ops');\r\n\r\nmod.defineFunction('add64', [webasmjs.ValueType.Int64],\r\n [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i64();\r\n}).withExport();\r\n\r\nmod.defineFunction('mul64', [webasmjs.ValueType.Int64],\r\n [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i64();\r\n}).withExport();\r\n\r\n// Factorial with i64 \u2014 can handle larger numbers\r\nmod.defineFunction('factorial64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int64], (f, a) => {\r\n const n = f.getParameter(0);\r\n const result = a.declareLocal(webasmjs.ValueType.Int64, 'result');\r\n const i = a.declareLocal(webasmjs.ValueType.Int64, 'i');\r\n\r\n a.const_i64(1n);\r\n a.set_local(result);\r\n a.const_i64(1n);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i64();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(result);\r\n a.get_local(i);\r\n a.mul_i64();\r\n a.set_local(result);\r\n\r\n a.get_local(i);\r\n a.const_i64(1n);\r\n a.add_i64();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(result);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { add64, mul64, factorial64 } = instance.instance.exports;\r\n\r\nlog('add64(1000000000000n, 2000000000000n) = ' + add64(1000000000000n, 2000000000000n));\r\nlog('mul64(123456789n, 987654321n) = ' + mul64(123456789n, 987654321n));\r\nlog('');\r\nlog('Factorial with i64 (no overflow up to 20!):');\r\nfor (let n = 0n; n <= 20n; n++) {\r\n log(' ' + n + '! = ' + factorial64(n));\r\n}`,\r\n },\r\n\r\n 'type-conversions': {\r\n label: 'Type Conversions',\r\n group: 'Numeric',\r\n code: `// Type conversions between numeric types\r\nconst mod = new webasmjs.ModuleBuilder('conversions');\r\n\r\n// i32 to f64\r\nmod.defineFunction('i32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.convert_i32_s_f64();\r\n}).withExport();\r\n\r\n// f64 to i32 (truncate)\r\nmod.defineFunction('f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_f64_s_i32();\r\n}).withExport();\r\n\r\n// i32 to i64 (sign extend)\r\nmod.defineFunction('i32_to_i64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend_i32_s_i64();\r\n}).withExport();\r\n\r\n// i64 to i32 (wrap)\r\nmod.defineFunction('i64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.wrap_i64_i32();\r\n}).withExport();\r\n\r\n// f32 to f64 (promote)\r\nmod.defineFunction('f32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.promote_f32_f64();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { i32_to_f64, f64_to_i32, i32_to_i64, i64_to_i32, f32_to_f64 } = instance.instance.exports;\r\n\r\nlog('i32(42) \u2192 f64: ' + i32_to_f64(42));\r\nlog('f64(3.14) \u2192 i32: ' + f64_to_i32(3.14));\r\nlog('f64(99.9) \u2192 i32: ' + f64_to_i32(99.9));\r\nlog('i32(42) \u2192 i64: ' + i32_to_i64(42));\r\nlog('i32(-1) \u2192 i64: ' + i32_to_i64(-1));\r\nlog('i64(0x1FFFFFFFFn) \u2192 i32: ' + i64_to_i32(0x1FFFFFFFFn));\r\nlog('f32(3.14) \u2192 f64: ' + f32_to_f64(3.140000104904175));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Algorithms \u2500\u2500\u2500\r\n 'bubble-sort': {\r\n label: 'Bubble Sort',\r\n group: 'Algorithms',\r\n code: `// Bubble sort in WASM memory\r\nconst mod = new webasmjs.ModuleBuilder('bubbleSort');\r\nmod.defineMemory(1);\r\n\r\n// Store i32 at index (index * 4)\r\nmod.defineFunction('set', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(4);\r\n a.mul_i32();\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0);\r\n}).withExport();\r\n\r\n// Load i32 at index\r\nmod.defineFunction('get', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(4);\r\n a.mul_i32();\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\nconst setFn = mod._functions[0];\r\nconst getFn = mod._functions[1];\r\n\r\n// Bubble sort(length)\r\nmod.defineFunction('sort', null, [webasmjs.ValueType.Int32], (f, a) => {\r\n const len = f.getParameter(0);\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n const j = a.declareLocal(webasmjs.ValueType.Int32, 'j');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n const swapped = a.declareLocal(webasmjs.ValueType.Int32, 'swapped');\r\n\r\n a.const_i32(0);\r\n a.set_local(i);\r\n\r\n // Outer loop\r\n a.loop(webasmjs.BlockType.Void, (outerLoop) => {\r\n a.block(webasmjs.BlockType.Void, (outerBreak) => {\r\n a.get_local(i);\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.sub_i32();\r\n a.ge_i32();\r\n a.br_if(outerBreak);\r\n\r\n a.const_i32(0);\r\n a.set_local(swapped);\r\n a.const_i32(0);\r\n a.set_local(j);\r\n\r\n // Inner loop\r\n a.loop(webasmjs.BlockType.Void, (innerLoop) => {\r\n a.block(webasmjs.BlockType.Void, (innerBreak) => {\r\n a.get_local(j);\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.sub_i32();\r\n a.get_local(i);\r\n a.sub_i32();\r\n a.ge_i32();\r\n a.br_if(innerBreak);\r\n\r\n // if arr[j] > arr[j+1], swap\r\n a.get_local(j);\r\n a.call(getFn);\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.call(getFn);\r\n a.gt_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n // temp = arr[j]\r\n a.get_local(j);\r\n a.call(getFn);\r\n a.set_local(temp);\r\n // arr[j] = arr[j+1]\r\n a.get_local(j);\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.call(getFn);\r\n a.call(setFn);\r\n // arr[j+1] = temp\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.get_local(temp);\r\n a.call(setFn);\r\n a.const_i32(1);\r\n a.set_local(swapped);\r\n });\r\n\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(j);\r\n a.br(innerLoop);\r\n });\r\n });\r\n\r\n // Early exit if no swaps\r\n a.get_local(swapped);\r\n a.eqz_i32();\r\n a.br_if(outerBreak);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(outerLoop);\r\n });\r\n });\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { set, get, sort } = instance.instance.exports;\r\n\r\nconst data = [64, 34, 25, 12, 22, 11, 90, 1, 55, 42];\r\nlog('Before: ' + data.join(', '));\r\n\r\ndata.forEach((v, i) => set(i, v));\r\nsort(data.length);\r\n\r\nconst sorted = [];\r\nfor (let i = 0; i < data.length; i++) sorted.push(get(i));\r\nlog('After: ' + sorted.join(', '));`,\r\n },\r\n\r\n 'gcd': {\r\n label: 'GCD (Euclidean)',\r\n group: 'Algorithms',\r\n code: `// Greatest common divisor \u2014 Euclidean algorithm\r\nconst mod = new webasmjs.ModuleBuilder('gcd');\r\n\r\nmod.defineFunction('gcd', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const x = f.getParameter(0);\r\n const y = f.getParameter(1);\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(y);\r\n a.eqz_i32();\r\n a.br_if(breakLabel);\r\n\r\n // temp = y\r\n a.get_local(y);\r\n a.set_local(temp);\r\n // y = x % y\r\n a.get_local(x);\r\n a.get_local(y);\r\n a.rem_i32_u();\r\n a.set_local(y);\r\n // x = temp\r\n a.get_local(temp);\r\n a.set_local(x);\r\n\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(x);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { gcd } = instance.instance.exports;\r\n\r\nconst pairs = [[12, 8], [100, 75], [17, 13], [48, 18], [0, 5], [7, 0], [1071, 462]];\r\nfor (const [a, b] of pairs) {\r\n log('gcd(' + a + ', ' + b + ') = ' + gcd(a, b));\r\n}`,\r\n },\r\n\r\n 'collatz': {\r\n label: 'Collatz Conjecture',\r\n group: 'Algorithms',\r\n code: `// Collatz conjecture \u2014 count steps to reach 1\r\nconst mod = new webasmjs.ModuleBuilder('collatz');\r\n\r\nmod.defineFunction('collatz', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const steps = a.declareLocal(webasmjs.ValueType.Int32, 'steps');\r\n\r\n a.const_i32(0);\r\n a.set_local(steps);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(steps);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(steps);\r\n\r\n // if n is odd: n = 3n + 1, else: n = n / 2\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.and_i32();\r\n a.if(webasmjs.BlockType.Void);\r\n // odd: n = 3n + 1\r\n a.get_local(n);\r\n a.const_i32(3);\r\n a.mul_i32();\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(n);\r\n a.else();\r\n // even: n = n / 2\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.shr_i32_u();\r\n a.set_local(n);\r\n a.end();\r\n\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(steps);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { collatz } = instance.instance.exports;\r\n\r\nfor (const n of [1, 2, 3, 6, 7, 9, 27, 97, 871]) {\r\n log('collatz(' + n + ') = ' + collatz(n) + ' steps');\r\n}`,\r\n },\r\n\r\n 'is-prime': {\r\n label: 'Primality Test',\r\n group: 'Algorithms',\r\n code: `// Primality test \u2014 trial division\r\nconst mod = new webasmjs.ModuleBuilder('prime');\r\n\r\nmod.defineFunction('isPrime', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n // n <= 1 \u2192 not prime\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n // n <= 3 \u2192 prime\r\n a.get_local(n);\r\n a.const_i32(3);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(1);\r\n a.return();\r\n });\r\n\r\n // divisible by 2 \u2192 not prime\r\n a.get_local(n);\r\n a.const_i32(2);\r\n a.rem_i32_u();\r\n a.eqz_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n // Trial division from 3 to sqrt(n)\r\n a.const_i32(3);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n // if i * i > n, break (is prime)\r\n a.get_local(i);\r\n a.get_local(i);\r\n a.mul_i32();\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n // if n % i == 0, not prime\r\n a.get_local(n);\r\n a.get_local(i);\r\n a.rem_i32_u();\r\n a.eqz_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n a.get_local(i);\r\n a.const_i32(2);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.const_i32(1);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isPrime } = instance.instance.exports;\r\n\r\nlog('Prime numbers up to 100:');\r\nconst primes = [];\r\nfor (let n = 2; n <= 100; n++) {\r\n if (isPrime(n)) primes.push(n);\r\n}\r\nlog(primes.join(', '));\r\nlog('');\r\nlog('Testing larger numbers:');\r\nfor (const n of [997, 1000, 7919, 7920, 104729]) {\r\n log(n + ' is ' + (isPrime(n) ? 'prime' : 'not prime'));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 WAT Parser \u2500\u2500\u2500\r\n 'wat-parser': {\r\n label: 'WAT Parser',\r\n group: 'WAT',\r\n code: `// Parse WAT text and instantiate\r\nconst watSource = \\`\r\n(module $parsed\r\n (func $add (param i32) (param i32) (result i32)\r\n local.get 0\r\n local.get 1\r\n i32.add\r\n )\r\n (export \"add\" (func $add))\r\n)\r\n\\`;\r\n\r\nlog('Parsing WAT source...');\r\nconst mod = webasmjs.parseWat(watSource);\r\nlog('WAT parsed successfully!');\r\nlog('');\r\n\r\nconst instance = await mod.instantiate();\r\nconst add = instance.instance.exports.add;\r\nlog('add(3, 4) = ' + add(3, 4));\r\nlog('add(100, 200) = ' + add(100, 200));\r\nlog('add(-5, 10) = ' + add(-5, 10));`,\r\n },\r\n\r\n 'wat-loop': {\r\n label: 'WAT Loop & Branch',\r\n group: 'WAT',\r\n code: `// WAT with loop and branch instructions\r\nconst watSource = \\`\r\n(module $loops\r\n (func $sum (param i32) (result i32)\r\n (local i32) ;; accumulator\r\n (local i32) ;; counter\r\n i32.const 0\r\n local.set 1\r\n i32.const 1\r\n local.set 2\r\n block $break\r\n loop $continue\r\n local.get 2\r\n local.get 0\r\n i32.gt_s\r\n br_if $break\r\n\r\n local.get 1\r\n local.get 2\r\n i32.add\r\n local.set 1\r\n\r\n local.get 2\r\n i32.const 1\r\n i32.add\r\n local.set 2\r\n br $continue\r\n end\r\n end\r\n local.get 1\r\n )\r\n (export \"sum\" (func $sum))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst sum = instance.instance.exports.sum;\r\n\r\nlog('Sum from 1 to N:');\r\nfor (const n of [0, 1, 5, 10, 50, 100]) {\r\n log(' sum(' + n + ') = ' + sum(n));\r\n}`,\r\n },\r\n\r\n 'wat-memory': {\r\n label: 'WAT Memory & Data',\r\n group: 'WAT',\r\n code: `// WAT with memory, data segments, and imports\r\nconst watSource = \\`\r\n(module $memTest\r\n (memory 1)\r\n (func $store (param i32) (param i32)\r\n local.get 0\r\n local.get 1\r\n i32.store offset=0 align=4\r\n )\r\n (func $load (param i32) (result i32)\r\n local.get 0\r\n i32.load offset=0 align=4\r\n )\r\n (export \"store\" (func $store))\r\n (export \"load\" (func $load))\r\n (export \"mem\" (memory 0))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst { store, load, mem } = instance.instance.exports;\r\n\r\n// Store values at various offsets\r\nstore(0, 11);\r\nstore(4, 22);\r\nstore(8, 33);\r\nstore(12, 44);\r\n\r\nlog('Memory contents:');\r\nfor (let addr = 0; addr < 16; addr += 4) {\r\n log(' [' + addr + '] = ' + load(addr));\r\n}\r\n\r\n// Also inspect raw memory\r\nconst view = new Uint8Array(mem.buffer);\r\nlog('');\r\nlog('Raw bytes [0..15]: ' + Array.from(view.slice(0, 16)).join(', '));`,\r\n },\r\n\r\n 'wat-global': {\r\n label: 'WAT Globals & Start',\r\n group: 'WAT',\r\n code: `// WAT with globals, start function, and if/else\r\nconst watSource = \\`\r\n(module $globalDemo\r\n (global $counter (mut i32) (i32.const 0))\r\n\r\n (func $init\r\n i32.const 100\r\n global.set 0\r\n )\r\n\r\n (func $inc (result i32)\r\n global.get 0\r\n i32.const 1\r\n i32.add\r\n global.set 0\r\n global.get 0\r\n )\r\n\r\n (func $dec (result i32)\r\n global.get 0\r\n i32.const 1\r\n i32.sub\r\n global.set 0\r\n global.get 0\r\n )\r\n\r\n (func $getCounter (result i32)\r\n global.get 0\r\n )\r\n\r\n (start $init)\r\n (export \"inc\" (func $inc))\r\n (export \"dec\" (func $dec))\r\n (export \"getCounter\" (func $getCounter))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst { inc, dec, getCounter } = instance.instance.exports;\r\n\r\nlog('Initial (set by start): ' + getCounter());\r\nlog('inc() = ' + inc());\r\nlog('inc() = ' + inc());\r\nlog('inc() = ' + inc());\r\nlog('dec() = ' + dec());\r\nlog('Final: ' + getCounter());`,\r\n },\r\n\r\n // \u2500\u2500\u2500 SIMD \u2500\u2500\u2500\r\n 'simd-vec-add': {\r\n label: 'SIMD Vector Add',\r\n group: 'SIMD',\r\n code: `// SIMD: add two f32x4 vectors in memory\r\nconst mod = new webasmjs.ModuleBuilder('simdAdd');\r\nmod.defineMemory(1);\r\n\r\n// vec4_add(srcA, srcB, dst) \u2014 adds two 4-float vectors\r\nmod.defineFunction('vec4_add', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.add_f32x4();\r\n a.get_local(f.getParameter(2));\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getF32', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { vec4_add, setF32, getF32 } = instance.instance.exports;\r\n\r\n// A = [1, 2, 3, 4] at offset 0\r\n// B = [10, 20, 30, 40] at offset 16\r\nfor (let i = 0; i < 4; i++) {\r\n setF32(i * 4, i + 1);\r\n setF32(16 + i * 4, (i + 1) * 10);\r\n}\r\n\r\nvec4_add(0, 16, 32);\r\n\r\nlog('A = [1, 2, 3, 4]');\r\nlog('B = [10, 20, 30, 40]');\r\nlog('A + B:');\r\nfor (let i = 0; i < 4; i++) {\r\n log(' [' + i + '] = ' + getF32(32 + i * 4));\r\n}`,\r\n },\r\n\r\n 'simd-dot-product': {\r\n label: 'SIMD Dot Product',\r\n group: 'SIMD',\r\n code: `// SIMD dot product: multiply element-wise then sum lanes\r\nconst mod = new webasmjs.ModuleBuilder('simdDot');\r\nmod.defineMemory(1);\r\n\r\nmod.defineFunction('dot4', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const products = a.declareLocal(webasmjs.ValueType.V128, 'products');\r\n\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.mul_f32x4();\r\n a.set_local(products);\r\n\r\n // Sum all 4 lanes\r\n a.get_local(products);\r\n a.extract_lane_f32x4(0);\r\n a.get_local(products);\r\n a.extract_lane_f32x4(1);\r\n a.add_f32();\r\n a.get_local(products);\r\n a.extract_lane_f32x4(2);\r\n a.add_f32();\r\n a.get_local(products);\r\n a.extract_lane_f32x4(3);\r\n a.add_f32();\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { dot4, setF32 } = instance.instance.exports;\r\n\r\nconst vecA = [1, 2, 3, 4];\r\nconst vecB = [5, 6, 7, 8];\r\n\r\nfor (let i = 0; i < 4; i++) {\r\n setF32(i * 4, vecA[i]);\r\n setF32(16 + i * 4, vecB[i]);\r\n}\r\n\r\nlog('A = [' + vecA + ']');\r\nlog('B = [' + vecB + ']');\r\nlog('dot(A, B) = ' + dot4(0, 16));\r\nlog('Expected: ' + (1*5 + 2*6 + 3*7 + 4*8));`,\r\n },\r\n\r\n 'simd-splat-scale': {\r\n label: 'SIMD Splat & Scale',\r\n group: 'SIMD',\r\n code: `// SIMD splat: broadcast a scalar to all lanes, then multiply\r\nconst mod = new webasmjs.ModuleBuilder('simdScale');\r\nmod.defineMemory(1);\r\n\r\n// scale_vec4(src, dst, scalar) \u2014 multiply a vector by a scalar\r\nmod.defineFunction('scale_vec4', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(2));\r\n a.splat_f32x4(); // broadcast scalar to all 4 lanes\r\n a.mul_f32x4();\r\n a.get_local(f.getParameter(1));\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getF32', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { scale_vec4, setF32, getF32 } = instance.instance.exports;\r\n\r\nconst vec = [2.0, 4.0, 6.0, 8.0];\r\nfor (let i = 0; i < 4; i++) setF32(i * 4, vec[i]);\r\n\r\nscale_vec4(0, 16, 3.0);\r\n\r\nlog('Vector: [' + vec + ']');\r\nlog('Scalar: 3.0');\r\nlog('Scaled:');\r\nfor (let i = 0; i < 4; i++) {\r\n log(' [' + i + '] = ' + getF32(16 + i * 4));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Bulk Memory \u2500\u2500\u2500\r\n 'bulk-memory': {\r\n label: 'Bulk Memory Ops',\r\n group: 'Bulk Memory',\r\n code: `// Bulk memory: memory.fill and memory.copy\r\nconst mod = new webasmjs.ModuleBuilder('bulkMem');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// fill(dest, value, length)\r\nmod.defineFunction('fill', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.get_local(f.getParameter(2));\r\n a.memory_fill(0);\r\n}).withExport();\r\n\r\n// copy(dest, src, length)\r\nmod.defineFunction('copy', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.get_local(f.getParameter(2));\r\n a.memory_copy(0, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { fill, copy, memory } = instance.instance.exports;\r\nconst view = new Uint8Array(memory.buffer);\r\n\r\n// Fill 8 bytes at offset 0 with 0xAA\r\nfill(0, 0xAA, 8);\r\nlog('After fill(0, 0xAA, 8):');\r\nlog(' bytes[0..7] = [' + Array.from(view.slice(0, 8)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']');\r\n\r\n// Copy those 8 bytes to offset 32\r\ncopy(32, 0, 8);\r\nlog('');\r\nlog('After copy(32, 0, 8):');\r\nlog(' bytes[32..39] = [' + Array.from(view.slice(32, 40)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']');\r\n\r\n// Fill a region with incrementing pattern using a loop\r\nfill(64, 0, 16);\r\nfor (let i = 0; i < 16; i++) {\r\n view[64 + i] = i * 3;\r\n}\r\nlog('');\r\nlog('Manual pattern at [64..79]:');\r\nlog(' ' + Array.from(view.slice(64, 80)).join(', '));\r\n\r\n// Copy that pattern further\r\ncopy(128, 64, 16);\r\nlog('Copied to [128..143]:');\r\nlog(' ' + Array.from(view.slice(128, 144)).join(', '));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Post-MVP Features \u2500\u2500\u2500\r\n 'sign-extend': {\r\n label: 'Sign Extension',\r\n group: 'Post-MVP',\r\n code: `// Sign extension: interpret low bits as signed values\r\nconst mod = new webasmjs.ModuleBuilder('signExt');\r\n\r\n// Treat low 8 bits as a signed byte\r\nmod.defineFunction('extend8', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend8_s_i32();\r\n}).withExport();\r\n\r\n// Treat low 16 bits as a signed i16\r\nmod.defineFunction('extend16', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend16_s_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { extend8, extend16 } = instance.instance.exports;\r\n\r\nlog('i32.extend8_s:');\r\nlog(' extend8(0x7F) = ' + extend8(0x7F) + ' (127, positive byte)');\r\nlog(' extend8(0x80) = ' + extend8(0x80) + ' (128 \u2192 -128, sign bit set)');\r\nlog(' extend8(0xFF) = ' + extend8(0xFF) + ' (255 \u2192 -1)');\r\nlog(' extend8(0x100) = ' + extend8(0x100) + ' (256 \u2192 0, wraps to low byte)');\r\nlog('');\r\nlog('i32.extend16_s:');\r\nlog(' extend16(0x7FFF) = ' + extend16(0x7FFF) + ' (32767, positive)');\r\nlog(' extend16(0x8000) = ' + extend16(0x8000) + ' (32768 \u2192 -32768)');\r\nlog(' extend16(0xFFFF) = ' + extend16(0xFFFF) + ' (65535 \u2192 -1)');`,\r\n },\r\n\r\n 'sat-trunc': {\r\n label: 'Saturating Truncation',\r\n group: 'Post-MVP',\r\n code: `// Saturating truncation: float \u2192 int without trapping on overflow\r\nconst mod = new webasmjs.ModuleBuilder('satTrunc');\r\n\r\n// Normal trunc would trap on overflow; saturating clamps instead\r\nmod.defineFunction('sat_f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_sat_f64_s_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('sat_f64_to_u32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_sat_f64_u_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { sat_f64_to_i32, sat_f64_to_u32 } = instance.instance.exports;\r\n\r\nlog('Saturating f64 \u2192 i32 (signed):');\r\nlog(' 42.9 \u2192 ' + sat_f64_to_i32(42.9));\r\nlog(' -42.9 \u2192 ' + sat_f64_to_i32(-42.9));\r\nlog(' 1e20 \u2192 ' + sat_f64_to_i32(1e20) + ' (clamped to i32 max)');\r\nlog(' -1e20 \u2192 ' + sat_f64_to_i32(-1e20) + ' (clamped to i32 min)');\r\nlog(' NaN \u2192 ' + sat_f64_to_i32(NaN) + ' (NaN \u2192 0)');\r\nlog(' Inf \u2192 ' + sat_f64_to_i32(Infinity) + ' (clamped)');\r\nlog('');\r\nlog('Saturating f64 \u2192 u32 (unsigned, shown as signed i32):');\r\nlog(' 42.9 \u2192 ' + sat_f64_to_u32(42.9));\r\nlog(' -1.0 \u2192 ' + sat_f64_to_u32(-1.0) + ' (negative \u2192 0)');\r\nlog(' 1e20 \u2192 ' + sat_f64_to_u32(1e20) + ' (clamped to u32 max)');`,\r\n },\r\n\r\n 'ref-types': {\r\n label: 'Reference Types',\r\n group: 'Post-MVP',\r\n code: `// Reference types: ref.null, ref.is_null, ref.func\r\nconst mod = new webasmjs.ModuleBuilder('refTypes');\r\n\r\nconst double = mod.defineFunction('double', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(2);\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Check if a null funcref is null \u2192 1\r\nmod.defineFunction('isRefNull', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.ref_null(0x70);\r\n a.ref_is_null();\r\n}).withExport();\r\n\r\n// Check if a real function ref is null \u2192 0\r\nmod.defineFunction('isFuncNull', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.ref_func(double);\r\n a.ref_is_null();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isRefNull, isFuncNull } = instance.instance.exports;\r\n\r\nlog('ref.null + ref.is_null:');\r\nlog(' null funcref is null: ' + (isRefNull() === 1));\r\nlog(' real func ref is null: ' + (isFuncNull() === 1));\r\nlog('');\r\nlog('double(21) = ' + instance.instance.exports.double(21));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Debug & Inspection \u2500\u2500\u2500\r\n 'debug-names': {\r\n label: 'Debug Name Section',\r\n group: 'Debug',\r\n code: `// Inspect the debug name section in the binary\r\nconst mod = new webasmjs.ModuleBuilder('debugExample');\r\n\r\nconst g = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\ng.withName('counter');\r\n\r\nmod.defineFunction('add', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n f.getParameter(0).withName('x');\r\n f.getParameter(1).withName('y');\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('addThree', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n f.getParameter(0).withName('a');\r\n f.getParameter(1).withName('b');\r\n f.getParameter(2).withName('c');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n a.get_local(f.getParameter(2));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nconst bytes = mod.toBytes();\r\n\r\nlog('Binary size: ' + bytes.length + ' bytes');\r\nlog('');\r\n\r\n// Read back the name section\r\nconst reader = new webasmjs.BinaryReader(bytes);\r\nconst info = reader.read();\r\nconst ns = info.nameSection;\r\n\r\nif (ns) {\r\n log('Module name: ' + ns.moduleName);\r\n log('');\r\n\r\n if (ns.functionNames) {\r\n log('Function names:');\r\n ns.functionNames.forEach((name, idx) => {\r\n log(' [' + idx + '] ' + name);\r\n });\r\n }\r\n\r\n if (ns.localNames) {\r\n log('');\r\n log('Local/parameter names:');\r\n ns.localNames.forEach((locals, funcIdx) => {\r\n const funcName = ns.functionNames?.get(funcIdx) || 'func' + funcIdx;\r\n log(' ' + funcName + ':');\r\n locals.forEach((name, localIdx) => {\r\n log(' [' + localIdx + '] ' + name);\r\n });\r\n });\r\n }\r\n\r\n if (ns.globalNames) {\r\n log('');\r\n log('Global names:');\r\n ns.globalNames.forEach((name, idx) => {\r\n log(' [' + idx + '] ' + name);\r\n });\r\n }\r\n} else {\r\n log('No name section found!');\r\n}`,\r\n },\r\n\r\n 'binary-inspect': {\r\n label: 'Binary Inspector',\r\n group: 'Debug',\r\n code: `// Inspect the binary structure of a WASM module\r\nconst mod = new webasmjs.ModuleBuilder('inspect');\r\nmod.defineMemory(1);\r\n\r\nconst counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\nmod.defineFunction('add', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('noop', null, [], (f, a) => {\r\n a.nop();\r\n}).withExport();\r\n\r\nconst bytes = mod.toBytes();\r\n\r\nlog('=== Binary Analysis ===');\r\nlog('Total size: ' + bytes.length + ' bytes');\r\nlog('');\r\n\r\n// Read with BinaryReader\r\nconst reader = new webasmjs.BinaryReader(bytes);\r\nconst info = reader.read();\r\n\r\nlog('WASM version: ' + info.version);\r\nlog('Types: ' + info.types.length);\r\ninfo.types.forEach((t, i) => {\r\n const params = t.parameterTypes.map(p => p.name).join(', ');\r\n const results = t.returnTypes.map(r => r.name).join(', ');\r\n log(' [' + i + '] (' + params + ') -> (' + results + ')');\r\n});\r\n\r\nlog('Functions: ' + info.functions.length);\r\ninfo.functions.forEach((f, i) => {\r\n log(' [' + i + '] type=' + f.typeIndex + ', locals=' + f.locals.length + ', body=' + f.body.length + ' bytes');\r\n});\r\n\r\nlog('Memories: ' + info.memories.length);\r\ninfo.memories.forEach((m, i) => {\r\n log(' [' + i + '] initial=' + m.initial + ' pages (' + (m.initial * 64) + ' KB)');\r\n});\r\n\r\nlog('Globals: ' + info.globals.length);\r\ninfo.globals.forEach((g, i) => {\r\n log(' [' + i + '] mutable=' + g.mutable);\r\n});\r\n\r\nlog('Exports: ' + info.exports.length);\r\ninfo.exports.forEach((e) => {\r\n const kinds = ['function', 'table', 'memory', 'global'];\r\n log(' \"' + e.name + '\" -> ' + (kinds[e.kind] || 'unknown') + '[' + e.index + ']');\r\n});\r\n\r\nlog('');\r\nlog('Valid: ' + WebAssembly.validate(bytes.buffer));`,\r\n },\r\n\r\n 'wat-roundtrip': {\r\n label: 'WAT Roundtrip',\r\n group: 'Debug',\r\n code: `// Build a module programmatically, inspect WAT, parse it back\r\nconst mod = new webasmjs.ModuleBuilder('roundtrip');\r\n\r\nmod.defineFunction('multiply', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('negate', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.const_i32(0);\r\n a.get_local(f.getParameter(0));\r\n a.sub_i32();\r\n}).withExport();\r\n\r\n// Get WAT text\r\nconst watText = mod.toString();\r\nlog('=== Generated WAT ===');\r\nlog(watText);\r\n\r\n// Parse it back\r\nlog('');\r\nlog('=== Parsing WAT back... ===');\r\nconst mod2 = webasmjs.parseWat(watText);\r\n\r\n// Instantiate and test\r\nconst instance = await mod2.instantiate();\r\nconst { multiply, negate } = instance.instance.exports;\r\n\r\nlog('multiply(6, 7) = ' + multiply(6, 7));\r\nlog('multiply(100, -3) = ' + multiply(100, -3));\r\nlog('negate(42) = ' + negate(42));\r\nlog('negate(-10) = ' + negate(-10));\r\nlog('');\r\nlog('Roundtrip successful!');`,\r\n },\r\n};\r\n\r\n// \u2500\u2500\u2500 UI helpers \u2500\u2500\u2500\r\n\r\nconst GROUP_ICONS: Record = {\r\n Basics: '\\u{1F44B}',\r\n Memory: '\\u{1F4BE}',\r\n Globals: '\\u{1F30D}',\r\n Functions: '\\u{1F517}',\r\n Numeric: '\\u{1F522}',\r\n Algorithms: '\\u{2699}',\r\n SIMD: '\\u{26A1}',\r\n 'Bulk Memory': '\\u{1F4E6}',\r\n 'Post-MVP': '\\u{1F680}',\r\n WAT: '\\u{1F4DD}',\r\n Debug: '\\u{1F50D}',\r\n};\r\n\r\nfunction getEditor(): HTMLTextAreaElement {\r\n return document.getElementById('editor') as HTMLTextAreaElement;\r\n}\r\n\r\nfunction getWatOutput(): HTMLElement {\r\n return document.getElementById('watOutput') as HTMLElement;\r\n}\r\n\r\nfunction getRunOutput(): HTMLElement {\r\n return document.getElementById('runOutput') as HTMLElement;\r\n}\r\n\r\nfunction clearOutput(el: HTMLElement): void {\r\n el.textContent = '';\r\n}\r\n\r\nfunction appendOutput(el: HTMLElement, text: string, className?: string): void {\r\n const line = document.createElement('div');\r\n line.textContent = text;\r\n if (className) line.className = className;\r\n el.appendChild(line);\r\n}\r\n\r\nlet currentExampleKey = 'hello-wasm';\r\n\r\nfunction loadExample(name: string): void {\r\n const example = EXAMPLES[name];\r\n if (example) {\r\n currentExampleKey = name;\r\n getEditor().value = example.code;\r\n clearOutput(getWatOutput());\r\n clearOutput(getRunOutput());\r\n const label = document.getElementById('currentExample');\r\n if (label) label.textContent = example.label;\r\n }\r\n}\r\n\r\n// \u2500\u2500\u2500 Example picker dialog \u2500\u2500\u2500\r\n\r\nfunction openExamplePicker(): void {\r\n // Prevent duplicates\r\n const existing = document.getElementById('exampleDialog');\r\n if (existing) existing.remove();\r\n\r\n const overlay = document.createElement('div');\r\n overlay.id = 'exampleDialog';\r\n overlay.className = 'dialog-overlay';\r\n\r\n const dialog = document.createElement('div');\r\n dialog.className = 'dialog';\r\n\r\n // Header with search\r\n const header = document.createElement('div');\r\n header.className = 'dialog-header';\r\n header.innerHTML = '

Examples

';\r\n\r\n const searchInput = document.createElement('input');\r\n searchInput.type = 'text';\r\n searchInput.placeholder = 'Search examples...';\r\n searchInput.className = 'dialog-search';\r\n header.appendChild(searchInput);\r\n dialog.appendChild(header);\r\n\r\n // Build grouped grid\r\n const body = document.createElement('div');\r\n body.className = 'dialog-body';\r\n\r\n const groups = new Map();\r\n for (const [key, example] of Object.entries(EXAMPLES)) {\r\n const group = example.group;\r\n if (!groups.has(group)) groups.set(group, []);\r\n // Extract first line of code as description\r\n const firstComment = example.code.split('\\n')[0].replace(/^\\/\\/\\s*/, '');\r\n groups.get(group)!.push({ key, label: example.label, desc: firstComment });\r\n }\r\n\r\n const allCards: HTMLElement[] = [];\r\n const allSections: HTMLElement[] = [];\r\n\r\n for (const [groupName, items] of groups) {\r\n const section = document.createElement('div');\r\n section.className = 'dialog-group';\r\n section.dataset.group = groupName;\r\n\r\n const groupHeader = document.createElement('div');\r\n groupHeader.className = 'dialog-group-header';\r\n const icon = GROUP_ICONS[groupName] || '';\r\n groupHeader.textContent = `${icon} ${groupName}`;\r\n section.appendChild(groupHeader);\r\n\r\n const grid = document.createElement('div');\r\n grid.className = 'dialog-grid';\r\n\r\n for (const item of items) {\r\n const card = document.createElement('button');\r\n card.className = 'dialog-card';\r\n if (item.key === currentExampleKey) card.classList.add('active');\r\n card.dataset.key = item.key;\r\n card.dataset.search = `${item.label} ${item.desc} ${groupName}`.toLowerCase();\r\n\r\n const title = document.createElement('div');\r\n title.className = 'dialog-card-title';\r\n title.textContent = item.label;\r\n card.appendChild(title);\r\n\r\n const desc = document.createElement('div');\r\n desc.className = 'dialog-card-desc';\r\n desc.textContent = item.desc;\r\n card.appendChild(desc);\r\n\r\n card.addEventListener('click', () => {\r\n loadExample(item.key);\r\n overlay.remove();\r\n });\r\n\r\n grid.appendChild(card);\r\n allCards.push(card);\r\n }\r\n\r\n section.appendChild(grid);\r\n body.appendChild(section);\r\n allSections.push(section);\r\n }\r\n\r\n dialog.appendChild(body);\r\n overlay.appendChild(dialog);\r\n document.body.appendChild(overlay);\r\n\r\n // Search filtering\r\n searchInput.addEventListener('input', () => {\r\n const q = searchInput.value.toLowerCase().trim();\r\n for (const card of allCards) {\r\n const match = !q || card.dataset.search!.includes(q);\r\n (card as HTMLElement).style.display = match ? '' : 'none';\r\n }\r\n // Hide groups with no visible cards\r\n for (const section of allSections) {\r\n const visibleCards = section.querySelectorAll('.dialog-card:not([style*=\"display: none\"])');\r\n (section as HTMLElement).style.display = visibleCards.length > 0 ? '' : 'none';\r\n }\r\n });\r\n\r\n // Close on overlay click\r\n overlay.addEventListener('click', (e) => {\r\n if (e.target === overlay) overlay.remove();\r\n });\r\n\r\n // Close on Escape\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n overlay.remove();\r\n document.removeEventListener('keydown', onKey);\r\n }\r\n };\r\n document.addEventListener('keydown', onKey);\r\n\r\n // Focus search\r\n setTimeout(() => searchInput.focus(), 50);\r\n}\r\n\r\n// Expose library globally for eval'd code\r\n(window as any).webasmjs = {\r\n ModuleBuilder,\r\n ValueType,\r\n BlockType,\r\n ElementType,\r\n TextModuleWriter,\r\n BinaryReader,\r\n parseWat,\r\n};\r\n\r\nasync function run(): Promise {\r\n const watEl = getWatOutput();\r\n const runEl = getRunOutput();\r\n clearOutput(watEl);\r\n clearOutput(runEl);\r\n\r\n const code = getEditor().value;\r\n\r\n // Capture log calls\r\n const log = (msg: any) => {\r\n appendOutput(runEl, String(msg));\r\n };\r\n\r\n // Intercept ModuleBuilder to capture WAT before instantiate\r\n const OrigModuleBuilder = ModuleBuilder;\r\n const patchedClass = class extends OrigModuleBuilder {\r\n async instantiate(imports?: WebAssembly.Imports) {\r\n try {\r\n const wat = this.toString();\r\n appendOutput(watEl, wat);\r\n } catch (e: any) {\r\n appendOutput(watEl, 'Error generating WAT: ' + e.message, 'error');\r\n }\r\n return super.instantiate(imports);\r\n }\r\n };\r\n (window as any).webasmjs.ModuleBuilder = patchedClass;\r\n\r\n try {\r\n const asyncFn = new Function('log', 'webasmjs', `return (async () => {\\n${code}\\n})();`);\r\n await asyncFn(log, (window as any).webasmjs);\r\n appendOutput(runEl, '\\n--- Done ---');\r\n } catch (e: any) {\r\n appendOutput(runEl, 'Error: ' + e.message, 'error');\r\n if (e.stack) {\r\n appendOutput(runEl, e.stack, 'error');\r\n }\r\n } finally {\r\n (window as any).webasmjs.ModuleBuilder = OrigModuleBuilder;\r\n }\r\n}\r\n\r\n// Initialize\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n document.getElementById('examplesBtn')!.addEventListener('click', openExamplePicker);\r\n document.getElementById('runBtn')!.addEventListener('click', run);\r\n\r\n // Ctrl/Cmd+Enter to run\r\n getEditor().addEventListener('keydown', (e: KeyboardEvent) => {\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\r\n e.preventDefault();\r\n run();\r\n }\r\n });\r\n\r\n // Load default example\r\n loadExample('hello-wasm');\r\n});\r\n"], + "sourcesContent": ["/**\r\n * Language-level type descriptors used in the WASM binary encoding.\r\n * Each type has a name, binary value, and short identifier.\r\n */\r\nexport interface LanguageTypeDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n readonly short: string;\r\n}\r\n\r\nexport const LanguageType = {\r\n Int32: { name: 'i32', value: 0x7f, short: 'i' } as const,\r\n Int64: { name: 'i64', value: 0x7e, short: 'l' } as const,\r\n Float32: { name: 'f32', value: 0x7d, short: 's' } as const,\r\n Float64: { name: 'f64', value: 0x7c, short: 'd' } as const,\r\n AnyFunc: { name: 'anyfunc', value: 0x70, short: 'a' } as const,\r\n Func: { name: 'func', value: 0x60, short: 'f' } as const,\r\n Void: { name: 'void', value: 0x40, short: 'v' } as const,\r\n} as const;\r\n\r\nexport type LanguageTypeKey = keyof typeof LanguageType;\r\n\r\n/**\r\n * WASM value types (i32, i64, f32, f64, v128).\r\n */\r\nexport const ValueType = {\r\n Int32: LanguageType.Int32,\r\n Int64: LanguageType.Int64,\r\n Float32: LanguageType.Float32,\r\n Float64: LanguageType.Float64,\r\n V128: { name: 'v128', value: 0x7b, short: 'v' } as const,\r\n} as const;\r\n\r\nexport type ValueTypeDescriptor = typeof ValueType[keyof typeof ValueType];\r\nexport type ValueTypeKey = keyof typeof ValueType;\r\n\r\n/**\r\n * Block return types (value types + void).\r\n */\r\nexport const BlockType = {\r\n Int32: LanguageType.Int32,\r\n Int64: LanguageType.Int64,\r\n Float32: LanguageType.Float32,\r\n Float64: LanguageType.Float64,\r\n V128: ValueType.V128,\r\n Void: LanguageType.Void,\r\n} as const;\r\n\r\nexport type BlockTypeDescriptor = typeof BlockType[keyof typeof BlockType];\r\n\r\n/**\r\n * Element types for tables.\r\n */\r\nexport const ElementType = {\r\n AnyFunc: LanguageType.AnyFunc,\r\n} as const;\r\n\r\nexport type ElementTypeDescriptor = typeof ElementType[keyof typeof ElementType];\r\n\r\n/**\r\n * Import/export external kinds.\r\n */\r\nexport interface ExternalKindDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n}\r\n\r\nexport const ExternalKind = {\r\n Function: { name: 'Function', value: 0 } as const,\r\n Table: { name: 'Table', value: 1 } as const,\r\n Memory: { name: 'Memory', value: 2 } as const,\r\n Global: { name: 'Global', value: 3 } as const,\r\n} as const;\r\n\r\nexport type ExternalKindType = typeof ExternalKind[keyof typeof ExternalKind];\r\n\r\n/**\r\n * WASM binary section types.\r\n */\r\nexport interface SectionTypeDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n}\r\n\r\nexport const SectionType = {\r\n Type: { name: 'Type', value: 1 } as const,\r\n Import: { name: 'Import', value: 2 } as const,\r\n Function: { name: 'Function', value: 3 } as const,\r\n Table: { name: 'Table', value: 4 } as const,\r\n Memory: { name: 'Memory', value: 5 } as const,\r\n Global: { name: 'Global', value: 6 } as const,\r\n Export: { name: 'Export', value: 7 } as const,\r\n Start: { name: 'Start', value: 8 } as const,\r\n Element: { name: 'Element', value: 9 } as const,\r\n Code: { name: 'Code', value: 10 } as const,\r\n Data: { name: 'Data', value: 11 } as const,\r\n createCustom(name: string): SectionTypeDescriptor {\r\n return { name, value: 0 };\r\n },\r\n} as const;\r\n\r\n/**\r\n * Type form descriptors.\r\n */\r\nexport const TypeForm = {\r\n Func: { name: 'func', value: 0x60 } as const,\r\n Block: { name: 'block', value: 0x40 } as const,\r\n} as const;\r\n\r\n/**\r\n * Immediate operand types for instructions.\r\n */\r\nexport enum ImmediateType {\r\n BlockSignature = 'BlockSignature',\r\n RelativeDepth = 'RelativeDepth',\r\n BranchTable = 'BranchTable',\r\n Function = 'Function',\r\n IndirectFunction = 'IndirectFunction',\r\n Local = 'Local',\r\n Global = 'Global',\r\n Float32 = 'Float32',\r\n Float64 = 'Float64',\r\n VarInt32 = 'VarInt32',\r\n VarInt64 = 'VarInt64',\r\n VarUInt1 = 'VarUInt1',\r\n VarUInt32 = 'VarUInt32',\r\n MemoryImmediate = 'MemoryImmediate',\r\n V128Const = 'V128Const',\r\n LaneIndex = 'LaneIndex',\r\n ShuffleMask = 'ShuffleMask',\r\n}\r\n\r\n/**\r\n * Context types for initialization expressions.\r\n */\r\nexport enum InitExpressionType {\r\n Global = 'Global',\r\n Element = 'Element',\r\n Data = 'Data',\r\n}\r\n\r\n/**\r\n * WASM post-MVP feature extensions.\r\n */\r\nexport type WasmFeature =\r\n | 'sign-extend'\r\n | 'sat-trunc'\r\n | 'bulk-memory'\r\n | 'reference-types'\r\n | 'simd'\r\n | 'multi-value';\r\n\r\n/**\r\n * WASM version targets. Each target enables a set of features.\r\n */\r\nexport type WasmTarget = 'mvp' | '2.0' | 'latest';\r\n\r\n/**\r\n * Options for module building.\r\n */\r\nexport interface ModuleBuilderOptions {\r\n generateNameSection?: boolean;\r\n disableVerification?: boolean;\r\n target?: WasmTarget;\r\n features?: WasmFeature[];\r\n}\r\n\r\n/**\r\n * Opcode definition structure.\r\n */\r\nexport interface OpCodeDef {\r\n readonly value: number;\r\n readonly mnemonic: string;\r\n readonly immediate?: string;\r\n readonly controlFlow?: string;\r\n readonly stackBehavior: string;\r\n readonly popOperands?: readonly string[];\r\n readonly pushOperands?: readonly string[];\r\n readonly prefix?: number;\r\n readonly feature?: WasmFeature;\r\n}\r\n\r\n/**\r\n * Interface for objects that can write themselves to a BinaryWriter.\r\n */\r\nexport interface Writable {\r\n write(writer: import('./BinaryWriter').default): void;\r\n}\r\n", "const formatOrList = (values: string[]): string => {\r\n if (values.length === 1) {\r\n return values[0];\r\n }\r\n\r\n let text = '';\r\n for (let index = 0; index < values.length; index++) {\r\n text += values[index];\r\n if (index === values.length - 2) {\r\n text += ' or ';\r\n } else if (index !== values.length - 1) {\r\n text += ', ';\r\n }\r\n }\r\n\r\n return text;\r\n};\r\n\r\nexport default class Arg {\r\n static notNull(name: string, value: unknown): void {\r\n if (value === null || value === undefined) {\r\n throw new Error(`The parameter ${name} must be specified.`);\r\n }\r\n }\r\n\r\n static notEmpty(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (value === '' || (Array.isArray(value) && value.length === 0)) {\r\n throw new Error(`The parameter ${name} cannot be empty.`);\r\n }\r\n }\r\n\r\n static notEmptyString(name: string, value: unknown): void {\r\n Arg.string(name, value);\r\n if (value === '') {\r\n throw new Error(`The parameter ${name} cannot be empty.`);\r\n }\r\n }\r\n\r\n static string(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (typeof value !== 'string') {\r\n throw new Error(`The parameter ${name} must be a string.`);\r\n }\r\n }\r\n\r\n static number(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (typeof value !== 'number' || isNaN(value)) {\r\n throw new Error(`The parameter ${name} must be a number.`);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static instanceOf(name: string, value: unknown, ...types: (new (...args: any[]) => any)[]): void {\r\n if (!types.some((x) => value instanceof x)) {\r\n throw new Error(\r\n `The parameter ${name} must be a ${formatOrList(types.map((x) => x.name))}.`\r\n );\r\n }\r\n }\r\n}\r\n", "const GrowthRate = 1024;\r\n\r\nexport default class BinaryWriter {\r\n buffer: Uint8Array;\r\n size: number;\r\n\r\n constructor(size: number = 1024) {\r\n this.size = 0;\r\n this.buffer = new Uint8Array(size);\r\n }\r\n\r\n get capacity(): number {\r\n return this.buffer.length;\r\n }\r\n\r\n get length(): number {\r\n return this.size;\r\n }\r\n\r\n get remaining(): number {\r\n return this.buffer.length - this.size;\r\n }\r\n\r\n writeUInt8(value: number): void {\r\n this.writeByte(0xff & value);\r\n }\r\n\r\n writeUInt16(value: number): void {\r\n this.writeByte(value & 0xff);\r\n this.writeByte((value >> 8) & 0xff);\r\n }\r\n\r\n writeUInt32(value: number): void {\r\n this.writeByte(value & 0xff);\r\n this.writeByte((value >> 8) & 0xff);\r\n this.writeByte((value >> 16) & 0xff);\r\n this.writeByte((value >> 24) & 0xff);\r\n }\r\n\r\n writeVarUInt1(value: number): void {\r\n this.writeByte(value > 0 ? 1 : 0);\r\n }\r\n\r\n writeVarUInt7(value: number): void {\r\n this.writeByte(0x7f & value);\r\n }\r\n\r\n writeVarUInt32(value: number): void {\r\n do {\r\n let chunk = value & 0x7f;\r\n value >>>= 7;\r\n if (value !== 0) {\r\n chunk |= 0x80;\r\n }\r\n this.writeByte(chunk);\r\n } while (value !== 0);\r\n }\r\n\r\n writeVarInt7(value: number): void {\r\n this.writeByte(value & 0x7f);\r\n }\r\n\r\n writeVarInt32(value: number): void {\r\n let more = true;\r\n while (more) {\r\n let chunk = value & 0x7f;\r\n value >>= 7;\r\n\r\n if ((value === 0 && (chunk & 0x40) === 0) || (value === -1 && (chunk & 0x40) !== 0)) {\r\n more = false;\r\n } else {\r\n chunk |= 0x80;\r\n }\r\n\r\n this.writeByte(chunk);\r\n }\r\n }\r\n\r\n writeVarInt64(value: number | bigint): void {\r\n if (typeof value === 'number' && Number.isInteger(value)) {\r\n this.writeVarInt32(value);\r\n return;\r\n }\r\n\r\n let bigIntValue = BigInt(value);\r\n let more = true;\r\n\r\n while (more) {\r\n let chunk = Number(bigIntValue & 0x7fn);\r\n bigIntValue = bigIntValue >> 7n;\r\n\r\n if (\r\n (bigIntValue === 0n && (chunk & 0x40) === 0) || (bigIntValue === -1n && (chunk & 0x40) !== 0)\r\n ) {\r\n more = false;\r\n } else {\r\n chunk |= 0x80;\r\n }\r\n\r\n this.writeByte(chunk);\r\n }\r\n }\r\n\r\n writeString(value: string): void {\r\n const encoder = new TextEncoder();\r\n const utfBytes = encoder.encode(value);\r\n this.writeBytes(utfBytes);\r\n }\r\n\r\n writeFloat32(value: number): void {\r\n const array = new Float32Array(1);\r\n array[0] = value;\r\n this.writeBytes(new Uint8Array(array.buffer));\r\n }\r\n\r\n writeFloat64(value: number): void {\r\n const array = new Float64Array(1);\r\n array[0] = value;\r\n this.writeBytes(new Uint8Array(array.buffer));\r\n }\r\n\r\n writeByte(data: number): void {\r\n this.requireCapacity(1);\r\n this.buffer[this.size++] = data;\r\n }\r\n\r\n writeBytes(array: BinaryWriter | Uint8Array): void {\r\n let innerArray: Uint8Array;\r\n if (array instanceof BinaryWriter) {\r\n innerArray = array.toArray();\r\n } else if (array instanceof Uint8Array) {\r\n innerArray = array;\r\n } else {\r\n throw new Error('Invalid argument, must be a Uint8Array or BinaryWriter');\r\n }\r\n\r\n this.requireCapacity(innerArray.length);\r\n this.buffer.set(innerArray, this.size);\r\n this.size += innerArray.length;\r\n }\r\n\r\n requireCapacity(size: number): void {\r\n const remaining = this.remaining;\r\n if (remaining >= size) {\r\n return;\r\n }\r\n\r\n const needed = this.size + size;\r\n const grown = this.buffer.length + GrowthRate;\r\n const newSize = Math.max(needed, grown);\r\n\r\n const newBuffer = new Uint8Array(newSize);\r\n newBuffer.set(this.buffer, 0);\r\n this.buffer = newBuffer;\r\n }\r\n\r\n toArray(): Uint8Array {\r\n const array = new Uint8Array(this.size);\r\n array.set(this.buffer.subarray(0, this.size), 0);\r\n return array;\r\n }\r\n}\r\n", "import { SectionType, SectionTypeDescriptor } from './types';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport ModuleBuilder from './ModuleBuilder';\r\nimport CustomSectionBuilder from './CustomSectionBuilder';\r\n\r\nconst MagicHeader = 0x6d736100;\r\nconst Version = 1;\r\n\r\nexport default class BinaryModuleWriter {\r\n moduleBuilder: ModuleBuilder;\r\n\r\n constructor(moduleBuilder: ModuleBuilder) {\r\n this.moduleBuilder = moduleBuilder;\r\n }\r\n\r\n static writeSectionHeader(\r\n writer: BinaryWriter,\r\n section: SectionTypeDescriptor,\r\n length: number\r\n ): void {\r\n writer.writeVarUInt7(section.value);\r\n writer.writeVarUInt32(length);\r\n }\r\n\r\n static writeSection(\r\n writer: BinaryWriter,\r\n sectionType: SectionTypeDescriptor,\r\n sectionItems: { write(writer: BinaryWriter): void }[]\r\n ): void {\r\n if (sectionItems.length === 0) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(sectionItems.length);\r\n sectionItems.forEach((x) => {\r\n x.write(sectionWriter);\r\n });\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, sectionType, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n static writeCustomSection(writer: BinaryWriter, section: CustomSectionBuilder): void {\r\n section.write(writer);\r\n }\r\n\r\n writeTypeSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Type, this.moduleBuilder._types);\r\n }\r\n\r\n writeImportSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Import, this.moduleBuilder._imports);\r\n }\r\n\r\n writeFunctionSection(writer: BinaryWriter): void {\r\n if (this.moduleBuilder._functions.length === 0) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._functions.length);\r\n for (let index = 0; index < this.moduleBuilder._functions.length; index++) {\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._functions[index].funcTypeBuilder.index);\r\n }\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, SectionType.Function, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeTableSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Table, this.moduleBuilder._tables);\r\n }\r\n\r\n writeMemorySection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Memory, this.moduleBuilder._memories);\r\n }\r\n\r\n writeGlobalSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Global, this.moduleBuilder._globals);\r\n }\r\n\r\n writeExportSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Export, this.moduleBuilder._exports);\r\n }\r\n\r\n writeStartSection(writer: BinaryWriter): void {\r\n if (!this.moduleBuilder._startFunction) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._startFunction._index);\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, SectionType.Start, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeElementSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Element, this.moduleBuilder._elements);\r\n }\r\n\r\n writeCodeSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Code, this.moduleBuilder._functions);\r\n }\r\n\r\n writeDataSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Data, this.moduleBuilder._data);\r\n }\r\n\r\n writeNameSection(writer: BinaryWriter): void {\r\n const mod = this.moduleBuilder;\r\n const nameWriter = new BinaryWriter();\r\n\r\n // Sub-section 0: module name\r\n const moduleNameWriter = new BinaryWriter();\r\n moduleNameWriter.writeVarUInt32(mod._name.length);\r\n moduleNameWriter.writeString(mod._name);\r\n nameWriter.writeVarUInt7(0);\r\n nameWriter.writeVarUInt32(moduleNameWriter.length);\r\n nameWriter.writeBytes(moduleNameWriter);\r\n\r\n // Sub-section 1: function names\r\n const allFunctions = [\r\n ...mod._imports.filter((x) => x.externalKind.value === 0),\r\n ...mod._functions,\r\n ];\r\n if (allFunctions.length > 0) {\r\n const funcNameWriter = new BinaryWriter();\r\n funcNameWriter.writeVarUInt32(allFunctions.length);\r\n allFunctions.forEach((f, i) => {\r\n const name = 'name' in f ? f.name : `${f.moduleName}.${f.fieldName}`;\r\n funcNameWriter.writeVarUInt32(i);\r\n funcNameWriter.writeVarUInt32(name.length);\r\n funcNameWriter.writeString(name);\r\n });\r\n nameWriter.writeVarUInt7(1);\r\n nameWriter.writeVarUInt32(funcNameWriter.length);\r\n nameWriter.writeBytes(funcNameWriter);\r\n }\r\n\r\n // Sub-section 2: local names (parameters + locals per function)\r\n const functionsWithNames = mod._functions.filter((f) => {\r\n if (!f.functionEmitter) return false;\r\n const hasNamedParam = f.parameters.some((p) => p.name !== null);\r\n const hasNamedLocal = f.functionEmitter._locals.some((l) => l.name !== null);\r\n return hasNamedParam || hasNamedLocal;\r\n });\r\n if (functionsWithNames.length > 0) {\r\n const localNameWriter = new BinaryWriter();\r\n localNameWriter.writeVarUInt32(functionsWithNames.length);\r\n functionsWithNames.forEach((f) => {\r\n localNameWriter.writeVarUInt32(f._index);\r\n const namedEntries: { index: number; name: string }[] = [];\r\n f.parameters.forEach((p, i) => {\r\n if (p.name !== null) {\r\n namedEntries.push({ index: i, name: p.name });\r\n }\r\n });\r\n if (f.functionEmitter) {\r\n f.functionEmitter._locals.forEach((l) => {\r\n if (l.name !== null) {\r\n namedEntries.push({ index: l.index, name: l.name });\r\n }\r\n });\r\n }\r\n localNameWriter.writeVarUInt32(namedEntries.length);\r\n namedEntries.forEach((entry) => {\r\n localNameWriter.writeVarUInt32(entry.index);\r\n localNameWriter.writeVarUInt32(entry.name.length);\r\n localNameWriter.writeString(entry.name);\r\n });\r\n });\r\n nameWriter.writeVarUInt7(2);\r\n nameWriter.writeVarUInt32(localNameWriter.length);\r\n nameWriter.writeBytes(localNameWriter);\r\n }\r\n\r\n // Sub-section 7: global names\r\n const namedGlobals: { index: number; name: string }[] = [];\r\n mod._imports.forEach((imp) => {\r\n if (imp.externalKind.value === 3) {\r\n namedGlobals.push({ index: imp.index, name: `${imp.moduleName}.${imp.fieldName}` });\r\n }\r\n });\r\n mod._globals.forEach((g) => {\r\n if (g.name !== null) {\r\n namedGlobals.push({ index: g._index, name: g.name });\r\n }\r\n });\r\n if (namedGlobals.length > 0) {\r\n const globalNameWriter = new BinaryWriter();\r\n globalNameWriter.writeVarUInt32(namedGlobals.length);\r\n namedGlobals.forEach((entry) => {\r\n globalNameWriter.writeVarUInt32(entry.index);\r\n globalNameWriter.writeVarUInt32(entry.name.length);\r\n globalNameWriter.writeString(entry.name);\r\n });\r\n nameWriter.writeVarUInt7(7);\r\n nameWriter.writeVarUInt32(globalNameWriter.length);\r\n nameWriter.writeBytes(globalNameWriter);\r\n }\r\n\r\n // Write as custom section with name \"name\"\r\n const sectionWriter = new BinaryWriter();\r\n const sectionName = 'name';\r\n sectionWriter.writeVarUInt32(sectionName.length);\r\n sectionWriter.writeString(sectionName);\r\n sectionWriter.writeBytes(nameWriter);\r\n\r\n writer.writeVarUInt7(0); // custom section id\r\n writer.writeVarUInt32(sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeCustomSections(writer: BinaryWriter): void {\r\n // Write user-defined custom sections (excluding \"name\" which is reserved)\r\n this.moduleBuilder._customSections.forEach((x) => {\r\n BinaryModuleWriter.writeCustomSection(writer, x);\r\n });\r\n\r\n // Auto-generate name section if enabled and not user-provided\r\n if (this.moduleBuilder._options.generateNameSection) {\r\n this.writeNameSection(writer);\r\n }\r\n }\r\n\r\n write(): Uint8Array {\r\n const writer = new BinaryWriter();\r\n writer.writeUInt32(MagicHeader);\r\n writer.writeUInt32(Version);\r\n\r\n this.writeTypeSection(writer);\r\n this.writeImportSection(writer);\r\n this.writeFunctionSection(writer);\r\n this.writeTableSection(writer);\r\n this.writeMemorySection(writer);\r\n this.writeGlobalSection(writer);\r\n this.writeExportSection(writer);\r\n this.writeStartSection(writer);\r\n this.writeElementSection(writer);\r\n this.writeCodeSection(writer);\r\n this.writeDataSection(writer);\r\n this.writeCustomSections(writer);\r\n\r\n return writer.toArray();\r\n }\r\n}\r\n", "import {\r\n SectionType,\r\n SectionTypeDescriptor,\r\n ExternalKind,\r\n ValueType,\r\n ElementType,\r\n ValueTypeDescriptor,\r\n ImmediateType,\r\n LanguageType,\r\n} from './types';\r\n\r\nexport interface ModuleInfo {\r\n version: number;\r\n types: FuncTypeInfo[];\r\n imports: ImportInfo[];\r\n functions: FunctionInfo[];\r\n tables: TableInfo[];\r\n memories: MemoryInfo[];\r\n globals: GlobalInfo[];\r\n exports: ExportInfo[];\r\n start: number | null;\r\n elements: ElementInfo[];\r\n data: DataInfo[];\r\n customSections: CustomSectionInfo[];\r\n nameSection?: NameSectionInfo;\r\n}\r\n\r\nexport interface FuncTypeInfo {\r\n parameterTypes: ValueTypeDescriptor[];\r\n returnTypes: ValueTypeDescriptor[];\r\n}\r\n\r\nexport interface ImportInfo {\r\n moduleName: string;\r\n fieldName: string;\r\n kind: number;\r\n typeIndex?: number;\r\n tableType?: { elementType: number; initial: number; maximum: number | null };\r\n memoryType?: { initial: number; maximum: number | null };\r\n globalType?: { valueType: number; mutable: boolean };\r\n}\r\n\r\nexport interface FunctionInfo {\r\n typeIndex: number;\r\n locals: { count: number; type: number }[];\r\n body: Uint8Array;\r\n}\r\n\r\nexport interface TableInfo {\r\n elementType: number;\r\n initial: number;\r\n maximum: number | null;\r\n}\r\n\r\nexport interface MemoryInfo {\r\n initial: number;\r\n maximum: number | null;\r\n}\r\n\r\nexport interface GlobalInfo {\r\n valueType: number;\r\n mutable: boolean;\r\n initExpr: Uint8Array;\r\n}\r\n\r\nexport interface ExportInfo {\r\n name: string;\r\n kind: number;\r\n index: number;\r\n}\r\n\r\nexport interface ElementInfo {\r\n tableIndex: number;\r\n offsetExpr: Uint8Array;\r\n functionIndices: number[];\r\n}\r\n\r\nexport interface DataInfo {\r\n memoryIndex: number;\r\n offsetExpr: Uint8Array;\r\n data: Uint8Array;\r\n}\r\n\r\nexport interface CustomSectionInfo {\r\n name: string;\r\n data: Uint8Array;\r\n}\r\n\r\nexport interface NameSectionInfo {\r\n moduleName?: string;\r\n functionNames?: Map;\r\n localNames?: Map>;\r\n globalNames?: Map;\r\n}\r\n\r\nconst MagicHeader = 0x6d736100;\r\n\r\nexport default class BinaryReader {\r\n buffer: Uint8Array;\r\n offset: number;\r\n\r\n constructor(buffer: Uint8Array) {\r\n this.buffer = buffer;\r\n this.offset = 0;\r\n }\r\n\r\n read(): ModuleInfo {\r\n const magic = this.readUInt32();\r\n if (magic !== MagicHeader) {\r\n throw new Error(`Invalid WASM magic header: 0x${magic.toString(16)}`);\r\n }\r\n\r\n const version = this.readUInt32();\r\n if (version !== 1) {\r\n throw new Error(`Unsupported WASM version: ${version}`);\r\n }\r\n\r\n const module: ModuleInfo = {\r\n version,\r\n types: [],\r\n imports: [],\r\n functions: [],\r\n tables: [],\r\n memories: [],\r\n globals: [],\r\n exports: [],\r\n start: null,\r\n elements: [],\r\n data: [],\r\n customSections: [],\r\n };\r\n\r\n // Track function type indices separately (function section only stores type indices)\r\n const functionTypeIndices: number[] = [];\r\n\r\n while (this.offset < this.buffer.length) {\r\n const sectionId = this.readVarUInt7();\r\n const sectionSize = this.readVarUInt32();\r\n const sectionEnd = this.offset + sectionSize;\r\n\r\n switch (sectionId) {\r\n case 0: // Custom\r\n this.readCustomSection(module, sectionEnd);\r\n break;\r\n case 1: // Type\r\n this.readTypeSection(module);\r\n break;\r\n case 2: // Import\r\n this.readImportSection(module);\r\n break;\r\n case 3: // Function\r\n this.readFunctionSection(functionTypeIndices);\r\n break;\r\n case 4: // Table\r\n this.readTableSection(module);\r\n break;\r\n case 5: // Memory\r\n this.readMemorySection(module);\r\n break;\r\n case 6: // Global\r\n this.readGlobalSection(module);\r\n break;\r\n case 7: // Export\r\n this.readExportSection(module);\r\n break;\r\n case 8: // Start\r\n module.start = this.readVarUInt32();\r\n break;\r\n case 9: // Element\r\n this.readElementSection(module);\r\n break;\r\n case 10: // Code\r\n this.readCodeSection(module, functionTypeIndices);\r\n break;\r\n case 11: // Data\r\n this.readDataSection(module);\r\n break;\r\n default:\r\n // Skip unknown section\r\n this.offset = sectionEnd;\r\n break;\r\n }\r\n\r\n this.offset = sectionEnd;\r\n }\r\n\r\n return module;\r\n }\r\n\r\n private readCustomSection(module: ModuleInfo, sectionEnd: number): void {\r\n const nameLen = this.readVarUInt32();\r\n const name = this.readString(nameLen);\r\n\r\n if (name === 'name') {\r\n module.nameSection = this.readNameSection(sectionEnd);\r\n return;\r\n }\r\n\r\n const remaining = sectionEnd - this.offset;\r\n const data = this.readBytes(remaining);\r\n module.customSections.push({ name, data });\r\n }\r\n\r\n private readNameSection(sectionEnd: number): NameSectionInfo {\r\n const info: NameSectionInfo = {};\r\n\r\n while (this.offset < sectionEnd) {\r\n const subsectionId = this.readVarUInt7();\r\n const subsectionSize = this.readVarUInt32();\r\n const subsectionEnd = this.offset + subsectionSize;\r\n\r\n switch (subsectionId) {\r\n case 0: { // module name\r\n const len = this.readVarUInt32();\r\n info.moduleName = this.readString(len);\r\n break;\r\n }\r\n case 1: { // function names\r\n const count = this.readVarUInt32();\r\n info.functionNames = new Map();\r\n for (let i = 0; i < count; i++) {\r\n const index = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n info.functionNames.set(index, this.readString(len));\r\n }\r\n break;\r\n }\r\n case 2: { // local names\r\n const funcCount = this.readVarUInt32();\r\n info.localNames = new Map();\r\n for (let i = 0; i < funcCount; i++) {\r\n const funcIndex = this.readVarUInt32();\r\n const localCount = this.readVarUInt32();\r\n const locals = new Map();\r\n for (let j = 0; j < localCount; j++) {\r\n const localIndex = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n locals.set(localIndex, this.readString(len));\r\n }\r\n info.localNames.set(funcIndex, locals);\r\n }\r\n break;\r\n }\r\n case 7: { // global names\r\n const count = this.readVarUInt32();\r\n info.globalNames = new Map();\r\n for (let i = 0; i < count; i++) {\r\n const index = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n info.globalNames.set(index, this.readString(len));\r\n }\r\n break;\r\n }\r\n default:\r\n // Skip unknown subsections\r\n this.offset = subsectionEnd;\r\n break;\r\n }\r\n\r\n this.offset = subsectionEnd;\r\n }\r\n\r\n return info;\r\n }\r\n\r\n private readTypeSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const form = this.readVarInt7(); // 0x60 = func\r\n const paramCount = this.readVarUInt32();\r\n const parameterTypes: ValueTypeDescriptor[] = [];\r\n for (let j = 0; j < paramCount; j++) {\r\n parameterTypes.push(this.readValueType());\r\n }\r\n const returnCount = this.readVarUInt32();\r\n const returnTypes: ValueTypeDescriptor[] = [];\r\n for (let j = 0; j < returnCount; j++) {\r\n returnTypes.push(this.readValueType());\r\n }\r\n module.types.push({ parameterTypes, returnTypes });\r\n }\r\n }\r\n\r\n private readImportSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const moduleNameLen = this.readVarUInt32();\r\n const moduleName = this.readString(moduleNameLen);\r\n const fieldNameLen = this.readVarUInt32();\r\n const fieldName = this.readString(fieldNameLen);\r\n const kind = this.readUInt8();\r\n\r\n const imp: ImportInfo = { moduleName, fieldName, kind };\r\n\r\n switch (kind) {\r\n case 0: // Function\r\n imp.typeIndex = this.readVarUInt32();\r\n break;\r\n case 1: { // Table\r\n const elementType = this.readVarInt7();\r\n const { initial, maximum } = this.readResizableLimits();\r\n imp.tableType = { elementType, initial, maximum };\r\n break;\r\n }\r\n case 2: { // Memory\r\n const { initial, maximum } = this.readResizableLimits();\r\n imp.memoryType = { initial, maximum };\r\n break;\r\n }\r\n case 3: { // Global\r\n const valueType = this.readVarInt7();\r\n const mutable = this.readVarUInt1() === 1;\r\n imp.globalType = { valueType, mutable };\r\n break;\r\n }\r\n }\r\n\r\n module.imports.push(imp);\r\n }\r\n }\r\n\r\n private readFunctionSection(functionTypeIndices: number[]): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n functionTypeIndices.push(this.readVarUInt32());\r\n }\r\n }\r\n\r\n private readTableSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const elementType = this.readVarInt7();\r\n const { initial, maximum } = this.readResizableLimits();\r\n module.tables.push({ elementType, initial, maximum });\r\n }\r\n }\r\n\r\n private readMemorySection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const { initial, maximum } = this.readResizableLimits();\r\n module.memories.push({ initial, maximum });\r\n }\r\n }\r\n\r\n private readGlobalSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const valueType = this.readVarInt7();\r\n const mutable = this.readVarUInt1() === 1;\r\n const initExpr = this.readInitExpr();\r\n module.globals.push({ valueType, mutable, initExpr });\r\n }\r\n }\r\n\r\n private readExportSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const nameLen = this.readVarUInt32();\r\n const name = this.readString(nameLen);\r\n const kind = this.readUInt8();\r\n const index = this.readVarUInt32();\r\n module.exports.push({ name, kind, index });\r\n }\r\n }\r\n\r\n private readElementSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const tableIndex = this.readVarUInt32();\r\n const offsetExpr = this.readInitExpr();\r\n const numElems = this.readVarUInt32();\r\n const functionIndices: number[] = [];\r\n for (let j = 0; j < numElems; j++) {\r\n functionIndices.push(this.readVarUInt32());\r\n }\r\n module.elements.push({ tableIndex, offsetExpr, functionIndices });\r\n }\r\n }\r\n\r\n private readCodeSection(module: ModuleInfo, functionTypeIndices: number[]): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const bodySize = this.readVarUInt32();\r\n const bodyEnd = this.offset + bodySize;\r\n\r\n const localCount = this.readVarUInt32();\r\n const locals: { count: number; type: number }[] = [];\r\n for (let j = 0; j < localCount; j++) {\r\n const lCount = this.readVarUInt32();\r\n const type = this.readVarInt7();\r\n locals.push({ count: lCount, type });\r\n }\r\n\r\n const bodyLength = bodyEnd - this.offset;\r\n const body = this.readBytes(bodyLength);\r\n\r\n module.functions.push({\r\n typeIndex: functionTypeIndices[i],\r\n locals,\r\n body,\r\n });\r\n\r\n this.offset = bodyEnd;\r\n }\r\n }\r\n\r\n private readDataSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const memoryIndex = this.readVarUInt32();\r\n const offsetExpr = this.readInitExpr();\r\n const dataSize = this.readVarUInt32();\r\n const data = this.readBytes(dataSize);\r\n module.data.push({ memoryIndex, offsetExpr, data });\r\n }\r\n }\r\n\r\n private readInitExpr(): Uint8Array {\r\n const start = this.offset;\r\n // Read until we hit 0x0b (end opcode)\r\n while (this.offset < this.buffer.length) {\r\n const byte = this.buffer[this.offset++];\r\n if (byte === 0x0b) {\r\n break;\r\n }\r\n // Skip over immediate operands for known init expression opcodes\r\n switch (byte) {\r\n case 0x41: // i32.const\r\n this.readVarInt32();\r\n break;\r\n case 0x42: // i64.const\r\n this.readVarInt64();\r\n break;\r\n case 0x43: // f32.const\r\n this.offset += 4;\r\n break;\r\n case 0x44: // f64.const\r\n this.offset += 8;\r\n break;\r\n case 0x23: // global.get\r\n this.readVarUInt32();\r\n break;\r\n }\r\n }\r\n return this.buffer.slice(start, this.offset);\r\n }\r\n\r\n private readResizableLimits(): { initial: number; maximum: number | null } {\r\n const flags = this.readVarUInt1();\r\n const initial = this.readVarUInt32();\r\n const maximum = flags === 1 ? this.readVarUInt32() : null;\r\n return { initial, maximum };\r\n }\r\n\r\n private readValueType(): ValueTypeDescriptor {\r\n const value = this.readVarInt7();\r\n // Value types are signed: -1=i32, -2=i64, -3=f32, -4=f64\r\n switch (value) {\r\n case -1: return ValueType.Int32;\r\n case -2: return ValueType.Int64;\r\n case -3: return ValueType.Float32;\r\n case -4: return ValueType.Float64;\r\n default:\r\n throw new Error(`Unknown value type: 0x${(value & 0xff).toString(16)}`);\r\n }\r\n }\r\n\r\n // --- Primitive readers ---\r\n\r\n private readUInt8(): number {\r\n return this.buffer[this.offset++];\r\n }\r\n\r\n private readUInt32(): number {\r\n const value =\r\n this.buffer[this.offset] |\r\n (this.buffer[this.offset + 1] << 8) |\r\n (this.buffer[this.offset + 2] << 16) |\r\n (this.buffer[this.offset + 3] << 24);\r\n this.offset += 4;\r\n return value >>> 0;\r\n }\r\n\r\n private readVarUInt1(): number {\r\n return this.buffer[this.offset++] & 1;\r\n }\r\n\r\n private readVarUInt7(): number {\r\n return this.buffer[this.offset++] & 0x7f;\r\n }\r\n\r\n private readVarUInt32(): number {\r\n let result = 0;\r\n let shift = 0;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= (byte & 0x7f) << shift;\r\n shift += 7;\r\n } while (byte & 0x80);\r\n return result >>> 0;\r\n }\r\n\r\n private readVarInt7(): number {\r\n const byte = this.buffer[this.offset++];\r\n return byte & 0x40 ? byte | 0xffffff80 : byte & 0x7f;\r\n }\r\n\r\n private readVarInt32(): number {\r\n let result = 0;\r\n let shift = 0;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= (byte & 0x7f) << shift;\r\n shift += 7;\r\n } while (byte & 0x80);\r\n if (shift < 32 && byte & 0x40) {\r\n result |= -(1 << shift);\r\n }\r\n return result;\r\n }\r\n\r\n private readVarInt64(): bigint {\r\n let result = 0n;\r\n let shift = 0n;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= BigInt(byte & 0x7f) << shift;\r\n shift += 7n;\r\n } while (byte & 0x80);\r\n if (shift < 64n && byte & 0x40) {\r\n result |= -(1n << shift);\r\n }\r\n return result;\r\n }\r\n\r\n private readString(length: number): string {\r\n const bytes = this.buffer.slice(this.offset, this.offset + length);\r\n this.offset += length;\r\n return new TextDecoder().decode(bytes);\r\n }\r\n\r\n private readBytes(length: number): Uint8Array {\r\n const bytes = this.buffer.slice(this.offset, this.offset + length);\r\n this.offset += length;\r\n return bytes;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { SectionType, SectionTypeDescriptor } from './types';\r\n\r\nexport default class CustomSectionBuilder {\r\n name: string;\r\n type: SectionTypeDescriptor;\r\n _data: Uint8Array;\r\n\r\n constructor(name: string, data?: Uint8Array) {\r\n this.name = name;\r\n this.type = SectionType.createCustom(name);\r\n this._data = data || new Uint8Array(0);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.name.length);\r\n sectionWriter.writeString(this.name);\r\n if (this._data.length > 0) {\r\n sectionWriter.writeBytes(this._data);\r\n }\r\n\r\n writer.writeVarUInt7(0); // custom section id\r\n writer.writeVarUInt32(sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FunctionParameterBuilder {\r\n name: string | null;\r\n valueType: ValueTypeDescriptor;\r\n index: number;\r\n\r\n constructor(valueType: ValueTypeDescriptor, index: number) {\r\n this.name = null;\r\n this.valueType = valueType;\r\n this.index = index;\r\n }\r\n\r\n withName(name: string): this {\r\n this.name = name;\r\n return this;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class LocalBuilder {\r\n index: number;\r\n valueType: ValueTypeDescriptor;\r\n name: string | null;\r\n count: number;\r\n\r\n constructor(valueType: ValueTypeDescriptor, name: string | null, index: number, count: number) {\r\n this.index = index;\r\n this.valueType = valueType;\r\n this.name = name;\r\n this.count = count;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.count);\r\n writer.writeVarInt7(this.valueType.value);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class GlobalType {\r\n private _valueType: ValueTypeDescriptor;\r\n private _mutable: boolean;\r\n\r\n constructor(valueType: ValueTypeDescriptor, mutable: boolean) {\r\n this._valueType = valueType;\r\n this._mutable = mutable;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n return this._valueType;\r\n }\r\n\r\n get mutable(): boolean {\r\n return this._mutable;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarInt7(this._valueType.value);\r\n writer.writeVarUInt1(this._mutable ? 1 : 0);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import GlobalType from './GlobalType';\r\nimport { InitExpressionType, ValueType, ValueTypeDescriptor } from './types';\r\nimport InitExpressionEmitter from './InitExpressionEmitter';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class GlobalBuilder {\r\n _globalType: GlobalType;\r\n _index: number;\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n _moduleBuilder: ModuleBuilder;\r\n name: string | null = null;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._globalType = new GlobalType(valueType, mutable);\r\n this._index = index;\r\n }\r\n\r\n withName(name: string): this {\r\n this.name = name;\r\n return this;\r\n }\r\n\r\n get globalType(): GlobalType {\r\n return this._globalType;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n return this._globalType.valueType;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Global,\r\n this.valueType\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n value(value: number | bigint | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number' || typeof value === 'bigint') {\r\n this.createInitEmitter((asm) => {\r\n const vt = this.valueType;\r\n if (vt === ValueType.Int32) {\r\n asm.const_i32(Number(value));\r\n } else if (vt === ValueType.Int64) {\r\n asm.const_i64(BigInt(value));\r\n } else if (vt === ValueType.Float32) {\r\n asm.const_f32(Number(value));\r\n } else if (vt === ValueType.Float64) {\r\n asm.const_f64(Number(value));\r\n } else {\r\n throw new Error(`Unsupported global value type: ${vt.name}`);\r\n }\r\n });\r\n } else {\r\n throw new Error('Unsupported global value.');\r\n }\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportGlobal(this, name);\r\n return this;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n this._globalType.write(writer);\r\n this._initExpressionEmitter.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ExternalKind, ExternalKindType } from './types';\r\nimport GlobalType from './GlobalType';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport MemoryType from './MemoryType';\r\nimport TableType from './TableType';\r\n\r\nexport default class ImportBuilder {\r\n moduleName: string;\r\n fieldName: string;\r\n externalKind: ExternalKindType;\r\n data: FuncTypeBuilder | GlobalType | MemoryType | TableType;\r\n index: number;\r\n\r\n constructor(\r\n moduleName: string,\r\n fieldName: string,\r\n externalKind: ExternalKindType,\r\n data: FuncTypeBuilder | GlobalType | MemoryType | TableType,\r\n index: number\r\n ) {\r\n this.moduleName = moduleName;\r\n this.fieldName = fieldName;\r\n this.externalKind = externalKind;\r\n this.data = data;\r\n this.index = index;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.moduleName.length);\r\n writer.writeString(this.moduleName);\r\n writer.writeVarUInt32(this.fieldName.length);\r\n writer.writeString(this.fieldName);\r\n writer.writeUInt8(this.externalKind.value);\r\n switch (this.externalKind) {\r\n case ExternalKind.Function:\r\n writer.writeVarUInt32((this.data as FuncTypeBuilder).index);\r\n break;\r\n\r\n case ExternalKind.Global:\r\n case ExternalKind.Memory:\r\n case ExternalKind.Table:\r\n (this.data as GlobalType | MemoryType | TableType).write(writer);\r\n break;\r\n\r\n default:\r\n throw new Error('Unknown external kind.');\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport { ExternalKind, BlockTypeDescriptor } from './types';\r\n\r\nexport default class ImmediateEncoder {\r\n static encodeBlockSignature(writer: BinaryWriter, blockType: BlockTypeDescriptor): void {\r\n writer.writeVarInt7(blockType.value);\r\n }\r\n\r\n static encodeRelativeDepth(writer: BinaryWriter, label: any, depth: number): void {\r\n const relativeDepth = depth - label.block.depth;\r\n writer.writeVarInt7(relativeDepth);\r\n }\r\n\r\n static encodeBranchTable(\r\n writer: BinaryWriter,\r\n defaultLabel: number,\r\n labels: number[]\r\n ): void {\r\n writer.writeVarUInt32(labels.length);\r\n labels.forEach((x) => {\r\n writer.writeVarUInt32(x);\r\n });\r\n writer.writeVarUInt32(defaultLabel);\r\n }\r\n\r\n static encodeFunction(writer: BinaryWriter, func: FunctionBuilder | ImportBuilder | number): void {\r\n let functionIndex = 0;\r\n if (func instanceof ImportBuilder) {\r\n functionIndex = func.index;\r\n } else if (typeof func === 'object' && func !== null && '_index' in func) {\r\n functionIndex = (func as FunctionBuilder)._index;\r\n } else if (typeof func === 'number') {\r\n functionIndex = func;\r\n } else {\r\n throw new Error(\r\n 'Function argument must either be the index of the function or a FunctionBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(functionIndex);\r\n }\r\n\r\n static encodeIndirectFunction(writer: BinaryWriter, funcType: FuncTypeBuilder): void {\r\n writer.writeVarUInt32(funcType.index);\r\n writer.writeVarUInt1(0);\r\n }\r\n\r\n static encodeLocal(\r\n writer: BinaryWriter,\r\n local: LocalBuilder | FunctionParameterBuilder | number\r\n ): void {\r\n Arg.notNull('local', local);\r\n\r\n let localIndex = 0;\r\n if (local instanceof LocalBuilder) {\r\n localIndex = local.index;\r\n } else if (local instanceof FunctionParameterBuilder) {\r\n localIndex = local.index;\r\n } else if (typeof local === 'number') {\r\n localIndex = local;\r\n } else {\r\n throw new Error(\r\n 'Local argument must either be the index of the local variable or a LocalBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(localIndex);\r\n }\r\n\r\n static encodeGlobal(\r\n writer: BinaryWriter,\r\n global: GlobalBuilder | ImportBuilder | number\r\n ): void {\r\n Arg.notNull('global', global);\r\n\r\n let globalIndex = 0;\r\n if (global instanceof GlobalBuilder) {\r\n globalIndex = global._index;\r\n } else if (global instanceof ImportBuilder) {\r\n if (global.externalKind !== ExternalKind.Global) {\r\n throw new Error('Import external kind must be global.');\r\n }\r\n globalIndex = global.index;\r\n } else if (typeof global === 'number') {\r\n globalIndex = global;\r\n } else {\r\n throw new Error(\r\n 'Global argument must either be the index of the global variable, GlobalBuilder, or an ImportBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(globalIndex);\r\n }\r\n\r\n static encodeFloat32(writer: BinaryWriter, value: number): void {\r\n writer.writeFloat32(value);\r\n }\r\n\r\n static encodeFloat64(writer: BinaryWriter, value: number): void {\r\n writer.writeFloat64(value);\r\n }\r\n\r\n static encodeVarInt32(writer: BinaryWriter, value: number): void {\r\n writer.writeVarInt32(value);\r\n }\r\n\r\n static encodeVarInt64(writer: BinaryWriter, value: number | bigint): void {\r\n writer.writeVarInt64(value);\r\n }\r\n\r\n static encodeVarUInt32(writer: BinaryWriter, value: number): void {\r\n writer.writeVarUInt32(value);\r\n }\r\n\r\n static encodeVarUInt1(writer: BinaryWriter, value: number): void {\r\n writer.writeVarUInt1(value);\r\n }\r\n\r\n static encodeMemoryImmediate(\r\n writer: BinaryWriter,\r\n alignment: number,\r\n offset: number\r\n ): void {\r\n writer.writeVarUInt32(alignment);\r\n writer.writeVarUInt32(offset);\r\n }\r\n\r\n static encodeV128Const(writer: BinaryWriter, bytes: Uint8Array): void {\r\n for (let i = 0; i < 16; i++) {\r\n writer.writeByte(bytes[i]);\r\n }\r\n }\r\n\r\n static encodeLaneIndex(writer: BinaryWriter, index: number): void {\r\n writer.writeByte(index);\r\n }\r\n\r\n static encodeShuffleMask(writer: BinaryWriter, mask: Uint8Array): void {\r\n for (let i = 0; i < 16; i++) {\r\n writer.writeByte(mask[i]);\r\n }\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport { ImmediateType } from './types';\r\nimport ImmediateEncoder from './ImmediateEncoder';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class Immediate {\r\n type: ImmediateType;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n values: any[];\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constructor(type: ImmediateType, values: any[]) {\r\n Arg.notNull('type', type);\r\n Arg.notNull('values', values);\r\n this.type = type;\r\n this.values = values;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createBlockSignature(blockType: any): Immediate {\r\n return new Immediate(ImmediateType.BlockSignature, [blockType]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createBranchTable(defaultLabel: any, labels: any[], depth: number): Immediate {\r\n const relativeDepths = labels.map((x) => {\r\n return depth - x.block.depth;\r\n });\r\n const defaultLabelDepth = depth - defaultLabel.block.depth;\r\n return new Immediate(ImmediateType.BranchTable, [defaultLabelDepth, relativeDepths]);\r\n }\r\n\r\n static createFloat32(value: number): Immediate {\r\n return new Immediate(ImmediateType.Float32, [value]);\r\n }\r\n\r\n static createFloat64(value: number): Immediate {\r\n return new Immediate(ImmediateType.Float64, [value]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createFunction(functionBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.Function, [functionBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createGlobal(globalBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.Global, [globalBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createIndirectFunction(functionTypeBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.IndirectFunction, [functionTypeBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createLocal(local: any): Immediate {\r\n return new Immediate(ImmediateType.Local, [local]);\r\n }\r\n\r\n static createMemoryImmediate(alignment: number, offset: number): Immediate {\r\n return new Immediate(ImmediateType.MemoryImmediate, [alignment, offset]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createRelativeDepth(label: any, depth: number): Immediate {\r\n return new Immediate(ImmediateType.RelativeDepth, [label, depth]);\r\n }\r\n\r\n static createVarUInt1(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarUInt1, [value]);\r\n }\r\n\r\n static createVarInt32(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarInt32, [value]);\r\n }\r\n\r\n static createVarInt64(value: number | bigint): Immediate {\r\n return new Immediate(ImmediateType.VarInt64, [value]);\r\n }\r\n\r\n static createVarUInt32(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarUInt32, [value]);\r\n }\r\n\r\n static createV128Const(bytes: Uint8Array): Immediate {\r\n if (bytes.length !== 16) {\r\n throw new Error('V128 constant must be exactly 16 bytes.');\r\n }\r\n return new Immediate(ImmediateType.V128Const, [bytes]);\r\n }\r\n\r\n static createLaneIndex(index: number): Immediate {\r\n return new Immediate(ImmediateType.LaneIndex, [index]);\r\n }\r\n\r\n static createShuffleMask(mask: Uint8Array): Immediate {\r\n if (mask.length !== 16) {\r\n throw new Error('Shuffle mask must be exactly 16 bytes.');\r\n }\r\n return new Immediate(ImmediateType.ShuffleMask, [mask]);\r\n }\r\n\r\n writeBytes(writer: BinaryWriter): void {\r\n switch (this.type) {\r\n case ImmediateType.BlockSignature:\r\n ImmediateEncoder.encodeBlockSignature(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.BranchTable:\r\n ImmediateEncoder.encodeBranchTable(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.Float32:\r\n ImmediateEncoder.encodeFloat32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Float64:\r\n ImmediateEncoder.encodeFloat64(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Function:\r\n ImmediateEncoder.encodeFunction(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Global:\r\n ImmediateEncoder.encodeGlobal(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.IndirectFunction:\r\n ImmediateEncoder.encodeIndirectFunction(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Local:\r\n ImmediateEncoder.encodeLocal(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.MemoryImmediate:\r\n ImmediateEncoder.encodeMemoryImmediate(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.RelativeDepth:\r\n ImmediateEncoder.encodeRelativeDepth(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.VarInt32:\r\n ImmediateEncoder.encodeVarInt32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarInt64:\r\n ImmediateEncoder.encodeVarInt64(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarUInt1:\r\n ImmediateEncoder.encodeVarUInt1(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarUInt32:\r\n ImmediateEncoder.encodeVarUInt32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.V128Const:\r\n ImmediateEncoder.encodeV128Const(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.LaneIndex:\r\n ImmediateEncoder.encodeLaneIndex(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.ShuffleMask:\r\n ImmediateEncoder.encodeShuffleMask(writer, this.values[0]);\r\n break;\r\n\r\n default:\r\n throw new Error('Cannot encode unknown operand type.');\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.writeBytes(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport Immediate from './Immediate';\r\nimport { OpCodeDef } from './types';\r\n\r\nexport default class Instruction {\r\n opCode: OpCodeDef;\r\n immediate: Immediate | null;\r\n\r\n constructor(opCode: OpCodeDef, immediate: Immediate | null) {\r\n Arg.notNull('opCode', opCode);\r\n this.opCode = opCode;\r\n this.immediate = immediate;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (this.opCode.prefix !== undefined) {\r\n writer.writeByte(this.opCode.prefix);\r\n writer.writeVarUInt32(this.opCode.value);\r\n } else {\r\n writer.writeByte(this.opCode.value);\r\n }\r\n if (this.immediate) {\r\n this.immediate.writeBytes(writer);\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import type ControlFlowBlock from './verification/ControlFlowBlock';\r\n\r\nexport default class LabelBuilder {\r\n resolved: boolean;\r\n block: ControlFlowBlock | null;\r\n\r\n constructor() {\r\n this.resolved = false;\r\n this.block = null;\r\n }\r\n\r\n get isResolved(): boolean {\r\n return this.resolved;\r\n }\r\n\r\n resolve(block: ControlFlowBlock): void {\r\n this.block = block;\r\n this.resolved = true;\r\n }\r\n\r\n reference(block: ControlFlowBlock): void {\r\n if (this.isResolved) {\r\n throw new Error('Cannot add a reference to a label that has been resolved.');\r\n }\r\n this.block = block;\r\n }\r\n}\r\n", "import type { OpCodeDef } from './types';\n\nconst OpCodes = {\n \"unreachable\": {\n value: 0,\n mnemonic: \"unreachable\",\n stackBehavior: \"None\",\n },\n \"nop\": {\n value: 1,\n mnemonic: \"nop\",\n stackBehavior: \"None\",\n },\n \"block\": {\n value: 2,\n mnemonic: \"block\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"None\",\n },\n \"loop\": {\n value: 3,\n mnemonic: \"loop\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"None\",\n },\n \"if\": {\n value: 4,\n mnemonic: \"if\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"else\": {\n value: 5,\n mnemonic: \"else\",\n stackBehavior: \"None\",\n },\n \"end\": {\n value: 11,\n mnemonic: \"end\",\n controlFlow: \"Pop\",\n stackBehavior: \"None\",\n },\n \"br\": {\n value: 12,\n mnemonic: \"br\",\n immediate: \"RelativeDepth\",\n stackBehavior: \"None\",\n },\n \"br_if\": {\n value: 13,\n mnemonic: \"br_if\",\n immediate: \"RelativeDepth\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"br_table\": {\n value: 14,\n mnemonic: \"br_table\",\n immediate: \"BranchTable\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"return\": {\n value: 15,\n mnemonic: \"return\",\n stackBehavior: \"None\",\n },\n \"call\": {\n value: 16,\n mnemonic: \"call\",\n immediate: \"Function\",\n stackBehavior: \"PopPush\",\n popOperands: [] as const,\n pushOperands: [] as const,\n },\n \"call_indirect\": {\n value: 17,\n mnemonic: \"call_indirect\",\n immediate: \"IndirectFunction\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [] as const,\n },\n \"drop\": {\n value: 26,\n mnemonic: \"drop\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"select\": {\n value: 27,\n mnemonic: \"select\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Any\",\"Any\"] as const,\n pushOperands: [\"Any\"] as const,\n },\n \"get_local\": {\n value: 32,\n mnemonic: \"local.get\",\n immediate: \"Local\",\n stackBehavior: \"Push\",\n pushOperands: [\"Any\"] as const,\n },\n \"set_local\": {\n value: 33,\n mnemonic: \"local.set\",\n immediate: \"Local\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"tee_local\": {\n value: 34,\n mnemonic: \"local.tee\",\n immediate: \"Local\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Any\"] as const,\n pushOperands: [\"Any\"] as const,\n },\n \"get_global\": {\n value: 35,\n mnemonic: \"global.get\",\n immediate: \"Global\",\n stackBehavior: \"Push\",\n pushOperands: [\"Any\"] as const,\n },\n \"set_global\": {\n value: 36,\n mnemonic: \"global.set\",\n immediate: \"Global\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"i32_load\": {\n value: 40,\n mnemonic: \"i32.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_load\": {\n value: 41,\n mnemonic: \"i64.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_load\": {\n value: 42,\n mnemonic: \"f32.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_load\": {\n value: 43,\n mnemonic: \"f64.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_load8_s\": {\n value: 44,\n mnemonic: \"i32.load8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load8_u\": {\n value: 45,\n mnemonic: \"i32.load8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load16_s\": {\n value: 46,\n mnemonic: \"i32.load16_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load16_u\": {\n value: 47,\n mnemonic: \"i32.load16_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_load8_s\": {\n value: 48,\n mnemonic: \"i64.load8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load8_u\": {\n value: 49,\n mnemonic: \"i64.load8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load16_s\": {\n value: 50,\n mnemonic: \"i64.load16_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load16_u\": {\n value: 51,\n mnemonic: \"i64.load16_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load32_s\": {\n value: 52,\n mnemonic: \"i64.load32_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load32_u\": {\n value: 53,\n mnemonic: \"i64.load32_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i32_store\": {\n value: 54,\n mnemonic: \"i32.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i64_store\": {\n value: 55,\n mnemonic: \"i64.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"f32_store\": {\n value: 56,\n mnemonic: \"f32.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Float32\"] as const,\n },\n \"f64_store\": {\n value: 57,\n mnemonic: \"f64.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Float64\"] as const,\n },\n \"i32_store8\": {\n value: 58,\n mnemonic: \"i32.store8\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i32_store16\": {\n value: 59,\n mnemonic: \"i32.store16\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i64_store8\": {\n value: 60,\n mnemonic: \"i64.store8\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"i64_store16\": {\n value: 61,\n mnemonic: \"i64.store16\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"i64_store32\": {\n value: 62,\n mnemonic: \"i64.store32\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"mem_size\": {\n value: 63,\n mnemonic: \"memory.size\",\n immediate: \"VarUInt1\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n },\n \"mem_grow\": {\n value: 64,\n mnemonic: \"memory.grow\",\n immediate: \"VarUInt1\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_const\": {\n value: 65,\n mnemonic: \"i32.const\",\n immediate: \"VarInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_const\": {\n value: 66,\n mnemonic: \"i64.const\",\n immediate: \"VarInt64\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_const\": {\n value: 67,\n mnemonic: \"f32.const\",\n immediate: \"Float32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_const\": {\n value: 68,\n mnemonic: \"f64.const\",\n immediate: \"Float64\",\n stackBehavior: \"Push\",\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_eqz\": {\n value: 69,\n mnemonic: \"i32.eqz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_eq\": {\n value: 70,\n mnemonic: \"i32.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ne\": {\n value: 71,\n mnemonic: \"i32.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_lt_s\": {\n value: 72,\n mnemonic: \"i32.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_lt_u\": {\n value: 73,\n mnemonic: \"i32.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_gt_s\": {\n value: 74,\n mnemonic: \"i32.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_gt_u\": {\n value: 75,\n mnemonic: \"i32.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_le_s\": {\n value: 76,\n mnemonic: \"i32.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_le_u\": {\n value: 77,\n mnemonic: \"i32.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ge_s\": {\n value: 78,\n mnemonic: \"i32.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ge_u\": {\n value: 79,\n mnemonic: \"i32.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_eqz\": {\n value: 80,\n mnemonic: \"i64.eqz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_eq\": {\n value: 81,\n mnemonic: \"i64.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ne\": {\n value: 82,\n mnemonic: \"i64.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_lt_s\": {\n value: 83,\n mnemonic: \"i64.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_lt_u\": {\n value: 84,\n mnemonic: \"i64.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_gt_s\": {\n value: 85,\n mnemonic: \"i64.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_gt_u\": {\n value: 86,\n mnemonic: \"i64.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_le_s\": {\n value: 87,\n mnemonic: \"i64.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_le_u\": {\n value: 88,\n mnemonic: \"i64.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ge_s\": {\n value: 89,\n mnemonic: \"i64.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ge_u\": {\n value: 90,\n mnemonic: \"i64.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_eq\": {\n value: 91,\n mnemonic: \"f32.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_ne\": {\n value: 92,\n mnemonic: \"f32.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_lt\": {\n value: 93,\n mnemonic: \"f32.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_gt\": {\n value: 94,\n mnemonic: \"f32.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_le\": {\n value: 95,\n mnemonic: \"f32.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_ge\": {\n value: 96,\n mnemonic: \"f32.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_eq\": {\n value: 97,\n mnemonic: \"f64.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_ne\": {\n value: 98,\n mnemonic: \"f64.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_lt\": {\n value: 99,\n mnemonic: \"f64.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_gt\": {\n value: 100,\n mnemonic: \"f64.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_le\": {\n value: 101,\n mnemonic: \"f64.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_ge\": {\n value: 102,\n mnemonic: \"f64.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_clz\": {\n value: 103,\n mnemonic: \"i32.clz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ctz\": {\n value: 104,\n mnemonic: \"i32.ctz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_popcnt\": {\n value: 105,\n mnemonic: \"i32.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_add\": {\n value: 106,\n mnemonic: \"i32.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_sub\": {\n value: 107,\n mnemonic: \"i32.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_mul\": {\n value: 108,\n mnemonic: \"i32.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_div_s\": {\n value: 109,\n mnemonic: \"i32.div_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_div_u\": {\n value: 110,\n mnemonic: \"i32.div_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rem_s\": {\n value: 111,\n mnemonic: \"i32.rem_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rem_u\": {\n value: 112,\n mnemonic: \"i32.rem_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_and\": {\n value: 113,\n mnemonic: \"i32.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_or\": {\n value: 114,\n mnemonic: \"i32.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_xor\": {\n value: 115,\n mnemonic: \"i32.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shl\": {\n value: 116,\n mnemonic: \"i32.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shr_s\": {\n value: 117,\n mnemonic: \"i32.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shr_u\": {\n value: 118,\n mnemonic: \"i32.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rotl\": {\n value: 119,\n mnemonic: \"i32.rotl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rotr\": {\n value: 120,\n mnemonic: \"i32.rotr\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_clz\": {\n value: 121,\n mnemonic: \"i64.clz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_ctz\": {\n value: 122,\n mnemonic: \"i64.ctz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_popcnt\": {\n value: 123,\n mnemonic: \"i64.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_add\": {\n value: 124,\n mnemonic: \"i64.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_sub\": {\n value: 125,\n mnemonic: \"i64.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_mul\": {\n value: 126,\n mnemonic: \"i64.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_div_s\": {\n value: 127,\n mnemonic: \"i64.div_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_div_u\": {\n value: 128,\n mnemonic: \"i64.div_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rem_s\": {\n value: 129,\n mnemonic: \"i64.rem_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rem_u\": {\n value: 130,\n mnemonic: \"i64.rem_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_and\": {\n value: 131,\n mnemonic: \"i64.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_or\": {\n value: 132,\n mnemonic: \"i64.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_xor\": {\n value: 133,\n mnemonic: \"i64.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shl\": {\n value: 134,\n mnemonic: \"i64.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shr_s\": {\n value: 135,\n mnemonic: \"i64.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shr_u\": {\n value: 136,\n mnemonic: \"i64.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rotl\": {\n value: 137,\n mnemonic: \"i64.rotl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rotr\": {\n value: 138,\n mnemonic: \"i64.rotr\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_abs\": {\n value: 139,\n mnemonic: \"f32.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_neg\": {\n value: 140,\n mnemonic: \"f32.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_ceil\": {\n value: 141,\n mnemonic: \"f32.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_floor\": {\n value: 142,\n mnemonic: \"f32.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_trunc\": {\n value: 143,\n mnemonic: \"f32.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_nearest\": {\n value: 144,\n mnemonic: \"f32.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_sqrt\": {\n value: 145,\n mnemonic: \"f32.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_add\": {\n value: 146,\n mnemonic: \"f32.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_sub\": {\n value: 147,\n mnemonic: \"f32.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_mul\": {\n value: 148,\n mnemonic: \"f32.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_div\": {\n value: 149,\n mnemonic: \"f32.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_min\": {\n value: 150,\n mnemonic: \"f32.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_max\": {\n value: 151,\n mnemonic: \"f32.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_copysign\": {\n value: 152,\n mnemonic: \"f32.copysign\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_abs\": {\n value: 153,\n mnemonic: \"f64.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_neg\": {\n value: 154,\n mnemonic: \"f64.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_ceil\": {\n value: 155,\n mnemonic: \"f64.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_floor\": {\n value: 156,\n mnemonic: \"f64.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_trunc\": {\n value: 157,\n mnemonic: \"f64.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_nearest\": {\n value: 158,\n mnemonic: \"f64.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_sqrt\": {\n value: 159,\n mnemonic: \"f64.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_add\": {\n value: 160,\n mnemonic: \"f64.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_sub\": {\n value: 161,\n mnemonic: \"f64.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_mul\": {\n value: 162,\n mnemonic: \"f64.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_div\": {\n value: 163,\n mnemonic: \"f64.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_min\": {\n value: 164,\n mnemonic: \"f64.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_max\": {\n value: 165,\n mnemonic: \"f64.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_copysign\": {\n value: 166,\n mnemonic: \"f64.copysign\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_wrap_i64\": {\n value: 167,\n mnemonic: \"i32.wrap_i64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f32_s\": {\n value: 168,\n mnemonic: \"i32.trunc_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f32_u\": {\n value: 169,\n mnemonic: \"i32.trunc_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f64_s\": {\n value: 170,\n mnemonic: \"i32.trunc_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f64_u\": {\n value: 171,\n mnemonic: \"i32.trunc_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_extend_i32_s\": {\n value: 172,\n mnemonic: \"i64.extend_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_extend_i32_u\": {\n value: 173,\n mnemonic: \"i64.extend_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f32_s\": {\n value: 174,\n mnemonic: \"i64.trunc_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f32_u\": {\n value: 175,\n mnemonic: \"i64.trunc_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f64_s\": {\n value: 176,\n mnemonic: \"i64.trunc_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f64_u\": {\n value: 177,\n mnemonic: \"i64.trunc_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_convert_i32_s\": {\n value: 178,\n mnemonic: \"f32.convert_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i32_u\": {\n value: 179,\n mnemonic: \"f32.convert_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i64_s\": {\n value: 180,\n mnemonic: \"f32.convert_i64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i64_u\": {\n value: 181,\n mnemonic: \"f32.convert_i64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_demote_f64\": {\n value: 182,\n mnemonic: \"f32.demote_f64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_convert_i32_s\": {\n value: 183,\n mnemonic: \"f64.convert_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i32_u\": {\n value: 184,\n mnemonic: \"f64.convert_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i64_s\": {\n value: 185,\n mnemonic: \"f64.convert_i64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i64_u\": {\n value: 186,\n mnemonic: \"f64.convert_i64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_promote_f32\": {\n value: 187,\n mnemonic: \"f64.promote_f32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_reinterpret_f32\": {\n value: 188,\n mnemonic: \"i32.reinterpret_f32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_reinterpret_f64\": {\n value: 189,\n mnemonic: \"i64.reinterpret_f64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_reinterpret_i32\": {\n value: 190,\n mnemonic: \"f32.reinterpret_i32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_reinterpret_i64\": {\n value: 191,\n mnemonic: \"f64.reinterpret_i64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_extend8_s\": {\n value: 192,\n mnemonic: \"i32.extend8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"sign-extend\",\n },\n \"i32_extend16_s\": {\n value: 193,\n mnemonic: \"i32.extend16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend8_s\": {\n value: 194,\n mnemonic: \"i64.extend8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend16_s\": {\n value: 195,\n mnemonic: \"i64.extend16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend32_s\": {\n value: 196,\n mnemonic: \"i64.extend32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i32_trunc_sat_f32_s\": {\n value: 0,\n mnemonic: \"i32.trunc_sat_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f32_u\": {\n value: 1,\n mnemonic: \"i32.trunc_sat_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f64_s\": {\n value: 2,\n mnemonic: \"i32.trunc_sat_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f64_u\": {\n value: 3,\n mnemonic: \"i32.trunc_sat_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f32_s\": {\n value: 4,\n mnemonic: \"i64.trunc_sat_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f32_u\": {\n value: 5,\n mnemonic: \"i64.trunc_sat_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f64_s\": {\n value: 6,\n mnemonic: \"i64.trunc_sat_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f64_u\": {\n value: 7,\n mnemonic: \"i64.trunc_sat_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"memory_init\": {\n value: 8,\n mnemonic: \"memory.init\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"data_drop\": {\n value: 9,\n mnemonic: \"data.drop\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"memory_copy\": {\n value: 10,\n mnemonic: \"memory.copy\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"memory_fill\": {\n value: 11,\n mnemonic: \"memory.fill\",\n immediate: \"VarUInt1\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_init\": {\n value: 12,\n mnemonic: \"table.init\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"elem_drop\": {\n value: 13,\n mnemonic: \"elem.drop\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_copy\": {\n value: 14,\n mnemonic: \"table.copy\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_grow\": {\n value: 15,\n mnemonic: \"table.grow\",\n immediate: \"VarUInt32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"table_size\": {\n value: 16,\n mnemonic: \"table.size\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"table_fill\": {\n value: 17,\n mnemonic: \"table.fill\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"ref_null\": {\n value: 208,\n mnemonic: \"ref.null\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"ref_is_null\": {\n value: 209,\n mnemonic: \"ref.is_null\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"ref_func\": {\n value: 210,\n mnemonic: \"ref.func\",\n immediate: \"Function\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"table_get\": {\n value: 37,\n mnemonic: \"table.get\",\n immediate: \"VarUInt32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"table_set\": {\n value: 38,\n mnemonic: \"table.set\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"v128_load\": {\n value: 0,\n mnemonic: \"v128.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8x8_s\": {\n value: 1,\n mnemonic: \"v128.load8x8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8x8_u\": {\n value: 2,\n mnemonic: \"v128.load8x8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16x4_s\": {\n value: 3,\n mnemonic: \"v128.load16x4_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16x4_u\": {\n value: 4,\n mnemonic: \"v128.load16x4_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32x2_s\": {\n value: 5,\n mnemonic: \"v128.load32x2_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32x2_u\": {\n value: 6,\n mnemonic: \"v128.load32x2_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8_splat\": {\n value: 7,\n mnemonic: \"v128.load8_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16_splat\": {\n value: 8,\n mnemonic: \"v128.load16_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_splat\": {\n value: 9,\n mnemonic: \"v128.load32_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_splat\": {\n value: 10,\n mnemonic: \"v128.load64_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store\": {\n value: 11,\n mnemonic: \"v128.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_const\": {\n value: 12,\n mnemonic: \"v128.const\",\n immediate: \"V128Const\",\n stackBehavior: \"Push\",\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shuffle\": {\n value: 13,\n mnemonic: \"i8x16.shuffle\",\n immediate: \"ShuffleMask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_swizzle\": {\n value: 14,\n mnemonic: \"i8x16.swizzle\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_splat\": {\n value: 15,\n mnemonic: \"i8x16.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_splat\": {\n value: 16,\n mnemonic: \"i16x8.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_splat\": {\n value: 17,\n mnemonic: \"i32x4.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_splat\": {\n value: 18,\n mnemonic: \"i64x2.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_splat\": {\n value: 19,\n mnemonic: \"f32x4.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_splat\": {\n value: 20,\n mnemonic: \"f64x2.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_extract_lane_s\": {\n value: 21,\n mnemonic: \"i8x16.extract_lane_s\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_extract_lane_u\": {\n value: 22,\n mnemonic: \"i8x16.extract_lane_u\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_replace_lane\": {\n value: 23,\n mnemonic: \"i8x16.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extract_lane_s\": {\n value: 24,\n mnemonic: \"i16x8.extract_lane_s\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extract_lane_u\": {\n value: 25,\n mnemonic: \"i16x8.extract_lane_u\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_replace_lane\": {\n value: 26,\n mnemonic: \"i16x8.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extract_lane\": {\n value: 27,\n mnemonic: \"i32x4.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_replace_lane\": {\n value: 28,\n mnemonic: \"i32x4.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extract_lane\": {\n value: 29,\n mnemonic: \"i64x2.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_replace_lane\": {\n value: 30,\n mnemonic: \"i64x2.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_extract_lane\": {\n value: 31,\n mnemonic: \"f32x4.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Float32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_replace_lane\": {\n value: 32,\n mnemonic: \"f32x4.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Float32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_extract_lane\": {\n value: 33,\n mnemonic: \"f64x2.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Float64\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_replace_lane\": {\n value: 34,\n mnemonic: \"f64x2.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Float64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_eq\": {\n value: 35,\n mnemonic: \"i8x16.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ne\": {\n value: 36,\n mnemonic: \"i8x16.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_lt_s\": {\n value: 37,\n mnemonic: \"i8x16.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_lt_u\": {\n value: 38,\n mnemonic: \"i8x16.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_gt_s\": {\n value: 39,\n mnemonic: \"i8x16.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_gt_u\": {\n value: 40,\n mnemonic: \"i8x16.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_le_s\": {\n value: 41,\n mnemonic: \"i8x16.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_le_u\": {\n value: 42,\n mnemonic: \"i8x16.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ge_s\": {\n value: 43,\n mnemonic: \"i8x16.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ge_u\": {\n value: 44,\n mnemonic: \"i8x16.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_eq\": {\n value: 45,\n mnemonic: \"i16x8.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ne\": {\n value: 46,\n mnemonic: \"i16x8.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_lt_s\": {\n value: 47,\n mnemonic: \"i16x8.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_lt_u\": {\n value: 48,\n mnemonic: \"i16x8.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_gt_s\": {\n value: 49,\n mnemonic: \"i16x8.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_gt_u\": {\n value: 50,\n mnemonic: \"i16x8.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_le_s\": {\n value: 51,\n mnemonic: \"i16x8.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_le_u\": {\n value: 52,\n mnemonic: \"i16x8.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ge_s\": {\n value: 53,\n mnemonic: \"i16x8.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ge_u\": {\n value: 54,\n mnemonic: \"i16x8.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_eq\": {\n value: 55,\n mnemonic: \"i32x4.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ne\": {\n value: 56,\n mnemonic: \"i32x4.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_lt_s\": {\n value: 57,\n mnemonic: \"i32x4.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_lt_u\": {\n value: 58,\n mnemonic: \"i32x4.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_gt_s\": {\n value: 59,\n mnemonic: \"i32x4.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_gt_u\": {\n value: 60,\n mnemonic: \"i32x4.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_le_s\": {\n value: 61,\n mnemonic: \"i32x4.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_le_u\": {\n value: 62,\n mnemonic: \"i32x4.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ge_s\": {\n value: 63,\n mnemonic: \"i32x4.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ge_u\": {\n value: 64,\n mnemonic: \"i32x4.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_eq\": {\n value: 65,\n mnemonic: \"f32x4.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ne\": {\n value: 66,\n mnemonic: \"f32x4.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_lt\": {\n value: 67,\n mnemonic: \"f32x4.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_gt\": {\n value: 68,\n mnemonic: \"f32x4.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_le\": {\n value: 69,\n mnemonic: \"f32x4.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ge\": {\n value: 70,\n mnemonic: \"f32x4.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_eq\": {\n value: 71,\n mnemonic: \"f64x2.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ne\": {\n value: 72,\n mnemonic: \"f64x2.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_lt\": {\n value: 73,\n mnemonic: \"f64x2.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_gt\": {\n value: 74,\n mnemonic: \"f64x2.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_le\": {\n value: 75,\n mnemonic: \"f64x2.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ge\": {\n value: 76,\n mnemonic: \"f64x2.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_not\": {\n value: 77,\n mnemonic: \"v128.not\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_and\": {\n value: 78,\n mnemonic: \"v128.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_andnot\": {\n value: 79,\n mnemonic: \"v128.andnot\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_or\": {\n value: 80,\n mnemonic: \"v128.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_xor\": {\n value: 81,\n mnemonic: \"v128.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_bitselect\": {\n value: 82,\n mnemonic: \"v128.bitselect\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_any_true\": {\n value: 83,\n mnemonic: \"v128.any_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8_lane\": {\n value: 84,\n mnemonic: \"v128.load8_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16_lane\": {\n value: 85,\n mnemonic: \"v128.load16_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_lane\": {\n value: 86,\n mnemonic: \"v128.load32_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_lane\": {\n value: 87,\n mnemonic: \"v128.load64_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store8_lane\": {\n value: 88,\n mnemonic: \"v128.store8_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store16_lane\": {\n value: 89,\n mnemonic: \"v128.store16_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store32_lane\": {\n value: 90,\n mnemonic: \"v128.store32_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store64_lane\": {\n value: 91,\n mnemonic: \"v128.store64_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_zero\": {\n value: 92,\n mnemonic: \"v128.load32_zero\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_zero\": {\n value: 93,\n mnemonic: \"v128.load64_zero\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f32x4_s\": {\n value: 94,\n mnemonic: \"i32x4.trunc_sat_f32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f32x4_u\": {\n value: 95,\n mnemonic: \"i32x4.trunc_sat_f32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_abs\": {\n value: 96,\n mnemonic: \"i8x16.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_neg\": {\n value: 97,\n mnemonic: \"i8x16.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_popcnt\": {\n value: 98,\n mnemonic: \"i8x16.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_all_true\": {\n value: 99,\n mnemonic: \"i8x16.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_bitmask\": {\n value: 100,\n mnemonic: \"i8x16.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_narrow_i16x8_s\": {\n value: 101,\n mnemonic: \"i8x16.narrow_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_narrow_i16x8_u\": {\n value: 102,\n mnemonic: \"i8x16.narrow_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ceil\": {\n value: 103,\n mnemonic: \"f32x4.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_floor\": {\n value: 104,\n mnemonic: \"f32x4.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_trunc\": {\n value: 105,\n mnemonic: \"f32x4.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_nearest\": {\n value: 106,\n mnemonic: \"f32x4.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shl\": {\n value: 107,\n mnemonic: \"i8x16.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shr_s\": {\n value: 108,\n mnemonic: \"i8x16.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shr_u\": {\n value: 109,\n mnemonic: \"i8x16.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add\": {\n value: 110,\n mnemonic: \"i8x16.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add_sat_s\": {\n value: 111,\n mnemonic: \"i8x16.add_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add_sat_u\": {\n value: 112,\n mnemonic: \"i8x16.add_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub\": {\n value: 113,\n mnemonic: \"i8x16.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub_sat_s\": {\n value: 114,\n mnemonic: \"i8x16.sub_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub_sat_u\": {\n value: 115,\n mnemonic: \"i8x16.sub_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ceil\": {\n value: 116,\n mnemonic: \"f64x2.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_floor\": {\n value: 117,\n mnemonic: \"f64x2.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_min_s\": {\n value: 118,\n mnemonic: \"i8x16.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_min_u\": {\n value: 119,\n mnemonic: \"i8x16.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_max_s\": {\n value: 120,\n mnemonic: \"i8x16.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_max_u\": {\n value: 121,\n mnemonic: \"i8x16.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_trunc\": {\n value: 122,\n mnemonic: \"f64x2.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_avgr_u\": {\n value: 123,\n mnemonic: \"i8x16.avgr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extadd_pairwise_i8x16_s\": {\n value: 124,\n mnemonic: \"i16x8.extadd_pairwise_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extadd_pairwise_i8x16_u\": {\n value: 125,\n mnemonic: \"i16x8.extadd_pairwise_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extadd_pairwise_i16x8_s\": {\n value: 126,\n mnemonic: \"i32x4.extadd_pairwise_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extadd_pairwise_i16x8_u\": {\n value: 127,\n mnemonic: \"i32x4.extadd_pairwise_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_abs\": {\n value: 128,\n mnemonic: \"i16x8.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_neg\": {\n value: 129,\n mnemonic: \"i16x8.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_q15mulr_sat_s\": {\n value: 130,\n mnemonic: \"i16x8.q15mulr_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_all_true\": {\n value: 131,\n mnemonic: \"i16x8.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_bitmask\": {\n value: 132,\n mnemonic: \"i16x8.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_narrow_i32x4_s\": {\n value: 133,\n mnemonic: \"i16x8.narrow_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_narrow_i32x4_u\": {\n value: 134,\n mnemonic: \"i16x8.narrow_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_low_i8x16_s\": {\n value: 135,\n mnemonic: \"i16x8.extend_low_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_high_i8x16_s\": {\n value: 136,\n mnemonic: \"i16x8.extend_high_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_low_i8x16_u\": {\n value: 137,\n mnemonic: \"i16x8.extend_low_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_high_i8x16_u\": {\n value: 138,\n mnemonic: \"i16x8.extend_high_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shl\": {\n value: 139,\n mnemonic: \"i16x8.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shr_s\": {\n value: 140,\n mnemonic: \"i16x8.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shr_u\": {\n value: 141,\n mnemonic: \"i16x8.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add\": {\n value: 142,\n mnemonic: \"i16x8.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add_sat_s\": {\n value: 143,\n mnemonic: \"i16x8.add_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add_sat_u\": {\n value: 144,\n mnemonic: \"i16x8.add_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub\": {\n value: 145,\n mnemonic: \"i16x8.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub_sat_s\": {\n value: 146,\n mnemonic: \"i16x8.sub_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub_sat_u\": {\n value: 147,\n mnemonic: \"i16x8.sub_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_nearest\": {\n value: 148,\n mnemonic: \"f64x2.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_mul\": {\n value: 149,\n mnemonic: \"i16x8.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_min_s\": {\n value: 150,\n mnemonic: \"i16x8.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_min_u\": {\n value: 151,\n mnemonic: \"i16x8.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_max_s\": {\n value: 152,\n mnemonic: \"i16x8.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_max_u\": {\n value: 153,\n mnemonic: \"i16x8.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_avgr_u\": {\n value: 155,\n mnemonic: \"i16x8.avgr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_low_i8x16_s\": {\n value: 156,\n mnemonic: \"i16x8.extmul_low_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_high_i8x16_s\": {\n value: 157,\n mnemonic: \"i16x8.extmul_high_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_low_i8x16_u\": {\n value: 158,\n mnemonic: \"i16x8.extmul_low_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_high_i8x16_u\": {\n value: 159,\n mnemonic: \"i16x8.extmul_high_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_abs\": {\n value: 160,\n mnemonic: \"i32x4.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_neg\": {\n value: 161,\n mnemonic: \"i32x4.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_all_true\": {\n value: 163,\n mnemonic: \"i32x4.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_bitmask\": {\n value: 164,\n mnemonic: \"i32x4.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_low_i16x8_s\": {\n value: 167,\n mnemonic: \"i32x4.extend_low_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_high_i16x8_s\": {\n value: 168,\n mnemonic: \"i32x4.extend_high_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_low_i16x8_u\": {\n value: 169,\n mnemonic: \"i32x4.extend_low_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_high_i16x8_u\": {\n value: 170,\n mnemonic: \"i32x4.extend_high_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shl\": {\n value: 171,\n mnemonic: \"i32x4.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shr_s\": {\n value: 172,\n mnemonic: \"i32x4.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shr_u\": {\n value: 173,\n mnemonic: \"i32x4.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_add\": {\n value: 174,\n mnemonic: \"i32x4.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_convert_i32x4_s\": {\n value: 175,\n mnemonic: \"f32x4.convert_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_convert_i32x4_u\": {\n value: 176,\n mnemonic: \"f32x4.convert_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_sub\": {\n value: 177,\n mnemonic: \"i32x4.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_mul\": {\n value: 181,\n mnemonic: \"i32x4.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_min_s\": {\n value: 182,\n mnemonic: \"i32x4.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_min_u\": {\n value: 183,\n mnemonic: \"i32x4.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_max_s\": {\n value: 184,\n mnemonic: \"i32x4.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_max_u\": {\n value: 185,\n mnemonic: \"i32x4.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_dot_i16x8_s\": {\n value: 186,\n mnemonic: \"i32x4.dot_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_low_i16x8_s\": {\n value: 188,\n mnemonic: \"i32x4.extmul_low_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_high_i16x8_s\": {\n value: 189,\n mnemonic: \"i32x4.extmul_high_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_low_i16x8_u\": {\n value: 190,\n mnemonic: \"i32x4.extmul_low_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_high_i16x8_u\": {\n value: 191,\n mnemonic: \"i32x4.extmul_high_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_abs\": {\n value: 192,\n mnemonic: \"i64x2.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_neg\": {\n value: 193,\n mnemonic: \"i64x2.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_all_true\": {\n value: 195,\n mnemonic: \"i64x2.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_bitmask\": {\n value: 196,\n mnemonic: \"i64x2.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_low_i32x4_s\": {\n value: 199,\n mnemonic: \"i64x2.extend_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_high_i32x4_s\": {\n value: 200,\n mnemonic: \"i64x2.extend_high_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_low_i32x4_u\": {\n value: 201,\n mnemonic: \"i64x2.extend_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_high_i32x4_u\": {\n value: 202,\n mnemonic: \"i64x2.extend_high_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shl\": {\n value: 203,\n mnemonic: \"i64x2.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shr_s\": {\n value: 204,\n mnemonic: \"i64x2.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shr_u\": {\n value: 205,\n mnemonic: \"i64x2.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_add\": {\n value: 206,\n mnemonic: \"i64x2.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_sub\": {\n value: 209,\n mnemonic: \"i64x2.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_mul\": {\n value: 213,\n mnemonic: \"i64x2.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_eq\": {\n value: 214,\n mnemonic: \"i64x2.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_ne\": {\n value: 215,\n mnemonic: \"i64x2.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_lt_s\": {\n value: 216,\n mnemonic: \"i64x2.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_gt_s\": {\n value: 217,\n mnemonic: \"i64x2.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_le_s\": {\n value: 218,\n mnemonic: \"i64x2.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_ge_s\": {\n value: 219,\n mnemonic: \"i64x2.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_low_i32x4_s\": {\n value: 220,\n mnemonic: \"i64x2.extmul_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_high_i32x4_s\": {\n value: 221,\n mnemonic: \"i64x2.extmul_high_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_low_i32x4_u\": {\n value: 222,\n mnemonic: \"i64x2.extmul_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_high_i32x4_u\": {\n value: 223,\n mnemonic: \"i64x2.extmul_high_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_abs\": {\n value: 224,\n mnemonic: \"f32x4.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_neg\": {\n value: 225,\n mnemonic: \"f32x4.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_sqrt\": {\n value: 227,\n mnemonic: \"f32x4.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_add\": {\n value: 228,\n mnemonic: \"f32x4.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_sub\": {\n value: 229,\n mnemonic: \"f32x4.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_mul\": {\n value: 230,\n mnemonic: \"f32x4.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_div\": {\n value: 231,\n mnemonic: \"f32x4.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_min\": {\n value: 232,\n mnemonic: \"f32x4.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_max\": {\n value: 233,\n mnemonic: \"f32x4.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_pmin\": {\n value: 234,\n mnemonic: \"f32x4.pmin\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_pmax\": {\n value: 235,\n mnemonic: \"f32x4.pmax\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_abs\": {\n value: 236,\n mnemonic: \"f64x2.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_neg\": {\n value: 237,\n mnemonic: \"f64x2.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_sqrt\": {\n value: 239,\n mnemonic: \"f64x2.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_add\": {\n value: 240,\n mnemonic: \"f64x2.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_sub\": {\n value: 241,\n mnemonic: \"f64x2.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_mul\": {\n value: 242,\n mnemonic: \"f64x2.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_div\": {\n value: 243,\n mnemonic: \"f64x2.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_min\": {\n value: 244,\n mnemonic: \"f64x2.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_max\": {\n value: 245,\n mnemonic: \"f64x2.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_pmin\": {\n value: 246,\n mnemonic: \"f64x2.pmin\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_pmax\": {\n value: 247,\n mnemonic: \"f64x2.pmax\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f64x2_s_zero\": {\n value: 248,\n mnemonic: \"i32x4.trunc_sat_f64x2_s_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f64x2_u_zero\": {\n value: 249,\n mnemonic: \"i32x4.trunc_sat_f64x2_u_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_convert_low_i32x4_s\": {\n value: 250,\n mnemonic: \"f64x2.convert_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_convert_low_i32x4_u\": {\n value: 251,\n mnemonic: \"f64x2.convert_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_demote_f64x2_zero\": {\n value: 252,\n mnemonic: \"f32x4.demote_f64x2_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_promote_low_f32x4\": {\n value: 253,\n mnemonic: \"f64x2.promote_low_f32x4\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n} as const satisfies Record;\n\nexport default OpCodes;\n", "import OpCodes from './OpCodes';\n\nexport default abstract class OpCodeEmitter {\n unreachable(): any {\n return this.emit(OpCodes.unreachable);\n }\n\n nop(): any {\n return this.emit(OpCodes.nop);\n }\n\n block(blockType: any, label?: any): any {\n return this.emit(OpCodes.block, blockType, label);\n }\n\n loop(blockType: any, label?: any): any {\n return this.emit(OpCodes.loop, blockType, label);\n }\n\n if(blockType: any, label?: any): any {\n return this.emit(OpCodes.if, blockType, label);\n }\n\n else(): any {\n return this.emit(OpCodes.else);\n }\n\n end(): any {\n return this.emit(OpCodes.end);\n }\n\n br(labelBuilder: any): any {\n return this.emit(OpCodes.br, labelBuilder);\n }\n\n br_if(labelBuilder: any): any {\n return this.emit(OpCodes.br_if, labelBuilder);\n }\n\n br_table(defaultLabelBuilder: any, ...labelBuilders: any[]): any {\n return this.emit(OpCodes.br_table, defaultLabelBuilder, labelBuilders);\n }\n\n return(): any {\n return this.emit(OpCodes.return);\n }\n\n call(functionBuilder: any): any {\n return this.emit(OpCodes.call, functionBuilder);\n }\n\n call_indirect(funcTypeBuilder: any): any {\n return this.emit(OpCodes.call_indirect, funcTypeBuilder);\n }\n\n drop(): any {\n return this.emit(OpCodes.drop);\n }\n\n select(): any {\n return this.emit(OpCodes.select);\n }\n\n get_local(local: any): any {\n return this.emit(OpCodes.get_local, local);\n }\n\n set_local(local: any): any {\n return this.emit(OpCodes.set_local, local);\n }\n\n tee_local(local: any): any {\n return this.emit(OpCodes.tee_local, local);\n }\n\n get_global(global: any): any {\n return this.emit(OpCodes.get_global, global);\n }\n\n set_global(global: any): any {\n return this.emit(OpCodes.set_global, global);\n }\n\n load_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load, alignment, offset);\n }\n\n load_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load, alignment, offset);\n }\n\n load_f32(alignment: number, offset: number): any {\n return this.emit(OpCodes.f32_load, alignment, offset);\n }\n\n load_f64(alignment: number, offset: number): any {\n return this.emit(OpCodes.f64_load, alignment, offset);\n }\n\n load8_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load8_s, alignment, offset);\n }\n\n load8_i32_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load8_u, alignment, offset);\n }\n\n load16_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load16_s, alignment, offset);\n }\n\n load16_i32_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load16_u, alignment, offset);\n }\n\n load8_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load8_s, alignment, offset);\n }\n\n load8_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load8_u, alignment, offset);\n }\n\n load16_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load16_s, alignment, offset);\n }\n\n load16_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load16_u, alignment, offset);\n }\n\n load32_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load32_s, alignment, offset);\n }\n\n load32_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load32_u, alignment, offset);\n }\n\n store_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store, alignment, offset);\n }\n\n store_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store, alignment, offset);\n }\n\n store_f32(alignment: number, offset: number): any {\n return this.emit(OpCodes.f32_store, alignment, offset);\n }\n\n store_f64(alignment: number, offset: number): any {\n return this.emit(OpCodes.f64_store, alignment, offset);\n }\n\n store8_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store8, alignment, offset);\n }\n\n store16_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store16, alignment, offset);\n }\n\n store8_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store8, alignment, offset);\n }\n\n store16_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store16, alignment, offset);\n }\n\n store32_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store32, alignment, offset);\n }\n\n mem_size(varUInt1: number): any {\n return this.emit(OpCodes.mem_size, varUInt1);\n }\n\n mem_grow(varUInt1: number): any {\n return this.emit(OpCodes.mem_grow, varUInt1);\n }\n\n const_i32(varInt32: number): any {\n return this.emit(OpCodes.i32_const, varInt32);\n }\n\n const_i64(varInt64: number | bigint): any {\n return this.emit(OpCodes.i64_const, varInt64);\n }\n\n const_f32(float32: number): any {\n return this.emit(OpCodes.f32_const, float32);\n }\n\n const_f64(float64: number): any {\n return this.emit(OpCodes.f64_const, float64);\n }\n\n eqz_i32(): any {\n return this.emit(OpCodes.i32_eqz);\n }\n\n eq_i32(): any {\n return this.emit(OpCodes.i32_eq);\n }\n\n ne_i32(): any {\n return this.emit(OpCodes.i32_ne);\n }\n\n lt_i32(): any {\n return this.emit(OpCodes.i32_lt_s);\n }\n\n lt_i32_u(): any {\n return this.emit(OpCodes.i32_lt_u);\n }\n\n gt_i32(): any {\n return this.emit(OpCodes.i32_gt_s);\n }\n\n gt_i32_u(): any {\n return this.emit(OpCodes.i32_gt_u);\n }\n\n le_i32(): any {\n return this.emit(OpCodes.i32_le_s);\n }\n\n le_i32_u(): any {\n return this.emit(OpCodes.i32_le_u);\n }\n\n ge_i32(): any {\n return this.emit(OpCodes.i32_ge_s);\n }\n\n ge_i32_u(): any {\n return this.emit(OpCodes.i32_ge_u);\n }\n\n eqz_i64(): any {\n return this.emit(OpCodes.i64_eqz);\n }\n\n eq_i64(): any {\n return this.emit(OpCodes.i64_eq);\n }\n\n ne_i64(): any {\n return this.emit(OpCodes.i64_ne);\n }\n\n lt_i64(): any {\n return this.emit(OpCodes.i64_lt_s);\n }\n\n lt_i64_u(): any {\n return this.emit(OpCodes.i64_lt_u);\n }\n\n gt_i64(): any {\n return this.emit(OpCodes.i64_gt_s);\n }\n\n gt_i64_u(): any {\n return this.emit(OpCodes.i64_gt_u);\n }\n\n le_i64(): any {\n return this.emit(OpCodes.i64_le_s);\n }\n\n le_i64_u(): any {\n return this.emit(OpCodes.i64_le_u);\n }\n\n ge_i64(): any {\n return this.emit(OpCodes.i64_ge_s);\n }\n\n ge_i64_u(): any {\n return this.emit(OpCodes.i64_ge_u);\n }\n\n eq_f32(): any {\n return this.emit(OpCodes.f32_eq);\n }\n\n ne_f32(): any {\n return this.emit(OpCodes.f32_ne);\n }\n\n lt_f32(): any {\n return this.emit(OpCodes.f32_lt);\n }\n\n gt_f32(): any {\n return this.emit(OpCodes.f32_gt);\n }\n\n le_f32(): any {\n return this.emit(OpCodes.f32_le);\n }\n\n ge_f32(): any {\n return this.emit(OpCodes.f32_ge);\n }\n\n eq_f64(): any {\n return this.emit(OpCodes.f64_eq);\n }\n\n ne_f64(): any {\n return this.emit(OpCodes.f64_ne);\n }\n\n lt_f64(): any {\n return this.emit(OpCodes.f64_lt);\n }\n\n gt_f64(): any {\n return this.emit(OpCodes.f64_gt);\n }\n\n le_f64(): any {\n return this.emit(OpCodes.f64_le);\n }\n\n ge_f64(): any {\n return this.emit(OpCodes.f64_ge);\n }\n\n clz_i32(): any {\n return this.emit(OpCodes.i32_clz);\n }\n\n ctz_i32(): any {\n return this.emit(OpCodes.i32_ctz);\n }\n\n popcnt_i32(): any {\n return this.emit(OpCodes.i32_popcnt);\n }\n\n add_i32(): any {\n return this.emit(OpCodes.i32_add);\n }\n\n sub_i32(): any {\n return this.emit(OpCodes.i32_sub);\n }\n\n mul_i32(): any {\n return this.emit(OpCodes.i32_mul);\n }\n\n div_i32(): any {\n return this.emit(OpCodes.i32_div_s);\n }\n\n div_i32_u(): any {\n return this.emit(OpCodes.i32_div_u);\n }\n\n rem_i32(): any {\n return this.emit(OpCodes.i32_rem_s);\n }\n\n rem_i32_u(): any {\n return this.emit(OpCodes.i32_rem_u);\n }\n\n and_i32(): any {\n return this.emit(OpCodes.i32_and);\n }\n\n or_i32(): any {\n return this.emit(OpCodes.i32_or);\n }\n\n xor_i32(): any {\n return this.emit(OpCodes.i32_xor);\n }\n\n shl_i32(): any {\n return this.emit(OpCodes.i32_shl);\n }\n\n shr_i32(): any {\n return this.emit(OpCodes.i32_shr_s);\n }\n\n shr_i32_u(): any {\n return this.emit(OpCodes.i32_shr_u);\n }\n\n rotl_i32(): any {\n return this.emit(OpCodes.i32_rotl);\n }\n\n rotr_i32(): any {\n return this.emit(OpCodes.i32_rotr);\n }\n\n clz_i64(): any {\n return this.emit(OpCodes.i64_clz);\n }\n\n ctz_i64(): any {\n return this.emit(OpCodes.i64_ctz);\n }\n\n popcnt_i64(): any {\n return this.emit(OpCodes.i64_popcnt);\n }\n\n add_i64(): any {\n return this.emit(OpCodes.i64_add);\n }\n\n sub_i64(): any {\n return this.emit(OpCodes.i64_sub);\n }\n\n mul_i64(): any {\n return this.emit(OpCodes.i64_mul);\n }\n\n div_i64(): any {\n return this.emit(OpCodes.i64_div_s);\n }\n\n div_i64_u(): any {\n return this.emit(OpCodes.i64_div_u);\n }\n\n rem_i64(): any {\n return this.emit(OpCodes.i64_rem_s);\n }\n\n rem_i64_u(): any {\n return this.emit(OpCodes.i64_rem_u);\n }\n\n and_i64(): any {\n return this.emit(OpCodes.i64_and);\n }\n\n or_i64(): any {\n return this.emit(OpCodes.i64_or);\n }\n\n xor_i64(): any {\n return this.emit(OpCodes.i64_xor);\n }\n\n shl_i64(): any {\n return this.emit(OpCodes.i64_shl);\n }\n\n shr_i64(): any {\n return this.emit(OpCodes.i64_shr_s);\n }\n\n shr_i64_u(): any {\n return this.emit(OpCodes.i64_shr_u);\n }\n\n rotl_i64(): any {\n return this.emit(OpCodes.i64_rotl);\n }\n\n rotr_i64(): any {\n return this.emit(OpCodes.i64_rotr);\n }\n\n abs_f32(): any {\n return this.emit(OpCodes.f32_abs);\n }\n\n neg_f32(): any {\n return this.emit(OpCodes.f32_neg);\n }\n\n ceil_f32(): any {\n return this.emit(OpCodes.f32_ceil);\n }\n\n floor_f32(): any {\n return this.emit(OpCodes.f32_floor);\n }\n\n trunc_f32(): any {\n return this.emit(OpCodes.f32_trunc);\n }\n\n nearest_f32(): any {\n return this.emit(OpCodes.f32_nearest);\n }\n\n sqrt_f32(): any {\n return this.emit(OpCodes.f32_sqrt);\n }\n\n add_f32(): any {\n return this.emit(OpCodes.f32_add);\n }\n\n sub_f32(): any {\n return this.emit(OpCodes.f32_sub);\n }\n\n mul_f32(): any {\n return this.emit(OpCodes.f32_mul);\n }\n\n div_f32(): any {\n return this.emit(OpCodes.f32_div);\n }\n\n min_f32(): any {\n return this.emit(OpCodes.f32_min);\n }\n\n max_f32(): any {\n return this.emit(OpCodes.f32_max);\n }\n\n copysign_f32(): any {\n return this.emit(OpCodes.f32_copysign);\n }\n\n abs_f64(): any {\n return this.emit(OpCodes.f64_abs);\n }\n\n neg_f64(): any {\n return this.emit(OpCodes.f64_neg);\n }\n\n ceil_f64(): any {\n return this.emit(OpCodes.f64_ceil);\n }\n\n floor_f64(): any {\n return this.emit(OpCodes.f64_floor);\n }\n\n trunc_f64(): any {\n return this.emit(OpCodes.f64_trunc);\n }\n\n nearest_f64(): any {\n return this.emit(OpCodes.f64_nearest);\n }\n\n sqrt_f64(): any {\n return this.emit(OpCodes.f64_sqrt);\n }\n\n add_f64(): any {\n return this.emit(OpCodes.f64_add);\n }\n\n sub_f64(): any {\n return this.emit(OpCodes.f64_sub);\n }\n\n mul_f64(): any {\n return this.emit(OpCodes.f64_mul);\n }\n\n div_f64(): any {\n return this.emit(OpCodes.f64_div);\n }\n\n min_f64(): any {\n return this.emit(OpCodes.f64_min);\n }\n\n max_f64(): any {\n return this.emit(OpCodes.f64_max);\n }\n\n copysign_f64(): any {\n return this.emit(OpCodes.f64_copysign);\n }\n\n wrap_i64_i32(): any {\n return this.emit(OpCodes.i32_wrap_i64);\n }\n\n trunc_f32_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_f32_s);\n }\n\n trunc_f32_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_f32_u);\n }\n\n trunc_f64_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_f64_s);\n }\n\n trunc_f64_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_f64_u);\n }\n\n extend_i32_s_i64(): any {\n return this.emit(OpCodes.i64_extend_i32_s);\n }\n\n extend_i32_u_i64(): any {\n return this.emit(OpCodes.i64_extend_i32_u);\n }\n\n trunc_f32_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_f32_s);\n }\n\n trunc_f32_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_f32_u);\n }\n\n trunc_f64_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_f64_s);\n }\n\n trunc_f64_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_f64_u);\n }\n\n convert_i32_s_f32(): any {\n return this.emit(OpCodes.f32_convert_i32_s);\n }\n\n convert_i32_u_f32(): any {\n return this.emit(OpCodes.f32_convert_i32_u);\n }\n\n convert_i64_s_f32(): any {\n return this.emit(OpCodes.f32_convert_i64_s);\n }\n\n convert_i64_u_f32(): any {\n return this.emit(OpCodes.f32_convert_i64_u);\n }\n\n demote_f64_f32(): any {\n return this.emit(OpCodes.f32_demote_f64);\n }\n\n convert_i32_s_f64(): any {\n return this.emit(OpCodes.f64_convert_i32_s);\n }\n\n convert_i32_u_f64(): any {\n return this.emit(OpCodes.f64_convert_i32_u);\n }\n\n convert_i64_s_f64(): any {\n return this.emit(OpCodes.f64_convert_i64_s);\n }\n\n convert_i64_u_f64(): any {\n return this.emit(OpCodes.f64_convert_i64_u);\n }\n\n promote_f32_f64(): any {\n return this.emit(OpCodes.f64_promote_f32);\n }\n\n reinterpret_f32_i32(): any {\n return this.emit(OpCodes.i32_reinterpret_f32);\n }\n\n reinterpret_f64_i64(): any {\n return this.emit(OpCodes.i64_reinterpret_f64);\n }\n\n reinterpret_i32_f32(): any {\n return this.emit(OpCodes.f32_reinterpret_i32);\n }\n\n reinterpret_i64_f64(): any {\n return this.emit(OpCodes.f64_reinterpret_i64);\n }\n\n extend8_s_i32(): any {\n return this.emit(OpCodes.i32_extend8_s);\n }\n\n extend16_s_i32(): any {\n return this.emit(OpCodes.i32_extend16_s);\n }\n\n extend8_s_i64(): any {\n return this.emit(OpCodes.i64_extend8_s);\n }\n\n extend16_s_i64(): any {\n return this.emit(OpCodes.i64_extend16_s);\n }\n\n extend32_s_i64(): any {\n return this.emit(OpCodes.i64_extend32_s);\n }\n\n trunc_sat_f32_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f32_s);\n }\n\n trunc_sat_f32_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f32_u);\n }\n\n trunc_sat_f64_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f64_s);\n }\n\n trunc_sat_f64_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f64_u);\n }\n\n trunc_sat_f32_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f32_s);\n }\n\n trunc_sat_f32_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f32_u);\n }\n\n trunc_sat_f64_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f64_s);\n }\n\n trunc_sat_f64_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f64_u);\n }\n\n memory_init(alignment: number, offset: number): any {\n return this.emit(OpCodes.memory_init, alignment, offset);\n }\n\n data_drop(varUInt32: number): any {\n return this.emit(OpCodes.data_drop, varUInt32);\n }\n\n memory_copy(alignment: number, offset: number): any {\n return this.emit(OpCodes.memory_copy, alignment, offset);\n }\n\n memory_fill(varUInt1: number): any {\n return this.emit(OpCodes.memory_fill, varUInt1);\n }\n\n table_init(alignment: number, offset: number): any {\n return this.emit(OpCodes.table_init, alignment, offset);\n }\n\n elem_drop(varUInt32: number): any {\n return this.emit(OpCodes.elem_drop, varUInt32);\n }\n\n table_copy(alignment: number, offset: number): any {\n return this.emit(OpCodes.table_copy, alignment, offset);\n }\n\n table_grow(varUInt32: number): any {\n return this.emit(OpCodes.table_grow, varUInt32);\n }\n\n table_size(varUInt32: number): any {\n return this.emit(OpCodes.table_size, varUInt32);\n }\n\n table_fill(varUInt32: number): any {\n return this.emit(OpCodes.table_fill, varUInt32);\n }\n\n ref_null(varUInt32: number): any {\n return this.emit(OpCodes.ref_null, varUInt32);\n }\n\n ref_is_null(): any {\n return this.emit(OpCodes.ref_is_null);\n }\n\n ref_func(functionBuilder: any): any {\n return this.emit(OpCodes.ref_func, functionBuilder);\n }\n\n table_get(varUInt32: number): any {\n return this.emit(OpCodes.table_get, varUInt32);\n }\n\n table_set(varUInt32: number): any {\n return this.emit(OpCodes.table_set, varUInt32);\n }\n\n load_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load, alignment, offset);\n }\n\n load8x8_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8x8_s, alignment, offset);\n }\n\n load8x8_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8x8_u, alignment, offset);\n }\n\n load16x4_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16x4_s, alignment, offset);\n }\n\n load16x4_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16x4_u, alignment, offset);\n }\n\n load32x2_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32x2_s, alignment, offset);\n }\n\n load32x2_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32x2_u, alignment, offset);\n }\n\n load8_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8_splat, alignment, offset);\n }\n\n load16_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16_splat, alignment, offset);\n }\n\n load32_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_splat, alignment, offset);\n }\n\n load64_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_splat, alignment, offset);\n }\n\n store_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store, alignment, offset);\n }\n\n const_v128(bytes: Uint8Array): any {\n return this.emit(OpCodes.v128_const, bytes);\n }\n\n shuffle_i8x16(mask: Uint8Array): any {\n return this.emit(OpCodes.i8x16_shuffle, mask);\n }\n\n swizzle_i8x16(): any {\n return this.emit(OpCodes.i8x16_swizzle);\n }\n\n splat_i8x16(): any {\n return this.emit(OpCodes.i8x16_splat);\n }\n\n splat_i16x8(): any {\n return this.emit(OpCodes.i16x8_splat);\n }\n\n splat_i32x4(): any {\n return this.emit(OpCodes.i32x4_splat);\n }\n\n splat_i64x2(): any {\n return this.emit(OpCodes.i64x2_splat);\n }\n\n splat_f32x4(): any {\n return this.emit(OpCodes.f32x4_splat);\n }\n\n splat_f64x2(): any {\n return this.emit(OpCodes.f64x2_splat);\n }\n\n extract_lane_s_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_extract_lane_s, laneIndex);\n }\n\n extract_lane_u_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_extract_lane_u, laneIndex);\n }\n\n replace_lane_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_replace_lane, laneIndex);\n }\n\n extract_lane_s_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_extract_lane_s, laneIndex);\n }\n\n extract_lane_u_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_extract_lane_u, laneIndex);\n }\n\n replace_lane_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_replace_lane, laneIndex);\n }\n\n extract_lane_i32x4(laneIndex: number): any {\n return this.emit(OpCodes.i32x4_extract_lane, laneIndex);\n }\n\n replace_lane_i32x4(laneIndex: number): any {\n return this.emit(OpCodes.i32x4_replace_lane, laneIndex);\n }\n\n extract_lane_i64x2(laneIndex: number): any {\n return this.emit(OpCodes.i64x2_extract_lane, laneIndex);\n }\n\n replace_lane_i64x2(laneIndex: number): any {\n return this.emit(OpCodes.i64x2_replace_lane, laneIndex);\n }\n\n extract_lane_f32x4(laneIndex: number): any {\n return this.emit(OpCodes.f32x4_extract_lane, laneIndex);\n }\n\n replace_lane_f32x4(laneIndex: number): any {\n return this.emit(OpCodes.f32x4_replace_lane, laneIndex);\n }\n\n extract_lane_f64x2(laneIndex: number): any {\n return this.emit(OpCodes.f64x2_extract_lane, laneIndex);\n }\n\n replace_lane_f64x2(laneIndex: number): any {\n return this.emit(OpCodes.f64x2_replace_lane, laneIndex);\n }\n\n eq_i8x16(): any {\n return this.emit(OpCodes.i8x16_eq);\n }\n\n ne_i8x16(): any {\n return this.emit(OpCodes.i8x16_ne);\n }\n\n lt_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_lt_s);\n }\n\n lt_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_lt_u);\n }\n\n gt_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_gt_s);\n }\n\n gt_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_gt_u);\n }\n\n le_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_le_s);\n }\n\n le_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_le_u);\n }\n\n ge_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_ge_s);\n }\n\n ge_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_ge_u);\n }\n\n eq_i16x8(): any {\n return this.emit(OpCodes.i16x8_eq);\n }\n\n ne_i16x8(): any {\n return this.emit(OpCodes.i16x8_ne);\n }\n\n lt_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_lt_s);\n }\n\n lt_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_lt_u);\n }\n\n gt_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_gt_s);\n }\n\n gt_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_gt_u);\n }\n\n le_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_le_s);\n }\n\n le_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_le_u);\n }\n\n ge_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_ge_s);\n }\n\n ge_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_ge_u);\n }\n\n eq_i32x4(): any {\n return this.emit(OpCodes.i32x4_eq);\n }\n\n ne_i32x4(): any {\n return this.emit(OpCodes.i32x4_ne);\n }\n\n lt_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_lt_s);\n }\n\n lt_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_lt_u);\n }\n\n gt_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_gt_s);\n }\n\n gt_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_gt_u);\n }\n\n le_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_le_s);\n }\n\n le_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_le_u);\n }\n\n ge_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_ge_s);\n }\n\n ge_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_ge_u);\n }\n\n eq_f32x4(): any {\n return this.emit(OpCodes.f32x4_eq);\n }\n\n ne_f32x4(): any {\n return this.emit(OpCodes.f32x4_ne);\n }\n\n lt_f32x4(): any {\n return this.emit(OpCodes.f32x4_lt);\n }\n\n gt_f32x4(): any {\n return this.emit(OpCodes.f32x4_gt);\n }\n\n le_f32x4(): any {\n return this.emit(OpCodes.f32x4_le);\n }\n\n ge_f32x4(): any {\n return this.emit(OpCodes.f32x4_ge);\n }\n\n eq_f64x2(): any {\n return this.emit(OpCodes.f64x2_eq);\n }\n\n ne_f64x2(): any {\n return this.emit(OpCodes.f64x2_ne);\n }\n\n lt_f64x2(): any {\n return this.emit(OpCodes.f64x2_lt);\n }\n\n gt_f64x2(): any {\n return this.emit(OpCodes.f64x2_gt);\n }\n\n le_f64x2(): any {\n return this.emit(OpCodes.f64x2_le);\n }\n\n ge_f64x2(): any {\n return this.emit(OpCodes.f64x2_ge);\n }\n\n not_v128(): any {\n return this.emit(OpCodes.v128_not);\n }\n\n and_v128(): any {\n return this.emit(OpCodes.v128_and);\n }\n\n andnot_v128(): any {\n return this.emit(OpCodes.v128_andnot);\n }\n\n or_v128(): any {\n return this.emit(OpCodes.v128_or);\n }\n\n xor_v128(): any {\n return this.emit(OpCodes.v128_xor);\n }\n\n bitselect_v128(): any {\n return this.emit(OpCodes.v128_bitselect);\n }\n\n any_true_v128(): any {\n return this.emit(OpCodes.v128_any_true);\n }\n\n load8_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8_lane, alignment, offset);\n }\n\n load16_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16_lane, alignment, offset);\n }\n\n load32_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_lane, alignment, offset);\n }\n\n load64_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_lane, alignment, offset);\n }\n\n store8_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store8_lane, alignment, offset);\n }\n\n store16_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store16_lane, alignment, offset);\n }\n\n store32_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store32_lane, alignment, offset);\n }\n\n store64_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store64_lane, alignment, offset);\n }\n\n load32_zero_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_zero, alignment, offset);\n }\n\n load64_zero_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_zero, alignment, offset);\n }\n\n trunc_sat_f32x4_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f32x4_s);\n }\n\n trunc_sat_f32x4_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f32x4_u);\n }\n\n abs_i8x16(): any {\n return this.emit(OpCodes.i8x16_abs);\n }\n\n neg_i8x16(): any {\n return this.emit(OpCodes.i8x16_neg);\n }\n\n popcnt_i8x16(): any {\n return this.emit(OpCodes.i8x16_popcnt);\n }\n\n all_true_i8x16(): any {\n return this.emit(OpCodes.i8x16_all_true);\n }\n\n bitmask_i8x16(): any {\n return this.emit(OpCodes.i8x16_bitmask);\n }\n\n narrow_i16x8_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_narrow_i16x8_s);\n }\n\n narrow_i16x8_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_narrow_i16x8_u);\n }\n\n ceil_f32x4(): any {\n return this.emit(OpCodes.f32x4_ceil);\n }\n\n floor_f32x4(): any {\n return this.emit(OpCodes.f32x4_floor);\n }\n\n trunc_f32x4(): any {\n return this.emit(OpCodes.f32x4_trunc);\n }\n\n nearest_f32x4(): any {\n return this.emit(OpCodes.f32x4_nearest);\n }\n\n shl_i8x16(): any {\n return this.emit(OpCodes.i8x16_shl);\n }\n\n shr_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_shr_s);\n }\n\n shr_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_shr_u);\n }\n\n add_i8x16(): any {\n return this.emit(OpCodes.i8x16_add);\n }\n\n add_sat_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_add_sat_s);\n }\n\n add_sat_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_add_sat_u);\n }\n\n sub_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub);\n }\n\n sub_sat_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub_sat_s);\n }\n\n sub_sat_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub_sat_u);\n }\n\n ceil_f64x2(): any {\n return this.emit(OpCodes.f64x2_ceil);\n }\n\n floor_f64x2(): any {\n return this.emit(OpCodes.f64x2_floor);\n }\n\n min_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_min_s);\n }\n\n min_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_min_u);\n }\n\n max_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_max_s);\n }\n\n max_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_max_u);\n }\n\n trunc_f64x2(): any {\n return this.emit(OpCodes.f64x2_trunc);\n }\n\n avgr_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_avgr_u);\n }\n\n extadd_pairwise_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extadd_pairwise_i8x16_s);\n }\n\n extadd_pairwise_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extadd_pairwise_i8x16_u);\n }\n\n extadd_pairwise_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extadd_pairwise_i16x8_s);\n }\n\n extadd_pairwise_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extadd_pairwise_i16x8_u);\n }\n\n abs_i16x8(): any {\n return this.emit(OpCodes.i16x8_abs);\n }\n\n neg_i16x8(): any {\n return this.emit(OpCodes.i16x8_neg);\n }\n\n q15mulr_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_q15mulr_sat_s);\n }\n\n all_true_i16x8(): any {\n return this.emit(OpCodes.i16x8_all_true);\n }\n\n bitmask_i16x8(): any {\n return this.emit(OpCodes.i16x8_bitmask);\n }\n\n narrow_i32x4_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_narrow_i32x4_s);\n }\n\n narrow_i32x4_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_narrow_i32x4_u);\n }\n\n extend_low_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_low_i8x16_s);\n }\n\n extend_high_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_high_i8x16_s);\n }\n\n extend_low_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_low_i8x16_u);\n }\n\n extend_high_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_high_i8x16_u);\n }\n\n shl_i16x8(): any {\n return this.emit(OpCodes.i16x8_shl);\n }\n\n shr_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_shr_s);\n }\n\n shr_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_shr_u);\n }\n\n add_i16x8(): any {\n return this.emit(OpCodes.i16x8_add);\n }\n\n add_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_add_sat_s);\n }\n\n add_sat_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_add_sat_u);\n }\n\n sub_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub);\n }\n\n sub_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub_sat_s);\n }\n\n sub_sat_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub_sat_u);\n }\n\n nearest_f64x2(): any {\n return this.emit(OpCodes.f64x2_nearest);\n }\n\n mul_i16x8(): any {\n return this.emit(OpCodes.i16x8_mul);\n }\n\n min_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_min_s);\n }\n\n min_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_min_u);\n }\n\n max_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_max_s);\n }\n\n max_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_max_u);\n }\n\n avgr_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_avgr_u);\n }\n\n extmul_low_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_low_i8x16_s);\n }\n\n extmul_high_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_high_i8x16_s);\n }\n\n extmul_low_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_low_i8x16_u);\n }\n\n extmul_high_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_high_i8x16_u);\n }\n\n abs_i32x4(): any {\n return this.emit(OpCodes.i32x4_abs);\n }\n\n neg_i32x4(): any {\n return this.emit(OpCodes.i32x4_neg);\n }\n\n all_true_i32x4(): any {\n return this.emit(OpCodes.i32x4_all_true);\n }\n\n bitmask_i32x4(): any {\n return this.emit(OpCodes.i32x4_bitmask);\n }\n\n extend_low_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_low_i16x8_s);\n }\n\n extend_high_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_high_i16x8_s);\n }\n\n extend_low_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_low_i16x8_u);\n }\n\n extend_high_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_high_i16x8_u);\n }\n\n shl_i32x4(): any {\n return this.emit(OpCodes.i32x4_shl);\n }\n\n shr_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_shr_s);\n }\n\n shr_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_shr_u);\n }\n\n add_i32x4(): any {\n return this.emit(OpCodes.i32x4_add);\n }\n\n convert_i32x4_s_f32x4(): any {\n return this.emit(OpCodes.f32x4_convert_i32x4_s);\n }\n\n convert_i32x4_u_f32x4(): any {\n return this.emit(OpCodes.f32x4_convert_i32x4_u);\n }\n\n sub_i32x4(): any {\n return this.emit(OpCodes.i32x4_sub);\n }\n\n mul_i32x4(): any {\n return this.emit(OpCodes.i32x4_mul);\n }\n\n min_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_min_s);\n }\n\n min_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_min_u);\n }\n\n max_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_max_s);\n }\n\n max_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_max_u);\n }\n\n dot_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_dot_i16x8_s);\n }\n\n extmul_low_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_low_i16x8_s);\n }\n\n extmul_high_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_high_i16x8_s);\n }\n\n extmul_low_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_low_i16x8_u);\n }\n\n extmul_high_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_high_i16x8_u);\n }\n\n abs_i64x2(): any {\n return this.emit(OpCodes.i64x2_abs);\n }\n\n neg_i64x2(): any {\n return this.emit(OpCodes.i64x2_neg);\n }\n\n all_true_i64x2(): any {\n return this.emit(OpCodes.i64x2_all_true);\n }\n\n bitmask_i64x2(): any {\n return this.emit(OpCodes.i64x2_bitmask);\n }\n\n extend_low_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_low_i32x4_s);\n }\n\n extend_high_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_high_i32x4_s);\n }\n\n extend_low_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_low_i32x4_u);\n }\n\n extend_high_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_high_i32x4_u);\n }\n\n shl_i64x2(): any {\n return this.emit(OpCodes.i64x2_shl);\n }\n\n shr_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_shr_s);\n }\n\n shr_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_shr_u);\n }\n\n add_i64x2(): any {\n return this.emit(OpCodes.i64x2_add);\n }\n\n sub_i64x2(): any {\n return this.emit(OpCodes.i64x2_sub);\n }\n\n mul_i64x2(): any {\n return this.emit(OpCodes.i64x2_mul);\n }\n\n eq_i64x2(): any {\n return this.emit(OpCodes.i64x2_eq);\n }\n\n ne_i64x2(): any {\n return this.emit(OpCodes.i64x2_ne);\n }\n\n lt_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_lt_s);\n }\n\n gt_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_gt_s);\n }\n\n le_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_le_s);\n }\n\n ge_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_ge_s);\n }\n\n extmul_low_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_low_i32x4_s);\n }\n\n extmul_high_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_high_i32x4_s);\n }\n\n extmul_low_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_low_i32x4_u);\n }\n\n extmul_high_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_high_i32x4_u);\n }\n\n abs_f32x4(): any {\n return this.emit(OpCodes.f32x4_abs);\n }\n\n neg_f32x4(): any {\n return this.emit(OpCodes.f32x4_neg);\n }\n\n sqrt_f32x4(): any {\n return this.emit(OpCodes.f32x4_sqrt);\n }\n\n add_f32x4(): any {\n return this.emit(OpCodes.f32x4_add);\n }\n\n sub_f32x4(): any {\n return this.emit(OpCodes.f32x4_sub);\n }\n\n mul_f32x4(): any {\n return this.emit(OpCodes.f32x4_mul);\n }\n\n div_f32x4(): any {\n return this.emit(OpCodes.f32x4_div);\n }\n\n min_f32x4(): any {\n return this.emit(OpCodes.f32x4_min);\n }\n\n max_f32x4(): any {\n return this.emit(OpCodes.f32x4_max);\n }\n\n pmin_f32x4(): any {\n return this.emit(OpCodes.f32x4_pmin);\n }\n\n pmax_f32x4(): any {\n return this.emit(OpCodes.f32x4_pmax);\n }\n\n abs_f64x2(): any {\n return this.emit(OpCodes.f64x2_abs);\n }\n\n neg_f64x2(): any {\n return this.emit(OpCodes.f64x2_neg);\n }\n\n sqrt_f64x2(): any {\n return this.emit(OpCodes.f64x2_sqrt);\n }\n\n add_f64x2(): any {\n return this.emit(OpCodes.f64x2_add);\n }\n\n sub_f64x2(): any {\n return this.emit(OpCodes.f64x2_sub);\n }\n\n mul_f64x2(): any {\n return this.emit(OpCodes.f64x2_mul);\n }\n\n div_f64x2(): any {\n return this.emit(OpCodes.f64x2_div);\n }\n\n min_f64x2(): any {\n return this.emit(OpCodes.f64x2_min);\n }\n\n max_f64x2(): any {\n return this.emit(OpCodes.f64x2_max);\n }\n\n pmin_f64x2(): any {\n return this.emit(OpCodes.f64x2_pmin);\n }\n\n pmax_f64x2(): any {\n return this.emit(OpCodes.f64x2_pmax);\n }\n\n trunc_sat_f64x2_s_zero_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f64x2_s_zero);\n }\n\n trunc_sat_f64x2_u_zero_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f64x2_u_zero);\n }\n\n convert_low_i32x4_s_f64x2(): any {\n return this.emit(OpCodes.f64x2_convert_low_i32x4_s);\n }\n\n convert_low_i32x4_u_f64x2(): any {\n return this.emit(OpCodes.f64x2_convert_low_i32x4_u);\n }\n\n demote_f64x2_zero_f32x4(): any {\n return this.emit(OpCodes.f32x4_demote_f64x2_zero);\n }\n\n promote_low_f32x4_f64x2(): any {\n return this.emit(OpCodes.f64x2_promote_low_f32x4);\n }\n\n abstract emit(opCode: any, ...args: any[]): any;\n}\n", "import { BlockTypeDescriptor } from '../types';\r\nimport OperandStack from './OperandStack';\r\n\r\nexport default class ControlFlowBlock {\r\n stack: OperandStack;\r\n blockType: BlockTypeDescriptor;\r\n parent: ControlFlowBlock | null;\r\n index: number;\r\n depth: number;\r\n childrenCount: number;\r\n isLoop: boolean;\r\n\r\n constructor(\r\n stack: OperandStack,\r\n blockType: BlockTypeDescriptor,\r\n parent: ControlFlowBlock | null,\r\n index: number,\r\n depth: number,\r\n childrenCount: number,\r\n isLoop: boolean = false\r\n ) {\r\n this.stack = stack;\r\n this.blockType = blockType;\r\n this.parent = parent;\r\n this.index = index;\r\n this.depth = depth;\r\n this.childrenCount = childrenCount;\r\n this.isLoop = isLoop;\r\n }\r\n\r\n canReference(block: ControlFlowBlock): boolean {\r\n if (this.depth > block.depth) {\r\n return false;\r\n }\r\n\r\n let potentialMatch: ControlFlowBlock = block;\r\n for (let index = 0; index < block.depth - this.depth; index++) {\r\n potentialMatch = potentialMatch.parent!;\r\n }\r\n\r\n return potentialMatch === this;\r\n }\r\n\r\n findParent(other: ControlFlowBlock): ControlFlowBlock | null {\r\n let potentialParent: ControlFlowBlock;\r\n let potentialMatch: ControlFlowBlock;\r\n\r\n if (other.depth > this.depth) {\r\n potentialParent = this;\r\n potentialMatch = other;\r\n } else {\r\n potentialParent = other;\r\n potentialMatch = this;\r\n }\r\n\r\n for (let index = 0; index < Math.abs(potentialParent.depth - potentialMatch.depth); index++) {\r\n potentialMatch = potentialMatch.parent!;\r\n }\r\n\r\n return potentialParent === potentialMatch ? potentialParent : null;\r\n }\r\n}\r\n", "export default class VerificationError extends Error {\r\n constructor(message?: string) {\r\n super(message);\r\n this.name = 'VerificationError';\r\n }\r\n}\r\n", "import { BlockType, BlockTypeDescriptor } from '../types';\r\nimport ControlFlowBlock from './ControlFlowBlock';\r\nimport LabelBuilder from '../LabelBuilder';\r\nimport OperandStack from './OperandStack';\r\nimport VerificationError from './VerificationError';\r\n\r\nexport default class ControlFlowVerifier {\r\n _stack: LabelBuilder[] = [];\r\n _unresolvedLabels: LabelBuilder[] = [];\r\n _disableVerification: boolean;\r\n\r\n constructor(disableVerification: boolean) {\r\n this._disableVerification = disableVerification;\r\n }\r\n\r\n get size(): number {\r\n return this._stack.length;\r\n }\r\n\r\n push(\r\n operandStack: OperandStack,\r\n blockType: BlockTypeDescriptor,\r\n label: LabelBuilder | null = null,\r\n isLoop: boolean = false\r\n ): LabelBuilder {\r\n const current = this.peek();\r\n if (label) {\r\n if (!this._disableVerification && label.isResolved) {\r\n throw new VerificationError(\r\n 'Cannot use a label that has already been associated with another block.'\r\n );\r\n }\r\n\r\n const labelIndex = this._unresolvedLabels.findIndex((x) => x === label);\r\n if (labelIndex === -1) {\r\n throw new VerificationError('The label was not created for this function.');\r\n }\r\n\r\n if (\r\n !this._disableVerification &&\r\n label.block &&\r\n current &&\r\n !current.block!.canReference(label.block)\r\n ) {\r\n throw new VerificationError(\r\n 'Label has been referenced by an instruction in an enclosing block that ' +\r\n 'cannot branch to the current enclosing block.'\r\n );\r\n }\r\n\r\n this._unresolvedLabels.splice(labelIndex, 1);\r\n } else {\r\n label = new LabelBuilder();\r\n }\r\n\r\n const block = !current\r\n ? new ControlFlowBlock(operandStack, BlockType.Void, null, 0, 0, 0)\r\n : new ControlFlowBlock(\r\n operandStack,\r\n blockType,\r\n current.block!,\r\n current.block!.childrenCount++,\r\n current.block!.depth + 1,\r\n 0,\r\n isLoop\r\n );\r\n\r\n label.resolve(block);\r\n this._stack.push(label);\r\n return label;\r\n }\r\n\r\n pop(): void {\r\n if (this._stack.length === 0) {\r\n throw new VerificationError('Cannot end the block, the stack is empty.');\r\n }\r\n this._stack.pop();\r\n }\r\n\r\n peek(): LabelBuilder | null {\r\n return this._stack.length === 0 ? null : this._stack[this._stack.length - 1];\r\n }\r\n\r\n defineLabel(): LabelBuilder {\r\n const label = new LabelBuilder();\r\n this._unresolvedLabels.push(label);\r\n return label;\r\n }\r\n\r\n reference(label: LabelBuilder): void {\r\n if (this._disableVerification) {\r\n return;\r\n }\r\n\r\n const current = this.peek();\r\n if (label.isResolved) {\r\n if (!current || !label.block!.canReference(current.block!)) {\r\n throw new VerificationError(\r\n 'The label cannot be referenced by the current enclosing block.'\r\n );\r\n }\r\n } else {\r\n if (!this._unresolvedLabels.find((x) => x === label)) {\r\n throw new VerificationError('The label was not created for this function.');\r\n }\r\n\r\n if (!label.block) {\r\n throw new VerificationError('Label has not been associated with any block.');\r\n }\r\n\r\n const potentialParent = label.block.findParent(current!.block!);\r\n if (!potentialParent) {\r\n throw new VerificationError('The reference to this label is invalid.');\r\n }\r\n\r\n label.reference(potentialParent);\r\n }\r\n }\r\n\r\n verify(): void {\r\n if (this._disableVerification) {\r\n return;\r\n }\r\n\r\n if (this._unresolvedLabels.some((x) => x.block)) {\r\n throw new VerificationError('The function contains unresolved labels.');\r\n }\r\n\r\n if (this._stack.length === 1) {\r\n throw new VerificationError('Function is missing closing end instruction.');\r\n } else if (this._stack.length !== 0) {\r\n throw new VerificationError(\r\n `Function has ${this._stack.length} control structures ` +\r\n 'that are not closed. Every block, if, and loop must have a corresponding end instruction.'\r\n );\r\n }\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from '../types';\r\n\r\nexport default class OperandStack {\r\n static Empty: OperandStack = (() => {\r\n const operandStack = Object.create(OperandStack.prototype) as OperandStack;\r\n operandStack._valueType = null!;\r\n operandStack._previous = null;\r\n operandStack._length = 0;\r\n return operandStack;\r\n })();\r\n\r\n _previous: OperandStack | null;\r\n _length: number;\r\n _valueType: ValueTypeDescriptor;\r\n\r\n constructor(valueType: ValueTypeDescriptor, previous: OperandStack | null = null) {\r\n this._valueType = valueType;\r\n this._previous = previous;\r\n this._length = this._previous ? this._previous._length + 1 : 1;\r\n }\r\n\r\n get length(): number {\r\n return this._length;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n if (this.isEmpty) {\r\n throw new Error('The stack is empty.');\r\n }\r\n return this._valueType;\r\n }\r\n\r\n get isEmpty(): boolean {\r\n return this._length === 0;\r\n }\r\n\r\n push(valueType: ValueTypeDescriptor): OperandStack {\r\n return new OperandStack(valueType, this);\r\n }\r\n\r\n pop(): OperandStack {\r\n if (this.isEmpty) {\r\n throw new Error('The stack is empty.');\r\n }\r\n return this._previous!;\r\n }\r\n\r\n peek(): OperandStack | null {\r\n return this._previous;\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FuncTypeSignature {\r\n static empty = new FuncTypeSignature([], []);\r\n\r\n returnTypes: ValueTypeDescriptor[];\r\n parameterTypes: ValueTypeDescriptor[];\r\n\r\n constructor(returnTypes: ValueTypeDescriptor[], parameterTypes: ValueTypeDescriptor[]) {\r\n this.returnTypes = returnTypes;\r\n this.parameterTypes = parameterTypes;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { TypeForm, ValueTypeDescriptor } from './types';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\n\r\nexport default class FuncTypeBuilder {\r\n key: string;\r\n index: number;\r\n returnTypes: ValueTypeDescriptor[];\r\n parameterTypes: ValueTypeDescriptor[];\r\n\r\n constructor(\r\n key: string,\r\n returnTypes: ValueTypeDescriptor[],\r\n parameterTypes: ValueTypeDescriptor[],\r\n index: number\r\n ) {\r\n this.key = key;\r\n this.returnTypes = returnTypes;\r\n this.parameterTypes = parameterTypes;\r\n this.index = index;\r\n }\r\n\r\n get typeForm() {\r\n return TypeForm.Func;\r\n }\r\n\r\n static createKey(returnTypes: ValueTypeDescriptor[], parameterTypes: ValueTypeDescriptor[]): string {\r\n let key = '(';\r\n returnTypes.forEach((x, i) => {\r\n key += x.short;\r\n if (i !== returnTypes.length - 1) {\r\n key += ', ';\r\n }\r\n });\r\n\r\n key += ')(';\r\n parameterTypes.forEach((x, i) => {\r\n key += x.short;\r\n if (i !== parameterTypes.length - 1) {\r\n key += ', ';\r\n }\r\n });\r\n\r\n key += ')';\r\n return key;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarInt7(TypeForm.Func.value);\r\n writer.writeVarUInt32(this.parameterTypes.length);\r\n this.parameterTypes.forEach((x) => {\r\n writer.writeVarInt7(x.value);\r\n });\r\n\r\n writer.writeVarUInt1(this.returnTypes.length);\r\n this.returnTypes.forEach((x) => {\r\n writer.writeVarInt7(x.value);\r\n });\r\n }\r\n\r\n toSignature(): FuncTypeSignature {\r\n return new FuncTypeSignature(this.returnTypes, this.parameterTypes);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import OperandStack from './OperandStack';\r\nimport OpCodes from '../OpCodes';\r\nimport { ValueType, BlockType, ImmediateType, ValueTypeDescriptor, BlockTypeDescriptor, OpCodeDef } from '../types';\r\nimport { OperandStackBehavior, OperandStackType, ControlFlowType } from './types';\r\nimport Immediate from '../Immediate';\r\nimport ControlFlowBlock from './ControlFlowBlock';\r\nimport type FunctionBuilder from '../FunctionBuilder';\r\nimport ImportBuilder from '../ImportBuilder';\r\nimport FuncTypeBuilder from '../FuncTypeBuilder';\r\nimport LocalBuilder from '../LocalBuilder';\r\nimport GlobalBuilder from '../GlobalBuilder';\r\nimport FunctionParameterBuilder from '../FunctionParameterBuilder';\r\nimport FuncTypeSignature from '../FuncTypeSignature';\r\nimport VerificationError from './VerificationError';\r\n\r\nexport default class OperandStackVerifier {\r\n _operandStack: OperandStack;\r\n _instructionCount: number;\r\n _funcType: FuncTypeSignature;\r\n\r\n constructor(funcType: FuncTypeSignature) {\r\n this._operandStack = OperandStack.Empty;\r\n this._instructionCount = 0;\r\n this._funcType = funcType;\r\n }\r\n\r\n get stack(): OperandStack {\r\n return this._operandStack;\r\n }\r\n\r\n verifyInstruction(\r\n controlBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null\r\n ): void {\r\n let modifiedStack = this._operandStack;\r\n if (opCode.stackBehavior !== OperandStackBehavior.None) {\r\n modifiedStack = this._verifyStack(controlBlock, opCode, immediate);\r\n }\r\n\r\n if (opCode.controlFlow === ControlFlowType.Pop) {\r\n this._verifyControlFlowPop(controlBlock, modifiedStack);\r\n } else if (opCode === (OpCodes as any).return) {\r\n modifiedStack = this._verifyReturnValues(modifiedStack, true);\r\n }\r\n\r\n if (immediate && immediate.type === ImmediateType.RelativeDepth) {\r\n this._verifyBranch(modifiedStack, immediate);\r\n }\r\n\r\n this._operandStack = modifiedStack;\r\n this._instructionCount++;\r\n }\r\n\r\n verifyElse(controlBlock: ControlFlowBlock): void {\r\n if (controlBlock.blockType !== BlockType.Void) {\r\n // Non-void if block: the true branch must have the result on stack\r\n if (this._operandStack.isEmpty) {\r\n throw new VerificationError(\r\n `else: expected ${(controlBlock.blockType as BlockTypeDescriptor).name} on the stack from the if-branch but the stack is empty.`\r\n );\r\n }\r\n const expectedType = controlBlock.blockType as ValueTypeDescriptor;\r\n if (this._operandStack.valueType !== expectedType) {\r\n throw new VerificationError(\r\n `else: expected ${expectedType.name} on the stack but found ${this._operandStack.valueType.name}.`\r\n );\r\n }\r\n const stackAfterPop = this._operandStack.pop();\r\n if (stackAfterPop !== controlBlock.stack) {\r\n throw new VerificationError(\r\n 'else: stack (minus result value) does not match the if-block entry stack.'\r\n );\r\n }\r\n } else {\r\n // Void if block: stack must match entry\r\n if (this._operandStack !== controlBlock.stack) {\r\n throw new VerificationError(\r\n 'else: stack does not match the if-block entry stack.'\r\n );\r\n }\r\n }\r\n // Reset stack for else branch\r\n this._operandStack = controlBlock.stack;\r\n }\r\n\r\n _verifyBranch(stack: OperandStack, immediate: Immediate): void {\r\n const targetBlock = immediate.values[0].block as ControlFlowBlock;\r\n const targetEntryStack = targetBlock.stack;\r\n\r\n if (targetBlock.isLoop) {\r\n // Branch to loop header: no result values needed, stack must match entry\r\n if (targetEntryStack !== stack) {\r\n throw new VerificationError(\r\n 'Branch to loop: stack does not match the loop entry stack.'\r\n );\r\n }\r\n return;\r\n }\r\n\r\n if (targetBlock.blockType !== BlockType.Void) {\r\n // Non-void block: branch must carry the result value\r\n if (stack.isEmpty) {\r\n throw new VerificationError(\r\n `Branch expects ${(targetBlock.blockType as BlockTypeDescriptor).name} on the stack but the stack is empty.`\r\n );\r\n }\r\n const expectedType = targetBlock.blockType as ValueTypeDescriptor;\r\n if (stack.valueType !== expectedType) {\r\n throw new VerificationError(\r\n `Branch expects ${expectedType.name} but found ${stack.valueType.name} on the stack.`\r\n );\r\n }\r\n stack = stack.pop();\r\n }\r\n\r\n if (targetEntryStack !== stack) {\r\n throw new VerificationError(\r\n 'Branch: stack does not match the target block entry stack.'\r\n );\r\n }\r\n }\r\n\r\n _verifyReturnValues(stack: OperandStack, pop: boolean = false): OperandStack {\r\n const remaining = this._getStackValueTypes(stack, stack.length);\r\n if (remaining.length !== this._funcType.returnTypes.length) {\r\n if (remaining.length === 0) {\r\n throw new VerificationError(\r\n `Function expected to return ${this._formatAndList(this._funcType.returnTypes, (x) => x.name)} ` +\r\n 'but stack is empty.'\r\n );\r\n } else if (this._funcType.returnTypes.length === 0) {\r\n throw new VerificationError(\r\n `Function does not have any return values but ${this._formatAndList(remaining, (x) => x.name)} ` +\r\n `was found on the stack.`\r\n );\r\n }\r\n\r\n throw new VerificationError(\r\n `Function return values do not match the items on the stack. ` +\r\n `Expected: ${this._formatAndList(this._funcType.returnTypes, (x) => x.name)} ` +\r\n `Found on stack: ${this._formatAndList(remaining, (x) => x.name)}.`\r\n );\r\n }\r\n\r\n let errorMessage = '';\r\n for (let index = 0; index < remaining.length; index++) {\r\n if (remaining[index] !== this._funcType.returnTypes[index]) {\r\n errorMessage =\r\n `A ${this._funcType.returnTypes[index]} was expected at ${remaining.length - index} ` +\r\n `but a ${remaining[index]} was found. `;\r\n }\r\n }\r\n\r\n if (errorMessage !== '') {\r\n throw new VerificationError('Error returning from function: ' + errorMessage);\r\n }\r\n\r\n if (pop) {\r\n for (let index = 0; index < remaining.length; index++) {\r\n stack = stack.pop();\r\n }\r\n }\r\n\r\n return stack;\r\n }\r\n\r\n _verifyControlFlowPop(controlBlock: ControlFlowBlock, stack: OperandStack): void {\r\n if (controlBlock.depth === 0) {\r\n this._verifyReturnValues(stack);\r\n } else {\r\n const expectedStack =\r\n controlBlock.blockType !== BlockType.Void ? stack.pop() : stack;\r\n if (controlBlock.stack !== expectedStack) {\r\n throw new VerificationError();\r\n }\r\n }\r\n }\r\n\r\n _verifyStack(\r\n controlFlowBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null\r\n ): OperandStack {\r\n let modifiedStack = this._operandStack;\r\n const funcType = this._getFuncType(opCode, immediate);\r\n\r\n if (\r\n opCode.stackBehavior === OperandStackBehavior.Pop ||\r\n opCode.stackBehavior === OperandStackBehavior.PopPush\r\n ) {\r\n modifiedStack = this._verifyStackPop(modifiedStack, opCode, funcType);\r\n }\r\n\r\n if (\r\n opCode.stackBehavior === OperandStackBehavior.Push ||\r\n opCode.stackBehavior === OperandStackBehavior.PopPush\r\n ) {\r\n modifiedStack = this._stackPush(\r\n modifiedStack,\r\n controlFlowBlock,\r\n opCode,\r\n immediate,\r\n funcType\r\n );\r\n }\r\n\r\n return modifiedStack;\r\n }\r\n\r\n _verifyStackPop(\r\n stack: OperandStack,\r\n opCode: OpCodeDef,\r\n funcType: FuncTypeBuilder | null\r\n ): OperandStack {\r\n if (funcType) {\r\n stack = funcType.parameterTypes.reduce((i, x) => {\r\n if (x !== i.valueType) {\r\n throw new VerificationError(\r\n `Unexpected type found on stack at offset ${this._instructionCount + 1}. ` +\r\n `A ${x} was expected but a ${i.valueType} was found.`\r\n );\r\n }\r\n return i.pop();\r\n }, stack);\r\n }\r\n\r\n stack = (opCode.popOperands || []).reduce((i, x) => {\r\n if (x === OperandStackType.Any) {\r\n return i.pop();\r\n }\r\n\r\n const valueType = (ValueType as any)[x] as ValueTypeDescriptor;\r\n if (valueType !== i.valueType) {\r\n throw new VerificationError(\r\n `Unexpected type found on stack at offset ${this._instructionCount + 1}. ` +\r\n `A ${valueType} was expected but a ${i.valueType} was found.`\r\n );\r\n }\r\n return i.pop();\r\n }, stack);\r\n\r\n return stack;\r\n }\r\n\r\n _stackPush(\r\n stack: OperandStack,\r\n controlBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n funcType: FuncTypeBuilder | null\r\n ): OperandStack {\r\n const stackStart = stack;\r\n if (funcType) {\r\n stack = funcType.returnTypes.reduce((i, x) => {\r\n return i.push(x);\r\n }, stack);\r\n }\r\n\r\n stack = (opCode.pushOperands || []).reduce((i, x) => {\r\n let valueType: ValueTypeDescriptor;\r\n if (x !== OperandStackType.Any) {\r\n valueType = (ValueType as any)[x] as ValueTypeDescriptor;\r\n } else {\r\n const popCount = this._operandStack.length - stackStart.length;\r\n valueType = this._getStackObjectValueType(opCode, immediate, popCount);\r\n }\r\n return i.push(valueType);\r\n }, stack);\r\n\r\n return stack;\r\n }\r\n\r\n _getFuncType(opCode: OpCodeDef, immediate: Immediate | null): FuncTypeBuilder | null {\r\n let funcType: FuncTypeBuilder | null = null;\r\n\r\n if (opCode === (OpCodes as any).call) {\r\n if (immediate!.values[0] instanceof ImportBuilder) {\r\n funcType = immediate!.values[0].data as FuncTypeBuilder;\r\n } else if (immediate!.values[0] && 'funcTypeBuilder' in immediate!.values[0]) {\r\n funcType = (immediate!.values[0] as FunctionBuilder).funcTypeBuilder;\r\n } else {\r\n throw new VerificationError('Error getting funcType for call, invalid immediate.');\r\n }\r\n } else if (opCode === (OpCodes as any).call_indirect) {\r\n if (immediate!.values[0] instanceof FuncTypeBuilder) {\r\n funcType = immediate!.values[0];\r\n } else {\r\n throw new VerificationError(\r\n 'Error getting funcType for call_indirect, invalid immediate.'\r\n );\r\n }\r\n }\r\n\r\n return funcType;\r\n }\r\n\r\n _getStackObjectValueType(\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n argCount: number\r\n ): ValueTypeDescriptor {\r\n if (\r\n opCode === (OpCodes as any).get_global ||\r\n opCode === (OpCodes as any).set_global\r\n ) {\r\n if (immediate!.values[0] instanceof GlobalBuilder) {\r\n return immediate!.values[0].valueType;\r\n } else if (immediate!.values[0] instanceof ImportBuilder) {\r\n return (immediate!.values[0].data as GlobalType).valueType;\r\n }\r\n throw new VerificationError('Invalid operand for global instruction.');\r\n } else if (\r\n opCode === (OpCodes as any).get_local ||\r\n opCode === (OpCodes as any).set_local ||\r\n opCode === (OpCodes as any).tee_local\r\n ) {\r\n if (\r\n !(immediate!.values[0] instanceof LocalBuilder) &&\r\n !(immediate!.values[0] instanceof FunctionParameterBuilder)\r\n ) {\r\n throw new VerificationError('Invalid operand for local instruction.');\r\n }\r\n return immediate!.values[0].valueType;\r\n }\r\n\r\n const stackArgTypes = this._getStackValueTypes(this._operandStack, argCount);\r\n return stackArgTypes[0];\r\n }\r\n\r\n _getStackValueTypes(stack: OperandStack, count: number): ValueTypeDescriptor[] {\r\n const results: ValueTypeDescriptor[] = [];\r\n let current = stack;\r\n\r\n for (let index = 0; index < count; index++) {\r\n results.push(current.valueType);\r\n current = current.pop();\r\n }\r\n\r\n return results.reverse();\r\n }\r\n\r\n _formatAndList(values: T[], getText?: (item: T) => string): string {\r\n if (values.length === 1) {\r\n return getText ? getText(values[0]) : String(values[0]);\r\n }\r\n\r\n let text = '';\r\n for (let index = 0; index < values.length; index++) {\r\n text += getText ? getText(values[index]) : String(values[index]);\r\n if (index === values.length - 2) {\r\n text += ' and ';\r\n } else if (index !== values.length - 1) {\r\n text += ', ';\r\n }\r\n }\r\n\r\n return text;\r\n }\r\n}\r\n\r\n// Import at the end to avoid circular dependency issues at type level\r\nimport type GlobalType from '../GlobalType';\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport { BlockTypeDescriptor, ImmediateType, OpCodeDef, WasmFeature } from './types';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport Immediate from './Immediate';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport Instruction from './Instruction';\r\nimport LabelBuilder from './LabelBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport OpCodeEmitter from './OpCodeEmitter';\r\nimport OpCodes from './OpCodes';\r\nimport ControlFlowVerifier from './verification/ControlFlowVerifier';\r\nimport { ControlFlowType } from './verification/types';\r\nimport OperandStackVerifier from './verification/OperandStackVerifier';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\nimport { BlockType } from './types';\r\n\r\nconst validateParameters = (immediateType: string, values: any[] | undefined, length: number): void => {\r\n if (!values || values.length !== length) {\r\n throw new Error(`Unexpected number of values for ${immediateType}.`);\r\n }\r\n};\r\n\r\nexport interface AssemblyEmitterOptions {\r\n disableVerification: boolean;\r\n features?: Set;\r\n}\r\n\r\nexport default class AssemblyEmitter extends OpCodeEmitter {\r\n _instructions: Instruction[];\r\n _locals: LocalBuilder[];\r\n _entryLabel: LabelBuilder;\r\n _controlFlowVerifier: ControlFlowVerifier;\r\n _operandStackVerifier: OperandStackVerifier;\r\n _options: AssemblyEmitterOptions;\r\n\r\n constructor(\r\n funcSignature: FuncTypeSignature,\r\n options: AssemblyEmitterOptions = { disableVerification: false }\r\n ) {\r\n super();\r\n\r\n Arg.instanceOf('funcSignature', funcSignature, FuncTypeSignature);\r\n this._instructions = [];\r\n this._locals = [];\r\n this._controlFlowVerifier = new ControlFlowVerifier(options.disableVerification);\r\n this._operandStackVerifier = new OperandStackVerifier(funcSignature);\r\n this._entryLabel = this._controlFlowVerifier.push(\r\n this._operandStackVerifier.stack,\r\n BlockType.Void\r\n );\r\n this._options = options;\r\n }\r\n\r\n get returnValues(): any {\r\n return this;\r\n }\r\n\r\n get parameters(): FunctionParameterBuilder[] {\r\n return [];\r\n }\r\n\r\n get entryLabel(): LabelBuilder {\r\n return this._entryLabel;\r\n }\r\n\r\n get disableVerification(): boolean {\r\n return this._options.disableVerification;\r\n }\r\n\r\n getParameter(_index: number): FunctionParameterBuilder | LocalBuilder {\r\n throw new Error('Not supported.');\r\n }\r\n\r\n declareLocal(\r\n type: any,\r\n name: string | null = null,\r\n count: number = 1\r\n ): LocalBuilder {\r\n const localBuilder = new LocalBuilder(\r\n type,\r\n name,\r\n this._locals.length + this.parameters.length,\r\n count\r\n );\r\n this._locals.push(localBuilder);\r\n return localBuilder;\r\n }\r\n\r\n defineLabel(): LabelBuilder {\r\n return this._controlFlowVerifier.defineLabel();\r\n }\r\n\r\n emit(opCode: OpCodeDef, ...args: any[]): any {\r\n Arg.notNull('opCode', opCode);\r\n const depth = this._controlFlowVerifier.size - 1;\r\n let result: any = null;\r\n let immediate: Immediate | null = null;\r\n let pushLabel: LabelBuilder | null = null;\r\n let labelCallback: ((label: any) => void) | null = null;\r\n\r\n if (depth < 0) {\r\n throw new Error(\r\n 'Cannot add any instructions after the main control enclosure has been closed.'\r\n );\r\n }\r\n\r\n if (opCode.controlFlow === ControlFlowType.Push && args.length > 1) {\r\n if (args.length > 2) {\r\n throw new Error(`Unexpected number of values for ${ImmediateType.BlockSignature}.`);\r\n }\r\n\r\n if (args[1]) {\r\n if (args[1] instanceof LabelBuilder) {\r\n pushLabel = args[1];\r\n } else if (typeof args[1] === 'function') {\r\n const userFunction = args[1];\r\n labelCallback = (x: any) => {\r\n userFunction(x);\r\n };\r\n } else {\r\n throw new Error('Error');\r\n }\r\n }\r\n\r\n args = [args[0]];\r\n }\r\n\r\n if (opCode.feature && this._options.features && !this._options.features.has(opCode.feature as WasmFeature)) {\r\n throw new Error(\r\n `Opcode ${opCode.mnemonic} requires the '${opCode.feature}' feature. ` +\r\n `Enable it via the 'features' or 'target' option in ModuleBuilder.`\r\n );\r\n }\r\n\r\n if (opCode.immediate) {\r\n immediate = this._createImmediate(\r\n opCode.immediate as ImmediateType,\r\n args,\r\n depth\r\n );\r\n\r\n if (immediate.type === ImmediateType.RelativeDepth) {\r\n this._controlFlowVerifier.reference(args[0]);\r\n }\r\n }\r\n\r\n if (!this.disableVerification) {\r\n this._operandStackVerifier.verifyInstruction(\r\n this._controlFlowVerifier.peek()!.block!,\r\n opCode,\r\n immediate\r\n );\r\n\r\n if (opCode === (OpCodes as any).else) {\r\n this._operandStackVerifier.verifyElse(\r\n this._controlFlowVerifier.peek()!.block!\r\n );\r\n }\r\n }\r\n\r\n if (opCode.controlFlow) {\r\n result = this._updateControlFlow(opCode, immediate, pushLabel);\r\n }\r\n\r\n this._instructions.push(new Instruction(opCode, immediate));\r\n if (labelCallback) {\r\n labelCallback(result);\r\n this.end();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n _updateControlFlow(\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n label: LabelBuilder | null\r\n ): any {\r\n let result: any = null;\r\n if (opCode.controlFlow === ControlFlowType.Push) {\r\n const blockType = immediate!.values[0] as BlockTypeDescriptor;\r\n const isLoop = opCode === (OpCodes as any).loop;\r\n result = this._controlFlowVerifier.push(\r\n this._operandStackVerifier.stack,\r\n blockType,\r\n label,\r\n isLoop\r\n );\r\n } else if (opCode.controlFlow === ControlFlowType.Pop) {\r\n this._controlFlowVerifier.pop();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._controlFlowVerifier.verify();\r\n\r\n const bodyWriter = new BinaryWriter();\r\n this._writeLocals(bodyWriter);\r\n\r\n for (let index = 0; index < this._instructions.length; index++) {\r\n this._instructions[index].write(bodyWriter);\r\n }\r\n\r\n writer.writeVarUInt32(bodyWriter.length);\r\n writer.writeBytes(bodyWriter);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n\r\n _writeLocals(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this._locals.length);\r\n for (let index = 0; index < this._locals.length; index++) {\r\n this._locals[index].write(writer);\r\n }\r\n }\r\n\r\n _createImmediate(immediateType: ImmediateType, values: any[], depth: number): Immediate {\r\n switch (immediateType) {\r\n case ImmediateType.BlockSignature:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createBlockSignature(values[0]);\r\n\r\n case ImmediateType.BranchTable:\r\n validateParameters(immediateType, values, 2);\r\n return Immediate.createBranchTable(values[0], values[1], depth);\r\n\r\n case ImmediateType.Float32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createFloat32(values[0]);\r\n\r\n case ImmediateType.Float64:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createFloat64(values[0]);\r\n\r\n case ImmediateType.Function:\r\n validateParameters(immediateType, values, 1);\r\n if (!(values[0] instanceof ImportBuilder) && !(values[0] && '_index' in values[0] && 'funcTypeBuilder' in values[0])) {\r\n throw new Error('functionBuilder must be a FunctionBuilder or ImportBuilder.');\r\n }\r\n return Immediate.createFunction(values[0]);\r\n\r\n case ImmediateType.Global:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createGlobal(values[0]);\r\n\r\n case ImmediateType.IndirectFunction:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createIndirectFunction(values[0]);\r\n\r\n case ImmediateType.Local:\r\n validateParameters(immediateType, values, 1);\r\n let local = values[0];\r\n if (typeof local === 'number') {\r\n local = this.getParameter(local);\r\n }\r\n Arg.instanceOf('local', local, LocalBuilder, FunctionParameterBuilder);\r\n return Immediate.createLocal(local);\r\n\r\n case ImmediateType.MemoryImmediate:\r\n validateParameters(immediateType, values, 2);\r\n return Immediate.createMemoryImmediate(values[0], values[1]);\r\n\r\n case ImmediateType.RelativeDepth:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createRelativeDepth(values[0], depth);\r\n\r\n case ImmediateType.VarInt32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarInt32(values[0]);\r\n\r\n case ImmediateType.VarInt64:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarInt64(values[0]);\r\n\r\n case ImmediateType.VarUInt1:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarUInt1(values[0]);\r\n\r\n case ImmediateType.VarUInt32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarUInt32(values[0]);\r\n\r\n case ImmediateType.V128Const:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createV128Const(values[0]);\r\n\r\n case ImmediateType.LaneIndex:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createLaneIndex(values[0]);\r\n\r\n case ImmediateType.ShuffleMask:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createShuffleMask(values[0]);\r\n\r\n default:\r\n throw new Error('Unknown operand type.');\r\n }\r\n }\r\n}\r\n", "import AssemblyEmitter from './AssemblyEmitter';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { InitExpressionType, ValueTypeDescriptor, OpCodeDef } from './types';\r\nimport OpCodes from './OpCodes';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class InitExpressionEmitter extends AssemblyEmitter {\r\n _initExpressionType: InitExpressionType;\r\n\r\n constructor(initExpressionType: InitExpressionType, valueType: ValueTypeDescriptor) {\r\n super(new FuncTypeSignature([valueType], []));\r\n this._initExpressionType = initExpressionType;\r\n }\r\n\r\n getParameter(_index: number): never {\r\n throw new Error('An initialization expression does not have any parameters.');\r\n }\r\n\r\n declareLocal(): never {\r\n throw new Error('An initialization expression cannot have locals.');\r\n }\r\n\r\n emit(opCode: OpCodeDef, ...args: any[]): any {\r\n this._isValidateOp(opCode, args);\r\n return super.emit(opCode, ...args);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n for (let index = 0; index < this._instructions.length; index++) {\r\n this._instructions[index].write(writer);\r\n }\r\n }\r\n\r\n _isValidateOp(opCode: OpCodeDef, args?: any[]): void {\r\n if (this._instructions.length === 2) {\r\n return;\r\n }\r\n\r\n if (this._instructions.length === 1) {\r\n if (opCode !== OpCodes.end) {\r\n throw new Error(`Opcode ${opCode.mnemonic} is not valid after init expression value.`);\r\n }\r\n return;\r\n }\r\n\r\n switch (opCode) {\r\n case OpCodes.f32_const:\r\n case OpCodes.f64_const:\r\n case OpCodes.i32_const:\r\n case OpCodes.i64_const:\r\n break;\r\n\r\n case OpCodes.get_global: {\r\n const globalBuilder = args?.[0];\r\n if (this._initExpressionType === InitExpressionType.Element) {\r\n throw new Error(\r\n 'The only valid instruction for an element initializer expression is a constant i32, ' +\r\n 'global not supported.'\r\n );\r\n }\r\n\r\n if (!(globalBuilder instanceof GlobalBuilder)) {\r\n throw new Error('A global builder was expected.');\r\n }\r\n\r\n if (globalBuilder.globalType.mutable) {\r\n throw new Error(\r\n 'An initializer expression cannot reference a mutable global.'\r\n );\r\n }\r\n\r\n break;\r\n }\r\n\r\n default:\r\n throw new Error(\r\n `Opcode ${opCode.mnemonic} is not supported in an initializer expression.`\r\n );\r\n }\r\n }\r\n}\r\n", "import InitExpressionEmitter from './InitExpressionEmitter';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { InitExpressionType, ValueType } from './types';\r\n\r\nexport default class DataSegmentBuilder {\r\n _data: Uint8Array;\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n\r\n constructor(data: Uint8Array) {\r\n this._data = data;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Data,\r\n ValueType.Int32\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n offset(value: number | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number') {\r\n this.createInitEmitter((asm) => {\r\n asm.const_i32(value);\r\n });\r\n } else {\r\n throw new Error('Unsupported offset');\r\n }\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n writer.writeVarUInt32(0);\r\n this._initExpressionEmitter.write(writer);\r\n writer.writeVarUInt32(this._data.length);\r\n writer.writeBytes(this._data);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import AssemblyEmitter, { AssemblyEmitterOptions } from './AssemblyEmitter';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FunctionEmitter extends AssemblyEmitter {\r\n _functionBuilder: FunctionBuilder;\r\n\r\n constructor(functionBuilder: FunctionBuilder, options?: AssemblyEmitterOptions) {\r\n super(functionBuilder.funcTypeBuilder.toSignature(), options);\r\n this._functionBuilder = functionBuilder;\r\n this._locals = [];\r\n }\r\n\r\n get returnValues(): ValueTypeDescriptor[] {\r\n return this._functionBuilder.funcTypeBuilder.returnTypes;\r\n }\r\n\r\n get parameters(): FunctionParameterBuilder[] {\r\n return this._functionBuilder.parameters;\r\n }\r\n\r\n getParameter(index: number): FunctionParameterBuilder | LocalBuilder {\r\n if (index >= 0) {\r\n if (index < this.parameters.length) {\r\n return this._functionBuilder.getParameter(index);\r\n }\r\n\r\n const localIndex = index - this.parameters.length;\r\n if (localIndex < this._locals.length) {\r\n return this._locals[localIndex];\r\n }\r\n }\r\n\r\n throw new Error('Invalid parameter index.');\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport { ValueTypeDescriptor } from './types';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class FunctionBuilder {\r\n name: string;\r\n funcTypeBuilder: FuncTypeBuilder;\r\n parameters: FunctionParameterBuilder[];\r\n _index: number;\r\n functionEmitter: FunctionEmitter | null = null;\r\n _moduleBuilder: ModuleBuilder;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n name: string,\r\n funcTypeBuilder: FuncTypeBuilder,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this.name = name;\r\n this.funcTypeBuilder = funcTypeBuilder;\r\n this._index = index;\r\n this.parameters = funcTypeBuilder.parameterTypes.map(\r\n (x, i) => new FunctionParameterBuilder(x, i)\r\n );\r\n }\r\n\r\n get returnType(): ValueTypeDescriptor[] {\r\n return this.funcTypeBuilder.returnTypes;\r\n }\r\n\r\n get parameterTypes(): ValueTypeDescriptor[] {\r\n return this.funcTypeBuilder.parameterTypes;\r\n }\r\n\r\n getParameter(index: number): FunctionParameterBuilder {\r\n return this.parameters[index];\r\n }\r\n\r\n createEmitter(callback?: (asm: FunctionEmitter) => void): FunctionEmitter {\r\n if (this.functionEmitter) {\r\n throw new Error('Function emitter has already been created.');\r\n }\r\n\r\n this.functionEmitter = new FunctionEmitter(this, {\r\n disableVerification: this._moduleBuilder.disableVerification,\r\n features: this._moduleBuilder.features,\r\n });\r\n if (callback) {\r\n callback(this.functionEmitter);\r\n this.functionEmitter.end();\r\n }\r\n\r\n return this.functionEmitter;\r\n }\r\n\r\n withExport(name?: string): this {\r\n this._moduleBuilder.exportFunction(this, name || null);\r\n return this;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this.functionEmitter) {\r\n throw new Error('Function body has not been defined.');\r\n }\r\n\r\n this.functionEmitter.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport InitExpressionEmitter from './InitExpressionEmitter';\r\nimport TableBuilder from './TableBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport { InitExpressionType, ValueType } from './types';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class ElementSegmentBuilder {\r\n _table: TableBuilder;\r\n _functions: (FunctionBuilder | ImportBuilder)[] = [];\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n\r\n constructor(table: TableBuilder, functions: (FunctionBuilder | ImportBuilder)[]) {\r\n this._table = table;\r\n this._functions = functions;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Element,\r\n ValueType.Int32\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n offset(value: number | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number') {\r\n this.createInitEmitter((asm) => {\r\n asm.const_i32(value);\r\n });\r\n } else {\r\n throw new Error('Unsupported offset');\r\n }\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n writer.writeVarUInt32(this._table._index);\r\n this._initExpressionEmitter.write(writer);\r\n writer.writeVarUInt32(this._functions.length);\r\n this._functions.forEach((x) => {\r\n if (x instanceof FunctionBuilder) {\r\n writer.writeVarUInt32(x._index);\r\n } else if (x instanceof ImportBuilder) {\r\n writer.writeVarUInt32(x.index);\r\n }\r\n });\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ExternalKind, ExternalKindType } from './types';\r\n\r\nexport default class ExportBuilder {\r\n name: string;\r\n externalKind: ExternalKindType;\r\n data: { _index: number };\r\n\r\n constructor(name: string, externalKind: ExternalKindType, data: { _index: number }) {\r\n this.name = name;\r\n this.externalKind = externalKind;\r\n this.data = data;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.name.length);\r\n writer.writeString(this.name);\r\n writer.writeUInt8(this.externalKind.value);\r\n switch (this.externalKind) {\r\n case ExternalKind.Function:\r\n case ExternalKind.Global:\r\n case ExternalKind.Memory:\r\n case ExternalKind.Table:\r\n writer.writeVarUInt32(this.data._index);\r\n break;\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\n\r\nexport default class ResizableLimits {\r\n initial: number;\r\n maximum: number | null;\r\n\r\n constructor(initial: number, maximum: number | null = null) {\r\n this.initial = initial;\r\n this.maximum = maximum;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt1(this.maximum !== null ? 1 : 0);\r\n writer.writeVarUInt32(this.initial);\r\n if (this.maximum !== null) {\r\n writer.writeVarUInt32(this.maximum);\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\n\r\nexport default class MemoryType {\r\n resizableLimits: ResizableLimits;\r\n\r\n constructor(resizableLimits: ResizableLimits) {\r\n Arg.instanceOf('resizableLimits', resizableLimits, ResizableLimits);\r\n this.resizableLimits = resizableLimits;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this.resizableLimits.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport MemoryType from './MemoryType';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class MemoryBuilder {\r\n _moduleBuilder: ModuleBuilder;\r\n _memoryType: MemoryType;\r\n _index: number;\r\n\r\n constructor(moduleBuilder: ModuleBuilder, resizableLimits: ResizableLimits, index: number) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._memoryType = new MemoryType(resizableLimits);\r\n this._index = index;\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportMemory(this, name);\r\n return this;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._memoryType.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport { ElementTypeDescriptor } from './types';\r\n\r\nexport default class TableType {\r\n private _elementType: ElementTypeDescriptor;\r\n private _resizableLimits: ResizableLimits;\r\n\r\n constructor(elementType: ElementTypeDescriptor, resizableLimits: ResizableLimits) {\r\n this._elementType = elementType;\r\n this._resizableLimits = resizableLimits;\r\n }\r\n\r\n get elementType(): ElementTypeDescriptor {\r\n return this._elementType;\r\n }\r\n\r\n get resizableLimits(): ResizableLimits {\r\n return this._resizableLimits;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this._elementType.value);\r\n this._resizableLimits.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport TableType from './TableType';\r\nimport { ElementTypeDescriptor } from './types';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport type ImportBuilder from './ImportBuilder';\r\n\r\nexport default class TableBuilder {\r\n _moduleBuilder: ModuleBuilder;\r\n _tableType: TableType;\r\n _index: number;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n elementType: ElementTypeDescriptor,\r\n resizableLimits: ResizableLimits,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._tableType = new TableType(elementType, resizableLimits);\r\n this._index = index;\r\n }\r\n\r\n get elementType(): ElementTypeDescriptor {\r\n return this._tableType.elementType;\r\n }\r\n\r\n get resizableLimits(): ResizableLimits {\r\n return this._tableType.resizableLimits;\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportTable(this, name);\r\n return this;\r\n }\r\n\r\n defineTableSegment(\r\n elements: (FunctionBuilder | ImportBuilder)[],\r\n offset?: number | ((asm: any) => void)\r\n ): void {\r\n this._moduleBuilder.defineTableSegment(this, elements, offset);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._tableType.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import ModuleBuilder from './ModuleBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { ExternalKind, ImmediateType, ValueTypeDescriptor } from './types';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalType from './GlobalType';\r\nimport MemoryType from './MemoryType';\r\nimport TableType from './TableType';\r\nimport Instruction from './Instruction';\r\nimport LabelBuilder from './LabelBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\n\r\nexport default class TextModuleWriter {\r\n moduleBuilder: ModuleBuilder;\r\n\r\n constructor(moduleBuilder: ModuleBuilder) {\r\n this.moduleBuilder = moduleBuilder;\r\n }\r\n\r\n toString(): string {\r\n const lines: string[] = [];\r\n const mod = this.moduleBuilder;\r\n\r\n lines.push(`(module $${mod._name}`);\r\n\r\n this.writeTypes(lines, mod);\r\n this.writeImports(lines, mod);\r\n this.writeFunctions(lines, mod);\r\n this.writeTables(lines, mod);\r\n this.writeMemories(lines, mod);\r\n this.writeGlobals(lines, mod);\r\n this.writeExports(lines, mod);\r\n this.writeStart(lines, mod);\r\n this.writeElements(lines, mod);\r\n this.writeData(lines, mod);\r\n\r\n lines.push(')');\r\n return lines.join('\\n');\r\n }\r\n\r\n private writeTypes(lines: string[], mod: ModuleBuilder): void {\r\n mod._types.forEach((type, i) => {\r\n const params = type.parameterTypes.map((p) => p.name).join(' ');\r\n const results = type.returnTypes.map((r) => r.name).join(' ');\r\n let sig = `(func`;\r\n if (params.length > 0) sig += ` (param ${params})`;\r\n if (results.length > 0) sig += ` (result ${results})`;\r\n sig += ')';\r\n lines.push(` (type (;${i};) ${sig})`);\r\n });\r\n }\r\n\r\n private writeImports(lines: string[], mod: ModuleBuilder): void {\r\n mod._imports.forEach((imp, i) => {\r\n let desc = '';\r\n switch (imp.externalKind) {\r\n case ExternalKind.Function: {\r\n const funcType = imp.data as FuncTypeBuilder;\r\n desc = `(func (;${imp.index};) (type ${funcType.index}))`;\r\n break;\r\n }\r\n case ExternalKind.Table: {\r\n const tableType = imp.data as TableType;\r\n const limits = tableType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n desc = `(table (;${imp.index};) ${limits.initial}${max} ${tableType.elementType.name})`;\r\n break;\r\n }\r\n case ExternalKind.Memory: {\r\n const memType = imp.data as MemoryType;\r\n const limits = memType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n desc = `(memory (;${imp.index};) ${limits.initial}${max})`;\r\n break;\r\n }\r\n case ExternalKind.Global: {\r\n const globalType = imp.data as GlobalType;\r\n const valType = globalType.valueType.name;\r\n desc = globalType.mutable\r\n ? `(global (;${imp.index};) (mut ${valType}))`\r\n : `(global (;${imp.index};) ${valType})`;\r\n break;\r\n }\r\n }\r\n lines.push(` (import \"${imp.moduleName}\" \"${imp.fieldName}\" ${desc})`);\r\n });\r\n }\r\n\r\n private writeFunctions(lines: string[], mod: ModuleBuilder): void {\r\n mod._functions.forEach((func) => {\r\n const typeIdx = func.funcTypeBuilder.index;\r\n let header = ` (func $${func.name} (;${func._index};) (type ${typeIdx})`;\r\n\r\n if (func.funcTypeBuilder.parameterTypes.length > 0) {\r\n const params = func.funcTypeBuilder.parameterTypes\r\n .map((p, i) => {\r\n const param = func.parameters[i];\r\n return p.name;\r\n })\r\n .join(' ');\r\n header += ` (param ${params})`;\r\n }\r\n\r\n if (func.funcTypeBuilder.returnTypes.length > 0) {\r\n const results = func.funcTypeBuilder.returnTypes.map((r) => r.name).join(' ');\r\n header += ` (result ${results})`;\r\n }\r\n\r\n if (!func.functionEmitter) {\r\n lines.push(header + ')');\r\n return;\r\n }\r\n\r\n const emitter = func.functionEmitter;\r\n\r\n // Locals\r\n if (emitter._locals.length > 0) {\r\n const locals = emitter._locals.map((l) => {\r\n if (l.count === 1) return `(local ${l.valueType.name})`;\r\n return `(local ${l.valueType.name})`.repeat(l.count);\r\n });\r\n header += ' ' + locals.join(' ');\r\n }\r\n\r\n lines.push(header);\r\n\r\n // Instructions\r\n this.writeInstructions(lines, emitter._instructions, 2);\r\n lines.push(' )');\r\n });\r\n }\r\n\r\n private writeInstructions(lines: string[], instructions: Instruction[], baseIndent: number): void {\r\n let indent = baseIndent;\r\n\r\n for (const instr of instructions) {\r\n const mnemonic = instr.opCode.mnemonic;\r\n\r\n // Decrease indent before end/else\r\n if (mnemonic === 'end' || mnemonic === 'else') {\r\n indent = Math.max(baseIndent, indent - 1);\r\n }\r\n\r\n const prefix = ' '.repeat(indent);\r\n let line = `${prefix}${mnemonic}`;\r\n\r\n // Add immediate operand text\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) {\r\n line += ` ${immText}`;\r\n }\r\n }\r\n\r\n lines.push(line);\r\n\r\n // Increase indent after block/loop/if/else\r\n if (mnemonic === 'block' || mnemonic === 'loop' || mnemonic === 'if' || mnemonic === 'else') {\r\n indent++;\r\n }\r\n }\r\n }\r\n\r\n private immediateToText(type: ImmediateType, values: any[]): string {\r\n switch (type) {\r\n case ImmediateType.BlockSignature: {\r\n const blockType = values[0];\r\n if (blockType && blockType.name !== 'void') {\r\n return `(result ${blockType.name})`;\r\n }\r\n return '';\r\n }\r\n case ImmediateType.VarInt32:\r\n case ImmediateType.VarInt64:\r\n case ImmediateType.Float32:\r\n case ImmediateType.Float64:\r\n case ImmediateType.VarUInt1:\r\n return String(values[0]);\r\n\r\n case ImmediateType.Local: {\r\n const local = values[0];\r\n return String(local.index);\r\n }\r\n case ImmediateType.Global: {\r\n const global = values[0];\r\n if (global instanceof GlobalBuilder) {\r\n return String(global._index);\r\n }\r\n if (global && typeof global.index === 'number') {\r\n return String(global.index);\r\n }\r\n return '';\r\n }\r\n case ImmediateType.Function: {\r\n const func = values[0];\r\n if (func instanceof FunctionBuilder) {\r\n return String(func._index);\r\n }\r\n if (func instanceof ImportBuilder) {\r\n return String(func.index);\r\n }\r\n return '';\r\n }\r\n case ImmediateType.IndirectFunction: {\r\n const funcType = values[0];\r\n return `(type ${funcType.index})`;\r\n }\r\n case ImmediateType.RelativeDepth: {\r\n const label = values[0];\r\n const depth = values[1];\r\n if (label instanceof LabelBuilder && label.block) {\r\n return String(depth - label.block.depth);\r\n }\r\n return String(label);\r\n }\r\n case ImmediateType.BranchTable: {\r\n const defaultDepth = values[0];\r\n const depths = values[1] as number[];\r\n return depths.join(' ') + ' ' + defaultDepth;\r\n }\r\n case ImmediateType.MemoryImmediate: {\r\n const alignment = values[0];\r\n const offset = values[1];\r\n let text = '';\r\n if (offset !== 0) text += `offset=${offset}`;\r\n if (alignment !== 0) {\r\n if (text) text += ' ';\r\n text += `align=${1 << alignment}`;\r\n }\r\n return text;\r\n }\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n private writeTables(lines: string[], mod: ModuleBuilder): void {\r\n mod._tables.forEach((table, i) => {\r\n const limits = table.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n lines.push(` (table (;${table._index};) ${limits.initial}${max} ${table.elementType.name})`);\r\n });\r\n }\r\n\r\n private writeMemories(lines: string[], mod: ModuleBuilder): void {\r\n mod._memories.forEach((mem) => {\r\n const limits = mem._memoryType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n lines.push(` (memory (;${mem._index};) ${limits.initial}${max})`);\r\n });\r\n }\r\n\r\n private writeGlobals(lines: string[], mod: ModuleBuilder): void {\r\n mod._globals.forEach((g) => {\r\n const valType = g.globalType.valueType.name;\r\n const typeStr = g.globalType.mutable ? `(mut ${valType})` : valType;\r\n\r\n let initExpr = '';\r\n if (g._initExpressionEmitter) {\r\n const instrs = g._initExpressionEmitter._instructions;\r\n // Init expression is typically one const instruction + end\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n initExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) initExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n lines.push(` (global (;${g._index};) ${typeStr} (${initExpr}))`);\r\n });\r\n }\r\n\r\n private writeExports(lines: string[], mod: ModuleBuilder): void {\r\n mod._exports.forEach((exp) => {\r\n let kindName = '';\r\n let index = exp.data._index;\r\n switch (exp.externalKind) {\r\n case ExternalKind.Function:\r\n kindName = 'func';\r\n break;\r\n case ExternalKind.Table:\r\n kindName = 'table';\r\n break;\r\n case ExternalKind.Memory:\r\n kindName = 'memory';\r\n break;\r\n case ExternalKind.Global:\r\n kindName = 'global';\r\n break;\r\n }\r\n lines.push(` (export \"${exp.name}\" (${kindName} ${index}))`);\r\n });\r\n }\r\n\r\n private writeStart(lines: string[], mod: ModuleBuilder): void {\r\n if (mod._startFunction) {\r\n lines.push(` (start ${mod._startFunction._index})`);\r\n }\r\n }\r\n\r\n private writeElements(lines: string[], mod: ModuleBuilder): void {\r\n mod._elements.forEach((elem, i) => {\r\n let offsetExpr = '';\r\n if (elem._initExpressionEmitter) {\r\n const instrs = elem._initExpressionEmitter._instructions;\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n offsetExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) offsetExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n const funcIndices = elem._functions\r\n .map((f) => {\r\n if (f instanceof FunctionBuilder) return f._index;\r\n if (f instanceof ImportBuilder) return f.index;\r\n return 0;\r\n })\r\n .join(' ');\r\n\r\n lines.push(` (elem (;${i};) (${offsetExpr}) func ${funcIndices})`);\r\n });\r\n }\r\n\r\n private writeData(lines: string[], mod: ModuleBuilder): void {\r\n mod._data.forEach((seg, i) => {\r\n let offsetExpr = '';\r\n if (seg._initExpressionEmitter) {\r\n const instrs = seg._initExpressionEmitter._instructions;\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n offsetExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) offsetExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n const dataStr = this.bytesToWatString(seg._data);\r\n lines.push(` (data (;${i};) (${offsetExpr}) \"${dataStr}\")`);\r\n });\r\n }\r\n\r\n private bytesToWatString(data: Uint8Array): string {\r\n let result = '';\r\n for (let i = 0; i < data.length; i++) {\r\n const byte = data[i];\r\n if (byte >= 0x20 && byte < 0x7f && byte !== 0x22 && byte !== 0x5c) {\r\n result += String.fromCharCode(byte);\r\n } else {\r\n result += '\\\\' + byte.toString(16).padStart(2, '0');\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryModuleWriter from './BinaryModuleWriter';\r\nimport DataSegmentBuilder from './DataSegmentBuilder';\r\nimport ElementSegmentBuilder from './ElementSegmentBuilder';\r\nimport ExportBuilder from './ExportBuilder';\r\nimport {\r\n ExternalKind,\r\n ElementTypeDescriptor,\r\n ValueTypeDescriptor,\r\n ModuleBuilderOptions,\r\n WasmFeature,\r\n WasmTarget,\r\n} from './types';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport GlobalType from './GlobalType';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport MemoryBuilder from './MemoryBuilder';\r\nimport MemoryType from './MemoryType';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport TableBuilder from './TableBuilder';\r\nimport TableType from './TableType';\r\nimport TextModuleWriter from './TextModuleWriter';\r\nimport CustomSectionBuilder from './CustomSectionBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport VerificationError from './verification/VerificationError';\r\n\r\nexport default class ModuleBuilder {\r\n static defaultOptions: ModuleBuilderOptions = {\r\n generateNameSection: true,\r\n disableVerification: false,\r\n };\r\n\r\n static readonly targetFeatures: Record = {\r\n 'mvp': [],\r\n '2.0': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'multi-value'],\r\n 'latest': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'simd', 'multi-value'],\r\n };\r\n\r\n _name: string;\r\n _types: FuncTypeBuilder[] = [];\r\n _imports: ImportBuilder[] = [];\r\n _functions: FunctionBuilder[] = [];\r\n _tables: TableBuilder[] = [];\r\n _memories: MemoryBuilder[] = [];\r\n _globals: GlobalBuilder[] = [];\r\n _exports: ExportBuilder[] = [];\r\n _elements: ElementSegmentBuilder[] = [];\r\n _data: DataSegmentBuilder[] = [];\r\n _customSections: CustomSectionBuilder[] = [];\r\n _startFunction: FunctionBuilder | null = null;\r\n _importsIndexSpace = {\r\n function: 0,\r\n table: 0,\r\n memory: 0,\r\n global: 0,\r\n };\r\n _options: ModuleBuilderOptions;\r\n _resolvedFeatures: Set;\r\n\r\n constructor(\r\n name: string,\r\n options: ModuleBuilderOptions = { generateNameSection: true, disableVerification: false }\r\n ) {\r\n Arg.notNull('name', name);\r\n this._name = name;\r\n this._options = options || ModuleBuilder.defaultOptions;\r\n this._resolvedFeatures = ModuleBuilder._resolveFeatures(this._options);\r\n }\r\n\r\n static _resolveFeatures(options: ModuleBuilderOptions): Set {\r\n const target = options.target || 'latest';\r\n const baseFeatures = ModuleBuilder.targetFeatures[target];\r\n const extra = options.features || [];\r\n return new Set([...baseFeatures, ...extra]);\r\n }\r\n\r\n get features(): Set {\r\n return this._resolvedFeatures;\r\n }\r\n\r\n hasFeature(feature: WasmFeature): boolean {\r\n return this._resolvedFeatures.has(feature);\r\n }\r\n\r\n get disableVerification(): boolean {\r\n return this._options && this._options.disableVerification === true;\r\n }\r\n\r\n defineFuncType(\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[]\r\n ): FuncTypeBuilder {\r\n let normalizedReturnTypes: ValueTypeDescriptor[];\r\n if (!returnTypes) {\r\n normalizedReturnTypes = [];\r\n } else if (!Array.isArray(returnTypes)) {\r\n normalizedReturnTypes = [returnTypes];\r\n } else {\r\n normalizedReturnTypes = returnTypes;\r\n }\r\n\r\n if (normalizedReturnTypes.length > 1) {\r\n throw new Error('A method can only return zero to one values.');\r\n }\r\n\r\n const funcTypeKey = FuncTypeBuilder.createKey(normalizedReturnTypes, parameters);\r\n let funcType = this._types.find((x) => x.key === funcTypeKey);\r\n if (!funcType) {\r\n funcType = new FuncTypeBuilder(\r\n funcTypeKey,\r\n normalizedReturnTypes,\r\n parameters,\r\n this._types.length\r\n );\r\n this._types.push(funcType);\r\n }\r\n\r\n return funcType;\r\n }\r\n\r\n importFunction(\r\n moduleName: string,\r\n name: string,\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[]\r\n ): ImportBuilder {\r\n const funcType = this.defineFuncType(returnTypes, parameters);\r\n if (\r\n this._imports.some(\r\n (x) =>\r\n x.externalKind === ExternalKind.Function &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Function,\r\n funcType,\r\n this._importsIndexSpace.function++\r\n );\r\n this._imports.push(importBuilder);\r\n this._functions.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n importTable(\r\n moduleName: string,\r\n name: string,\r\n elementType: ElementTypeDescriptor,\r\n initialSize: number,\r\n maximumSize: number | null = null\r\n ): ImportBuilder {\r\n if (\r\n this._imports.find(\r\n (x) =>\r\n x.externalKind === ExternalKind.Table &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const tableType = new TableType(\r\n elementType,\r\n new ResizableLimits(initialSize, maximumSize)\r\n );\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Table,\r\n tableType,\r\n this._importsIndexSpace.table++\r\n );\r\n this._imports.push(importBuilder);\r\n this._tables.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n importMemory(\r\n moduleName: string,\r\n name: string,\r\n initialSize: number,\r\n maximumSize: number | null = null\r\n ): ImportBuilder {\r\n Arg.string('moduleName', moduleName);\r\n Arg.string('name', name);\r\n Arg.number('initialSize', initialSize);\r\n\r\n if (\r\n this._imports.find(\r\n (x) =>\r\n x.externalKind === ExternalKind.Memory &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n if (this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) {\r\n throw new VerificationError('Only one memory is allowed per module.');\r\n }\r\n\r\n const memoryType = new MemoryType(new ResizableLimits(initialSize, maximumSize));\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Memory,\r\n memoryType,\r\n this._importsIndexSpace.memory++\r\n );\r\n this._imports.push(importBuilder);\r\n\r\n return importBuilder;\r\n }\r\n\r\n importGlobal(\r\n moduleName: string,\r\n name: string,\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean\r\n ): ImportBuilder {\r\n if (\r\n this._imports.some(\r\n (x) =>\r\n x.externalKind === ExternalKind.Global &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const globalType = new GlobalType(valueType, mutable);\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Global,\r\n globalType,\r\n this._importsIndexSpace.global++\r\n );\r\n this._imports.push(importBuilder);\r\n this._globals.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n defineFunction(\r\n name: string,\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[],\r\n createCallback?: (func: FunctionBuilder, asm: FunctionEmitter) => void\r\n ): FunctionBuilder {\r\n const existing = this._functions.find((x) => x.name === name);\r\n if (existing) {\r\n throw new Error(`Function has already been defined with the name ${name}`);\r\n }\r\n\r\n const funcType = this.defineFuncType(returnTypes, parameters);\r\n const functionBuilder = new FunctionBuilder(\r\n this,\r\n name,\r\n funcType,\r\n this._functions.length + this._importsIndexSpace.function\r\n );\r\n this._functions.push(functionBuilder);\r\n\r\n if (createCallback) {\r\n functionBuilder.createEmitter((x) => {\r\n createCallback(functionBuilder, x);\r\n });\r\n }\r\n\r\n return functionBuilder;\r\n }\r\n\r\n defineTable(\r\n elementType: ElementTypeDescriptor,\r\n initialSize: number,\r\n maximumSize: number | null = null\r\n ): TableBuilder {\r\n if (this._tables.length === 1) {\r\n throw new Error('Only one table can be created per module.');\r\n }\r\n\r\n const table = new TableBuilder(\r\n this,\r\n elementType,\r\n new ResizableLimits(initialSize, maximumSize),\r\n this._tables.length + this._importsIndexSpace.table\r\n );\r\n this._tables.push(table);\r\n return table;\r\n }\r\n\r\n defineMemory(initialSize: number, maximumSize: number | null = null): MemoryBuilder {\r\n if (this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) {\r\n throw new VerificationError('Only one memory is allowed per module.');\r\n }\r\n\r\n const memory = new MemoryBuilder(\r\n this,\r\n new ResizableLimits(initialSize, maximumSize),\r\n this._memories.length + this._importsIndexSpace.memory\r\n );\r\n this._memories.push(memory);\r\n return memory;\r\n }\r\n\r\n defineGlobal(\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean,\r\n value?: number | GlobalBuilder | ((asm: any) => void)\r\n ): GlobalBuilder {\r\n const globalBuilder = new GlobalBuilder(\r\n this,\r\n valueType,\r\n mutable,\r\n this._globals.length + this._importsIndexSpace.global\r\n );\r\n if (value !== undefined) {\r\n globalBuilder.value(value);\r\n }\r\n\r\n this._globals.push(globalBuilder);\r\n return globalBuilder;\r\n }\r\n\r\n setStartFunction(functionBuilder: FunctionBuilder): void {\r\n Arg.instanceOf('functionBuilder', functionBuilder, FunctionBuilder);\r\n this._startFunction = functionBuilder;\r\n }\r\n\r\n exportFunction(functionBuilder: FunctionBuilder, name: string | null = null): ExportBuilder {\r\n Arg.instanceOf('functionBuilder', functionBuilder, FunctionBuilder);\r\n\r\n const functionName = name || functionBuilder.name;\r\n Arg.notEmptyString('name', functionName);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Function && x.name === functionName\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a function named ${functionName}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(\r\n functionName,\r\n ExternalKind.Function,\r\n functionBuilder\r\n );\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportMemory(memoryBuilder: MemoryBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('memoryBuilder', memoryBuilder, MemoryBuilder);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Memory && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for memory named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Memory, memoryBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportTable(tableBuilder: TableBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('tableBuilder', tableBuilder, TableBuilder);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Table && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a table named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Table, tableBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportGlobal(globalBuilder: GlobalBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('globalBuilder', globalBuilder, GlobalBuilder);\r\n if (globalBuilder.globalType.mutable && !this.disableVerification) {\r\n throw new VerificationError('Cannot export a mutable global.');\r\n }\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Global && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a global named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Global, globalBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n defineTableSegment(\r\n table: TableBuilder,\r\n elements: (FunctionBuilder | ImportBuilder)[],\r\n offset?: number | GlobalBuilder | ((asm: any) => void)\r\n ): void {\r\n const segment = new ElementSegmentBuilder(table, elements);\r\n if (offset !== undefined) {\r\n segment.offset(offset as any);\r\n }\r\n\r\n this._elements.push(segment);\r\n }\r\n\r\n defineData(\r\n data: Uint8Array,\r\n offset?: number | GlobalBuilder | ((asm: any) => void)\r\n ): DataSegmentBuilder {\r\n Arg.instanceOf('data', data, Uint8Array);\r\n\r\n const dataSegmentBuilder = new DataSegmentBuilder(data);\r\n if (offset !== undefined) {\r\n dataSegmentBuilder.offset(offset as any);\r\n }\r\n\r\n this._data.push(dataSegmentBuilder);\r\n return dataSegmentBuilder;\r\n }\r\n\r\n defineCustomSection(name: string, data?: Uint8Array): CustomSectionBuilder {\r\n Arg.notEmptyString('name', name);\r\n\r\n if (this._customSections.find((x) => x.name === name)) {\r\n throw new Error(`A custom section already exists with the name ${name}.`);\r\n }\r\n\r\n if (name === 'name') {\r\n throw new Error(\"The 'name' custom section is reserved.\");\r\n }\r\n\r\n const customSectionBuilder = new CustomSectionBuilder(name, data);\r\n this._customSections.push(customSectionBuilder);\r\n return customSectionBuilder;\r\n }\r\n\r\n async instantiate(imports?: WebAssembly.Imports): Promise {\r\n const moduleBytes = this.toBytes();\r\n return WebAssembly.instantiate(moduleBytes.buffer as ArrayBuffer, imports);\r\n }\r\n\r\n async compile(): Promise {\r\n const moduleBytes = this.toBytes();\r\n return WebAssembly.compile(moduleBytes.buffer as ArrayBuffer);\r\n }\r\n\r\n toString(): string {\r\n const writer = new TextModuleWriter(this);\r\n return writer.toString();\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const writer = new BinaryModuleWriter(this);\r\n return writer.write();\r\n }\r\n}\r\n", "import ModuleBuilder from './ModuleBuilder';\r\nimport OpCodes from './OpCodes';\r\nimport {\r\n ValueType,\r\n ValueTypeDescriptor,\r\n BlockType,\r\n BlockTypeDescriptor,\r\n ElementType,\r\n ExternalKind,\r\n OpCodeDef,\r\n ModuleBuilderOptions,\r\n} from './types';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport ImportBuilder from './ImportBuilder';\r\n\r\n// --- Tokenizer ---\r\n\r\nenum TokenType {\r\n LeftParen = 'LeftParen',\r\n RightParen = 'RightParen',\r\n String = 'String',\r\n Number = 'Number',\r\n Keyword = 'Keyword',\r\n Id = 'Id',\r\n EOF = 'EOF',\r\n}\r\n\r\ninterface Token {\r\n type: TokenType;\r\n value: string;\r\n line: number;\r\n col: number;\r\n}\r\n\r\nfunction tokenize(source: string): Token[] {\r\n const tokens: Token[] = [];\r\n let pos = 0;\r\n let line = 1;\r\n let col = 1;\r\n\r\n function advance(n: number = 1): void {\r\n for (let i = 0; i < n; i++) {\r\n if (source[pos] === '\\n') {\r\n line++;\r\n col = 1;\r\n } else {\r\n col++;\r\n }\r\n pos++;\r\n }\r\n }\r\n\r\n while (pos < source.length) {\r\n const ch = source[pos];\r\n\r\n // Whitespace\r\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\r\n advance();\r\n continue;\r\n }\r\n\r\n // Line comment\r\n if (ch === ';' && source[pos + 1] === ';') {\r\n while (pos < source.length && source[pos] !== '\\n') advance();\r\n continue;\r\n }\r\n\r\n // Block comment (;...;) - skip entirely\r\n if (ch === '(' && source[pos + 1] === ';') {\r\n advance(2);\r\n let depth = 1;\r\n while (pos < source.length && depth > 0) {\r\n if (source[pos] === '(' && source[pos + 1] === ';') {\r\n depth++;\r\n advance(2);\r\n } else if (source[pos] === ';' && source[pos + 1] === ')') {\r\n depth--;\r\n advance(2);\r\n } else {\r\n advance();\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n const startLine = line;\r\n const startCol = col;\r\n\r\n if (ch === '(') {\r\n tokens.push({ type: TokenType.LeftParen, value: '(', line: startLine, col: startCol });\r\n advance();\r\n continue;\r\n }\r\n\r\n if (ch === ')') {\r\n tokens.push({ type: TokenType.RightParen, value: ')', line: startLine, col: startCol });\r\n advance();\r\n continue;\r\n }\r\n\r\n // String literal\r\n if (ch === '\"') {\r\n advance();\r\n let str = '';\r\n while (pos < source.length && source[pos] !== '\"') {\r\n if (source[pos] === '\\\\') {\r\n advance();\r\n const esc = source[pos];\r\n if (esc === 'n') str += '\\n';\r\n else if (esc === 't') str += '\\t';\r\n else if (esc === '\\\\') str += '\\\\';\r\n else if (esc === '\"') str += '\"';\r\n else if (esc === '\\'') str += '\\'';\r\n else {\r\n // Hex escape \\XX\r\n const hex = source.substring(pos, pos + 2);\r\n str += String.fromCharCode(parseInt(hex, 16));\r\n advance();\r\n }\r\n advance();\r\n } else {\r\n str += source[pos];\r\n advance();\r\n }\r\n }\r\n advance(); // closing \"\r\n tokens.push({ type: TokenType.String, value: str, line: startLine, col: startCol });\r\n continue;\r\n }\r\n\r\n // Id ($name)\r\n if (ch === '$') {\r\n let id = '';\r\n advance();\r\n while (pos < source.length && !isDelimiter(source[pos])) {\r\n id += source[pos];\r\n advance();\r\n }\r\n tokens.push({ type: TokenType.Id, value: '$' + id, line: startLine, col: startCol });\r\n continue;\r\n }\r\n\r\n // Number or keyword\r\n let word = '';\r\n while (pos < source.length && !isDelimiter(source[pos])) {\r\n word += source[pos];\r\n advance();\r\n }\r\n\r\n if (isNumericToken(word)) {\r\n tokens.push({ type: TokenType.Number, value: word, line: startLine, col: startCol });\r\n } else {\r\n tokens.push({ type: TokenType.Keyword, value: word, line: startLine, col: startCol });\r\n }\r\n }\r\n\r\n tokens.push({ type: TokenType.EOF, value: '', line, col });\r\n return tokens;\r\n}\r\n\r\nfunction isDelimiter(ch: string): boolean {\r\n return ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r' ||\r\n ch === '(' || ch === ')' || ch === ';' || ch === '\"';\r\n}\r\n\r\nfunction isNumericToken(word: string): boolean {\r\n if (/^[+-]?\\d/.test(word)) return true;\r\n if (/^[+-]?0x[0-9a-fA-F]/.test(word)) return true;\r\n if (/^[+-]?inf$/.test(word)) return true;\r\n if (/^[+-]?nan/.test(word)) return true;\r\n return false;\r\n}\r\n\r\n// --- Parser ---\r\n\r\nconst valueTypeMap: Record = {\r\n 'i32': ValueType.Int32,\r\n 'i64': ValueType.Int64,\r\n 'f32': ValueType.Float32,\r\n 'f64': ValueType.Float64,\r\n 'v128': ValueType.V128,\r\n};\r\n\r\nconst blockTypeMap: Record = {\r\n 'i32': BlockType.Int32,\r\n 'i64': BlockType.Int64,\r\n 'f32': BlockType.Float32,\r\n 'f64': BlockType.Float64,\r\n 'v128': BlockType.V128,\r\n};\r\n\r\n// Build mnemonic \u2192 opcode lookup\r\nconst mnemonicToOpCode: Map = new Map();\r\nfor (const [, opCode] of Object.entries(OpCodes)) {\r\n const op = opCode as OpCodeDef;\r\n mnemonicToOpCode.set(op.mnemonic, op);\r\n}\r\n\r\nclass WatParserImpl {\r\n tokens: Token[];\r\n pos: number;\r\n moduleBuilder!: ModuleBuilder;\r\n funcNames: Map = new Map();\r\n globalNames: Map = new Map();\r\n typeNames: Map = new Map();\r\n funcList: (FunctionBuilder | ImportBuilder)[] = [];\r\n labelStack: { name: string; label: any }[] = [];\r\n\r\n constructor(tokens: Token[]) {\r\n this.tokens = tokens;\r\n this.pos = 0;\r\n }\r\n\r\n // --- Token navigation ---\r\n\r\n peek(): Token {\r\n return this.tokens[this.pos];\r\n }\r\n\r\n advance(): Token {\r\n return this.tokens[this.pos++];\r\n }\r\n\r\n expect(type: TokenType, value?: string): Token {\r\n const tok = this.advance();\r\n if (tok.type !== type) {\r\n throw this.error(`Expected ${type}${value ? ` '${value}'` : ''} but got ${tok.type} '${tok.value}'`, tok);\r\n }\r\n if (value !== undefined && tok.value !== value) {\r\n throw this.error(`Expected '${value}' but got '${tok.value}'`, tok);\r\n }\r\n return tok;\r\n }\r\n\r\n expectKeyword(value: string): Token {\r\n return this.expect(TokenType.Keyword, value);\r\n }\r\n\r\n isKeyword(value: string): boolean {\r\n const tok = this.peek();\r\n return tok.type === TokenType.Keyword && tok.value === value;\r\n }\r\n\r\n isLeftParen(): boolean {\r\n return this.peek().type === TokenType.LeftParen;\r\n }\r\n\r\n isRightParen(): boolean {\r\n return this.peek().type === TokenType.RightParen;\r\n }\r\n\r\n // Skip optional inline comment like (;0;)\r\n skipInlineComment(): void {\r\n while (this.isLeftParen() && this.tokens[this.pos + 1]?.type === TokenType.Keyword &&\r\n this.tokens[this.pos + 1]?.value.startsWith(';')) {\r\n // This is a (;N;) comment \u2014 tokenizer should have removed it, but skip manually\r\n this.advance(); // (\r\n while (!this.isRightParen()) this.advance();\r\n this.advance(); // )\r\n }\r\n }\r\n\r\n error(message: string, tok?: Token): Error {\r\n const t = tok || this.peek();\r\n return new Error(`WAT parse error at ${t.line}:${t.col}: ${message}`);\r\n }\r\n\r\n // --- Parsing ---\r\n\r\n parse(options?: ModuleBuilderOptions): ModuleBuilder {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('module');\r\n\r\n let name = 'module';\r\n if (this.peek().type === TokenType.Id) {\r\n name = this.advance().value.substring(1); // strip $\r\n }\r\n\r\n this.moduleBuilder = new ModuleBuilder(name, options);\r\n\r\n // First pass: parse all sections\r\n while (!this.isRightParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const section = this.advance();\r\n\r\n switch (section.value) {\r\n case 'type':\r\n this.parseType();\r\n break;\r\n case 'import':\r\n this.parseImport();\r\n break;\r\n case 'func':\r\n this.parseFunc();\r\n break;\r\n case 'table':\r\n this.parseTable();\r\n break;\r\n case 'memory':\r\n this.parseMemory();\r\n break;\r\n case 'global':\r\n this.parseGlobal();\r\n break;\r\n case 'export':\r\n this.parseExport();\r\n break;\r\n case 'start':\r\n this.parseStart();\r\n break;\r\n case 'elem':\r\n this.parseElem();\r\n break;\r\n case 'data':\r\n this.parseData();\r\n break;\r\n default:\r\n // Skip unknown section\r\n this.skipSExpr();\r\n break;\r\n }\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing module paren\r\n return this.moduleBuilder;\r\n }\r\n\r\n // Skip remainder of current S-expression (we've already consumed opening keyword)\r\n skipSExpr(): void {\r\n let depth = 0;\r\n while (true) {\r\n const tok = this.peek();\r\n if (tok.type === TokenType.EOF) break;\r\n if (tok.type === TokenType.LeftParen) {\r\n depth++;\r\n this.advance();\r\n } else if (tok.type === TokenType.RightParen) {\r\n if (depth === 0) {\r\n this.advance();\r\n return;\r\n }\r\n depth--;\r\n this.advance();\r\n } else {\r\n this.advance();\r\n }\r\n }\r\n }\r\n\r\n // --- Type section ---\r\n\r\n parseType(): void {\r\n // (type $name (func (param i32 i32) (result i32)))\r\n // (type (;0;) (func (param i32 i32) (result i32)))\r\n // We already consumed: ( type\r\n let typeName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n typeName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('func');\r\n\r\n const params: ValueTypeDescriptor[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n\r\n while (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.advance().value;\r\n if (kw === 'param') {\r\n while (!this.isRightParen()) {\r\n // skip $name in param\r\n if (this.peek().type === TokenType.Id) this.advance();\r\n else params.push(this.parseValueType());\r\n }\r\n } else if (kw === 'result') {\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n this.expect(TokenType.RightParen); // closing type\r\n\r\n const funcType = this.moduleBuilder.defineFuncType(results.length > 0 ? results : null, params);\r\n if (typeName) {\r\n this.typeNames.set(typeName, funcType.index);\r\n }\r\n }\r\n\r\n // --- Import section ---\r\n\r\n parseImport(): void {\r\n // (import \"module\" \"name\" (func (;0;) (type 0)))\r\n const moduleName = this.expect(TokenType.String).value;\r\n const fieldName = this.expect(TokenType.String).value;\r\n\r\n this.expect(TokenType.LeftParen);\r\n const kind = this.advance().value;\r\n\r\n if (kind === 'func') {\r\n this.parseImportFunc(moduleName, fieldName);\r\n } else if (kind === 'table') {\r\n this.parseImportTable(moduleName, fieldName);\r\n } else if (kind === 'memory') {\r\n this.parseImportMemory(moduleName, fieldName);\r\n } else if (kind === 'global') {\r\n this.parseImportGlobal(moduleName, fieldName);\r\n } else {\r\n throw this.error(`Unknown import kind: ${kind}`);\r\n }\r\n }\r\n\r\n parseImportFunc(moduleName: string, fieldName: string): void {\r\n // (func $name (type 0))\r\n // OR: (func $name (param i32) (result i32))\r\n let importFuncName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n importFuncName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n\r\n let funcReturnTypes: ValueTypeDescriptor[] | null = null;\r\n let funcParamTypes: ValueTypeDescriptor[] = [];\r\n\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'type') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n const typeIndex = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n const funcType = this.moduleBuilder._types[typeIndex];\r\n funcReturnTypes = funcType.returnTypes.length > 0 ? funcType.returnTypes : null;\r\n funcParamTypes = funcType.parameterTypes;\r\n } else {\r\n // Parse inline (param ...) (result ...)\r\n const params: ValueTypeDescriptor[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n while (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.peek().value;\r\n if (kw === 'param') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) this.advance();\r\n else params.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'result') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n break;\r\n }\r\n }\r\n funcReturnTypes = results.length > 0 ? results : null;\r\n funcParamTypes = params;\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n const imp = this.moduleBuilder.importFunction(moduleName, fieldName,\r\n funcReturnTypes, funcParamTypes\r\n );\r\n if (importFuncName) {\r\n this.funcNames.set(importFuncName, imp.index);\r\n }\r\n this.funcList.push(imp);\r\n }\r\n\r\n parseImportTable(moduleName: string, fieldName: string): void {\r\n // (table (;0;) 1 10 anyfunc)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n let elemType = 'anyfunc';\r\n\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n if (this.peek().type === TokenType.Keyword) {\r\n elemType = this.advance().value;\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing table\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importTable(moduleName, fieldName, ElementType.AnyFunc, initial, maximum);\r\n }\r\n\r\n parseImportMemory(moduleName: string, fieldName: string): void {\r\n // (memory (;0;) 1 2)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen); // closing memory\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importMemory(moduleName, fieldName, initial, maximum);\r\n }\r\n\r\n parseImportGlobal(moduleName: string, fieldName: string): void {\r\n // (global (;0;) i32) or (global (;0;) (mut i32))\r\n let mutable = false;\r\n let valueType: ValueTypeDescriptor;\r\n\r\n if (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('mut');\r\n valueType = this.parseValueType();\r\n mutable = true;\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n valueType = this.parseValueType();\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing global\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importGlobal(moduleName, fieldName, valueType, mutable);\r\n }\r\n\r\n // --- Function section ---\r\n\r\n parseFunc(): void {\r\n // (func $name (;1;) (type 0) (param i32) (result i32) (local i32) ...)\r\n // OR: (func $name (param i32) (param i32) (result i32) ...)\r\n let name: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n name = this.advance().value.substring(1);\r\n }\r\n\r\n this.skipInlineComment();\r\n\r\n // Check if there's an explicit (type N)\r\n let hasExplicitType = false;\r\n let typeIndex = -1;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'type') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n typeIndex = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n hasExplicitType = true;\r\n }\r\n\r\n const params: ValueTypeDescriptor[] = [];\r\n const paramNames: (string | null)[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n\r\n // Parse optional (param ...) and (result ...)\r\n while (this.isLeftParen() && !this.isInstruction()) {\r\n const savedPos = this.pos;\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.peek().value;\r\n\r\n if (kw === 'param') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) {\r\n const pName = this.advance().value.substring(1); // strip $\r\n params.push(this.parseValueType());\r\n paramNames.push(pName);\r\n } else {\r\n params.push(this.parseValueType());\r\n paramNames.push(null);\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'result') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'local') {\r\n // Will be handled in instruction parsing\r\n this.pos = savedPos;\r\n break;\r\n } else {\r\n this.pos = savedPos;\r\n break;\r\n }\r\n }\r\n\r\n let funcReturnTypes: ValueTypeDescriptor[] | null;\r\n let funcParamTypes: ValueTypeDescriptor[];\r\n\r\n if (hasExplicitType) {\r\n const funcType = this.moduleBuilder._types[typeIndex];\r\n funcReturnTypes = funcType.returnTypes.length > 0 ? funcType.returnTypes : null;\r\n funcParamTypes = funcType.parameterTypes;\r\n } else {\r\n funcReturnTypes = results.length > 0 ? results : null;\r\n funcParamTypes = params;\r\n }\r\n\r\n const funcBuilder = this.moduleBuilder.defineFunction(\r\n name || `func_${this.moduleBuilder._functions.length - 1 + this.moduleBuilder._importsIndexSpace.function}`,\r\n funcReturnTypes,\r\n funcParamTypes\r\n );\r\n\r\n // Apply parameter names\r\n if (!hasExplicitType) {\r\n paramNames.forEach((pName, i) => {\r\n if (pName !== null && i < funcBuilder.parameters.length) {\r\n funcBuilder.parameters[i].withName(pName);\r\n }\r\n });\r\n }\r\n\r\n if (name) {\r\n this.funcNames.set('$' + name, funcBuilder._index);\r\n }\r\n this.funcList.push(funcBuilder);\r\n\r\n // Check if there are locals or instructions\r\n if (this.isRightParen()) {\r\n this.expect(TokenType.RightParen);\r\n return;\r\n }\r\n\r\n // Parse body\r\n this.labelStack = [];\r\n funcBuilder.createEmitter((asm) => {\r\n this.parseFuncBody(asm, funcBuilder);\r\n });\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n }\r\n\r\n parseFuncBody(asm: FunctionEmitter, func: FunctionBuilder): void {\r\n // Parse locals first\r\n while (this.isLeftParen()) {\r\n const savedPos = this.pos;\r\n this.expect(TokenType.LeftParen);\r\n if (this.isKeyword('local')) {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) {\r\n const localName = this.advance().value.substring(1); // strip $\r\n const vt = this.parseValueType();\r\n asm.declareLocal(vt, localName);\r\n } else {\r\n const vt = this.parseValueType();\r\n asm.declareLocal(vt);\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n this.pos = savedPos;\r\n break;\r\n }\r\n }\r\n\r\n // Parse instructions until closing )\r\n while (!this.isRightParen()) {\r\n this.parseInstruction(asm, func);\r\n }\r\n }\r\n\r\n parseInstruction(asm: FunctionEmitter, func: FunctionBuilder): void {\r\n const tok = this.advance();\r\n const mnemonic = tok.value;\r\n\r\n // Special handling for block/loop/if which have block signatures\r\n if (mnemonic === 'block' || mnemonic === 'loop' || mnemonic === 'if') {\r\n // Check for optional $label\r\n let labelName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n labelName = this.advance().value;\r\n }\r\n let blockType: BlockTypeDescriptor = BlockType.Void;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'result') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('result');\r\n const vt = this.parseValueType();\r\n blockType = blockTypeMap[vt.name] || BlockType.Void;\r\n this.expect(TokenType.RightParen);\r\n }\r\n const label = asm.emit(mnemonicToOpCode.get(mnemonic)!, blockType);\r\n if (labelName && label) {\r\n this.labelStack.push({ name: labelName, label });\r\n }\r\n return;\r\n }\r\n\r\n // Handle 'end' \u2014 pop label stack\r\n if (mnemonic === 'end') {\r\n asm.emit(mnemonicToOpCode.get(mnemonic)!);\r\n if (this.labelStack.length > 0) {\r\n // Check if the most recent label matches current depth\r\n const cfStack = (asm as any)._controlFlowVerifier._stack;\r\n // After 'end' pops, check if the popped label was named\r\n const top = this.labelStack[this.labelStack.length - 1];\r\n // If the label's block depth matches, pop it\r\n if (top.label.block && !cfStack.includes(top.label)) {\r\n this.labelStack.pop();\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const opCode = mnemonicToOpCode.get(mnemonic);\r\n if (!opCode) {\r\n throw this.error(`Unknown instruction: ${mnemonic}`, tok);\r\n }\r\n\r\n // Parse immediates based on opcode definition\r\n if (!opCode.immediate) {\r\n asm.emit(opCode);\r\n return;\r\n }\r\n\r\n switch (opCode.immediate) {\r\n case 'VarInt32':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'VarInt64':\r\n asm.emit(opCode, this.parseI64Value());\r\n break;\r\n case 'Float32':\r\n asm.emit(opCode, this.parseFloat());\r\n break;\r\n case 'Float64':\r\n asm.emit(opCode, this.parseFloat());\r\n break;\r\n case 'VarUInt1':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'VarUInt32':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'Local':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'Global':\r\n asm.emit(opCode, this.resolveGlobal());\r\n break;\r\n case 'Function':\r\n asm.emit(opCode, this.resolveFunction());\r\n break;\r\n case 'IndirectFunction': {\r\n // (type N) or (type $name)\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n let typeIdx: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n typeIdx = this.typeNames.get(id)!;\r\n if (typeIdx === undefined) throw this.error(`Unknown type: ${id}`);\r\n } else {\r\n typeIdx = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n asm.emit(opCode, this.moduleBuilder._types[typeIdx]);\r\n break;\r\n }\r\n case 'RelativeDepth':\r\n asm.emit(opCode, this.resolveBranchTarget(asm));\r\n break;\r\n case 'BranchTable': {\r\n // default_target target1 target2 ...\r\n // Last one is default\r\n const targets: number[] = [];\r\n while (this.peek().type === TokenType.Number) {\r\n targets.push(this.parseNumber());\r\n }\r\n if (targets.length < 1) throw this.error('br_table requires at least a default target');\r\n const defaultTarget = targets.pop()!;\r\n // This is tricky with our label system; for now use raw depth values\r\n // by looking up labels on the control flow stack\r\n const defaultLabel = this.getLabelAtDepth(asm, defaultTarget);\r\n const labels = targets.map((t) => this.getLabelAtDepth(asm, t));\r\n asm.emit(opCode, defaultLabel, labels);\r\n break;\r\n }\r\n case 'MemoryImmediate': {\r\n let alignment = 0;\r\n let offset = 0;\r\n // Parse offset=N align=N\r\n while (this.peek().type === TokenType.Keyword && (\r\n this.peek().value.startsWith('offset=') || this.peek().value.startsWith('align=')\r\n )) {\r\n const kv = this.advance().value;\r\n const [key, val] = kv.split('=');\r\n if (key === 'offset') offset = parseInt(val, 10);\r\n else if (key === 'align') {\r\n const alignVal = parseInt(val, 10);\r\n alignment = Math.log2(alignVal);\r\n }\r\n }\r\n asm.emit(opCode, alignment, offset);\r\n break;\r\n }\r\n case 'BlockSignature': {\r\n // Already handled above for block/loop/if\r\n let blockType: BlockTypeDescriptor = BlockType.Void;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'result') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('result');\r\n const vt = this.parseValueType();\r\n blockType = blockTypeMap[vt.name] || BlockType.Void;\r\n this.expect(TokenType.RightParen);\r\n }\r\n asm.emit(opCode, blockType);\r\n break;\r\n }\r\n case 'V128Const': {\r\n // v128.const i8x16 0 1 2 ... or hex format\r\n // For simplicity, parse 16 bytes\r\n const bytes = new Uint8Array(16);\r\n // Skip the lane type keyword (i8x16, i16x8, etc.)\r\n if (this.peek().type === TokenType.Keyword) this.advance();\r\n for (let i = 0; i < 16; i++) {\r\n bytes[i] = this.parseNumber() & 0xff;\r\n }\r\n asm.emit(opCode, bytes);\r\n break;\r\n }\r\n case 'LaneIndex':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'ShuffleMask': {\r\n const mask = new Uint8Array(16);\r\n for (let i = 0; i < 16; i++) {\r\n mask[i] = this.parseNumber();\r\n }\r\n asm.emit(opCode, mask);\r\n break;\r\n }\r\n default:\r\n asm.emit(opCode);\r\n break;\r\n }\r\n }\r\n\r\n getLabelAtDepth(asm: FunctionEmitter, relativeDepth: number): any {\r\n const stack = (asm as any)._controlFlowVerifier._stack;\r\n const targetIndex = stack.length - 1 - relativeDepth;\r\n if (targetIndex < 0 || targetIndex >= stack.length) {\r\n throw this.error(`Invalid branch depth: ${relativeDepth}`);\r\n }\r\n return stack[targetIndex];\r\n }\r\n\r\n resolveBranchTarget(asm: FunctionEmitter): any {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n // Search label stack for matching name (search from top = most recent)\r\n for (let i = this.labelStack.length - 1; i >= 0; i--) {\r\n if (this.labelStack[i].name === id) {\r\n return this.labelStack[i].label;\r\n }\r\n }\r\n throw this.error(`Unknown label: ${id}`);\r\n }\r\n const depth = this.parseNumber();\r\n return this.getLabelAtDepth(asm, depth);\r\n }\r\n\r\n resolveFunction(): FunctionBuilder | ImportBuilder {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const index = this.funcNames.get(id);\r\n if (index === undefined) throw this.error(`Unknown function: ${id}`);\r\n return this.funcList[index];\r\n }\r\n const index = this.parseNumber();\r\n return this.funcList[index];\r\n }\r\n\r\n resolveGlobal(): any {\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const resolved = this.globalNames.get(id);\r\n if (resolved === undefined) throw this.error(`Unknown global: ${id}`);\r\n index = resolved;\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n const importedGlobals = this.moduleBuilder._imports.filter(\r\n (x) => x.externalKind === ExternalKind.Global\r\n );\r\n if (index < importedGlobals.length) {\r\n return importedGlobals[index];\r\n }\r\n return this.moduleBuilder._globals[index - importedGlobals.length];\r\n }\r\n\r\n // --- Table section ---\r\n\r\n parseTable(): void {\r\n // (table (;0;) 1 10 anyfunc)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n\r\n // element type\r\n if (this.peek().type === TokenType.Keyword) {\r\n this.advance(); // anyfunc or funcref\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.defineTable(ElementType.AnyFunc, initial, maximum);\r\n }\r\n\r\n // --- Memory section ---\r\n\r\n parseMemory(): void {\r\n // (memory (;0;) 1 2)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.defineMemory(initial, maximum);\r\n }\r\n\r\n // --- Global section ---\r\n\r\n parseGlobal(): void {\r\n // (global $name i32 (i32.const 0))\r\n // (global $name (mut i32) (i32.const 0))\r\n // (global (;0;) i32 (i32.const 0))\r\n let globalName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n globalName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n\r\n let mutable = false;\r\n let valueType: ValueTypeDescriptor;\r\n\r\n if (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('mut');\r\n valueType = this.parseValueType();\r\n mutable = true;\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n valueType = this.parseValueType();\r\n }\r\n\r\n // Parse init expression (instr)\r\n this.expect(TokenType.LeftParen);\r\n const initInstr = this.advance().value;\r\n let initValue: number | bigint = 0;\r\n\r\n if (initInstr === 'i32.const') {\r\n initValue = this.parseNumber();\r\n } else if (initInstr === 'i64.const') {\r\n initValue = this.parseI64Value();\r\n } else if (initInstr === 'f32.const') {\r\n initValue = this.parseFloat();\r\n } else if (initInstr === 'f64.const') {\r\n initValue = this.parseFloat();\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing init expr\r\n this.expect(TokenType.RightParen); // closing global\r\n\r\n const globalBuilder = this.moduleBuilder.defineGlobal(valueType, mutable, initValue as number);\r\n if (globalName) {\r\n globalBuilder.withName(globalName.substring(1)); // strip $\r\n this.globalNames.set(globalName, globalBuilder._index);\r\n }\r\n }\r\n\r\n // --- Export section ---\r\n\r\n parseExportIndex(): number {\r\n if (this.peek().type === TokenType.Id) {\r\n return -1; // handled by caller\r\n }\r\n return this.parseNumber();\r\n }\r\n\r\n parseExport(): void {\r\n // (export \"name\" (func 0))\r\n // (export \"name\" (func $name))\r\n const name = this.expect(TokenType.String).value;\r\n this.expect(TokenType.LeftParen);\r\n const kind = this.advance().value;\r\n\r\n switch (kind) {\r\n case 'func': {\r\n let funcIndex: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n funcIndex = this.funcNames.get(id)!;\r\n if (funcIndex === undefined) throw this.error(`Unknown function: ${id}`);\r\n } else {\r\n funcIndex = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen); // closing kind\r\n this.expect(TokenType.RightParen); // closing export\r\n const func = this.funcList[funcIndex];\r\n if (func instanceof ImportBuilder) {\r\n throw this.error('Cannot export an imported function directly');\r\n }\r\n this.moduleBuilder.exportFunction(func as FunctionBuilder, name);\r\n break;\r\n }\r\n case 'table': {\r\n const index = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.exportTable(this.moduleBuilder._tables[index], name);\r\n break;\r\n }\r\n case 'memory': {\r\n const index = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.exportMemory(this.moduleBuilder._memories[index], name);\r\n break;\r\n }\r\n case 'global': {\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n index = this.globalNames.get(id)!;\r\n if (index === undefined) throw this.error(`Unknown global: ${id}`);\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n const importedGlobals = this.moduleBuilder._imports.filter(\r\n (x) => x.externalKind === ExternalKind.Global\r\n );\r\n if (index < importedGlobals.length) {\r\n throw this.error('Cannot export an imported global directly');\r\n }\r\n this.moduleBuilder.exportGlobal(\r\n this.moduleBuilder._globals[index - importedGlobals.length], name\r\n );\r\n break;\r\n }\r\n default: {\r\n this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n }\r\n }\r\n }\r\n\r\n // --- Start section ---\r\n\r\n parseStart(): void {\r\n // (start 0) or (start $name)\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n index = this.funcNames.get(id)!;\r\n if (index === undefined) throw this.error(`Unknown function: ${id}`);\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n const func = this.funcList[index];\r\n if (func instanceof FunctionBuilder) {\r\n this.moduleBuilder.setStartFunction(func);\r\n }\r\n }\r\n\r\n // --- Element section ---\r\n\r\n parseElem(): void {\r\n // (elem (;0;) (i32.const 0) func 0 1 2)\r\n // Parse offset expression\r\n this.expect(TokenType.LeftParen);\r\n const offsetInstr = this.advance().value;\r\n let offset = 0;\r\n if (offsetInstr === 'i32.const') {\r\n offset = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n\r\n // \"func\" keyword\r\n if (this.isKeyword('func')) {\r\n this.advance();\r\n }\r\n\r\n // Parse function indices or $name references\r\n const elements: (FunctionBuilder | ImportBuilder)[] = [];\r\n while (this.peek().type === TokenType.Number || this.peek().type === TokenType.Id) {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const idx = this.funcNames.get(id);\r\n if (idx === undefined) throw this.error(`Unknown function: ${id}`);\r\n elements.push(this.funcList[idx]);\r\n } else {\r\n const idx = this.parseNumber();\r\n elements.push(this.funcList[idx]);\r\n }\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n\r\n const table = this.moduleBuilder._tables[0];\r\n this.moduleBuilder.defineTableSegment(table, elements, offset);\r\n }\r\n\r\n // --- Data section ---\r\n\r\n parseData(): void {\r\n // (data (;0;) (i32.const 0) \"hello\\00world\")\r\n this.expect(TokenType.LeftParen);\r\n const offsetInstr = this.advance().value;\r\n let offset = 0;\r\n if (offsetInstr === 'i32.const') {\r\n offset = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n\r\n const dataStr = this.expect(TokenType.String).value;\r\n const bytes = new Uint8Array(dataStr.length);\r\n for (let i = 0; i < dataStr.length; i++) {\r\n bytes[i] = dataStr.charCodeAt(i);\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n\r\n this.moduleBuilder.defineData(bytes, offset);\r\n }\r\n\r\n // --- Helpers ---\r\n\r\n parseValueType(): ValueTypeDescriptor {\r\n const tok = this.advance();\r\n const vt = valueTypeMap[tok.value];\r\n if (!vt) throw this.error(`Unknown value type: ${tok.value}`, tok);\r\n return vt;\r\n }\r\n\r\n parseNumber(): number {\r\n const tok = this.advance();\r\n if (tok.value.startsWith('0x') || tok.value.startsWith('-0x') || tok.value.startsWith('+0x')) {\r\n return parseInt(tok.value.replace(/_/g, ''), 16);\r\n }\r\n return parseInt(tok.value.replace(/_/g, ''), 10);\r\n }\r\n\r\n parseFloat(): number {\r\n const tok = this.advance();\r\n const val = tok.value.replace(/_/g, '');\r\n if (val === 'inf' || val === '+inf') return Infinity;\r\n if (val === '-inf') return -Infinity;\r\n if (val.includes('nan')) return NaN;\r\n if (val.startsWith('0x') || val.startsWith('-0x') || val.startsWith('+0x')) {\r\n return this.parseHexFloat(val);\r\n }\r\n return parseFloat(val);\r\n }\r\n\r\n parseHexFloat(val: string): number {\r\n // Hex float format: 0xHH.HHpEE\r\n const negative = val.startsWith('-');\r\n const clean = val.replace(/^[+-]?0x/, '');\r\n const parts = clean.split('p');\r\n const mantissa = parts[0];\r\n const exponent = parts.length > 1 ? parseInt(parts[1], 10) : 0;\r\n\r\n let result: number;\r\n if (mantissa.includes('.')) {\r\n const [intPart, fracPart] = mantissa.split('.');\r\n result = parseInt(intPart || '0', 16) +\r\n parseInt(fracPart || '0', 16) / Math.pow(16, (fracPart || '').length);\r\n } else {\r\n result = parseInt(mantissa, 16);\r\n }\r\n\r\n result *= Math.pow(2, exponent);\r\n return negative ? -result : result;\r\n }\r\n\r\n parseI64Value(): number | bigint {\r\n const tok = this.advance();\r\n const val = tok.value.replace(/_/g, '');\r\n try {\r\n return BigInt(val);\r\n } catch {\r\n return parseInt(val, 10);\r\n }\r\n }\r\n\r\n isInstruction(): boolean {\r\n // Check if the next s-expr is an instruction (local or something else)\r\n if (!this.isLeftParen()) return false;\r\n const nextTok = this.tokens[this.pos + 1];\r\n if (!nextTok) return false;\r\n return nextTok.value !== 'param' && nextTok.value !== 'result' && nextTok.value !== 'type';\r\n }\r\n}\r\n\r\n/**\r\n * Parse a WAT (WebAssembly Text Format) string into a ModuleBuilder.\r\n */\r\nexport function parseWat(source: string, options?: ModuleBuilderOptions): ModuleBuilder {\r\n const tokens = tokenize(source);\r\n const parser = new WatParserImpl(tokens);\r\n return parser.parse(options);\r\n}\r\n", "import {\r\n ModuleBuilder,\r\n ValueType,\r\n BlockType,\r\n ElementType,\r\n TextModuleWriter,\r\n BinaryReader,\r\n parseWat,\r\n} from '../src/index';\r\n\r\nconst EXAMPLES: Record = {\r\n // \u2500\u2500\u2500 Basics \u2500\u2500\u2500\r\n 'hello-wasm': {\r\n label: 'Hello WASM',\r\n group: 'Basics',\r\n code: `// Hello WASM \u2014 the simplest possible module\r\nconst mod = new webasmjs.ModuleBuilder('hello');\r\n\r\nmod.defineFunction('answer', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.const_i32(42);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst answer = instance.instance.exports.answer;\r\nlog('The answer to everything: ' + answer());`,\r\n },\r\n\r\n factorial: {\r\n label: 'Factorial',\r\n group: 'Basics',\r\n code: `// Factorial \u2014 iterative with loop and block\r\nconst mod = new webasmjs.ModuleBuilder('factorial');\r\n\r\nmod.defineFunction('factorial', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const result = a.declareLocal(webasmjs.ValueType.Int32, 'result');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.const_i32(1);\r\n a.set_local(result);\r\n a.const_i32(1);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(result);\r\n a.get_local(i);\r\n a.mul_i32();\r\n a.set_local(result);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(result);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst factorial = instance.instance.exports.factorial;\r\nfor (let n = 0; n <= 10; n++) {\r\n log(n + '! = ' + factorial(n));\r\n}`,\r\n },\r\n\r\n fibonacci: {\r\n label: 'Fibonacci',\r\n group: 'Basics',\r\n code: `// Fibonacci sequence \u2014 iterative\r\nconst mod = new webasmjs.ModuleBuilder('fibonacci');\r\n\r\nmod.defineFunction('fib', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const prev = a.declareLocal(webasmjs.ValueType.Int32, 'prev');\r\n const curr = a.declareLocal(webasmjs.ValueType.Int32, 'curr');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.get_local(n);\r\n a.return();\r\n });\r\n\r\n a.const_i32(0);\r\n a.set_local(prev);\r\n a.const_i32(1);\r\n a.set_local(curr);\r\n a.const_i32(2);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(curr);\r\n a.set_local(temp);\r\n a.get_local(curr);\r\n a.get_local(prev);\r\n a.add_i32();\r\n a.set_local(curr);\r\n a.get_local(temp);\r\n a.set_local(prev);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(curr);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst fib = instance.instance.exports.fib;\r\nfor (let n = 0; n <= 15; n++) {\r\n log('fib(' + n + ') = ' + fib(n));\r\n}`,\r\n },\r\n\r\n 'if-else': {\r\n label: 'If/Else',\r\n group: 'Basics',\r\n code: `// If/Else \u2014 absolute value and sign function\r\nconst mod = new webasmjs.ModuleBuilder('ifElse');\r\n\r\n// Absolute value using if/else with typed block\r\nmod.defineFunction('abs', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.lt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(0);\r\n a.get_local(f.getParameter(0));\r\n a.sub_i32();\r\n a.else();\r\n a.get_local(f.getParameter(0));\r\n a.end();\r\n}).withExport();\r\n\r\n// Sign function: returns -1, 0, or 1\r\nmod.defineFunction('sign', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.lt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(-1);\r\n a.else();\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.gt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(1);\r\n a.else();\r\n a.const_i32(0);\r\n a.end();\r\n a.end();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { abs, sign } = instance.instance.exports;\r\n\r\nlog('abs(5) = ' + abs(5));\r\nlog('abs(-5) = ' + abs(-5));\r\nlog('abs(0) = ' + abs(0));\r\nlog('');\r\nlog('sign(42) = ' + sign(42));\r\nlog('sign(-7) = ' + sign(-7));\r\nlog('sign(0) = ' + sign(0));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Memory \u2500\u2500\u2500\r\n memory: {\r\n label: 'Memory Basics',\r\n group: 'Memory',\r\n code: `// Memory: store and load values\r\nconst mod = new webasmjs.ModuleBuilder('memoryExample');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\nmod.defineFunction('store', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('load', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { store, load } = instance.instance.exports;\r\n\r\nstore(0, 42);\r\nstore(4, 100);\r\nlog('Value at address 0: ' + load(0));\r\nlog('Value at address 4: ' + load(4));\r\nstore(0, load(0) + load(4));\r\nlog('Sum stored at 0: ' + load(0));`,\r\n },\r\n\r\n 'byte-array': {\r\n label: 'Byte Array',\r\n group: 'Memory',\r\n code: `// Byte array \u2014 store and sum individual bytes\r\nconst mod = new webasmjs.ModuleBuilder('byteArray');\r\nmod.defineMemory(1);\r\n\r\n// Store a byte at offset\r\nmod.defineFunction('setByte', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store8_i32(0, 0);\r\n}).withExport();\r\n\r\n// Load a byte from offset\r\nmod.defineFunction('getByte', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load8_i32_u(0, 0);\r\n}).withExport();\r\n\r\n// Sum bytes from offset 0 to length-1\r\nmod.defineFunction('sumBytes', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const len = f.getParameter(0);\r\n const sum = a.declareLocal(webasmjs.ValueType.Int32, 'sum');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.const_i32(0);\r\n a.set_local(sum);\r\n a.const_i32(0);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(len);\r\n a.ge_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(sum);\r\n a.get_local(i);\r\n a.load8_i32_u(0, 0);\r\n a.add_i32();\r\n a.set_local(sum);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(sum);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { setByte, getByte, sumBytes } = instance.instance.exports;\r\n\r\n// Fill bytes 0..9 with values 10, 20, 30, ...\r\nfor (let i = 0; i < 10; i++) {\r\n setByte(i, (i + 1) * 10);\r\n}\r\n\r\nlog('Stored bytes:');\r\nfor (let i = 0; i < 10; i++) {\r\n log(' [' + i + '] = ' + getByte(i));\r\n}\r\nlog('Sum of 10 bytes: ' + sumBytes(10));`,\r\n },\r\n\r\n 'string-memory': {\r\n label: 'Strings in Memory',\r\n group: 'Memory',\r\n code: `// Strings in memory \u2014 store a string, compute its length\r\nconst mod = new webasmjs.ModuleBuilder('stringMem');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// Store a data segment with a string at offset 0\r\nconst greeting = new TextEncoder().encode('Hello, WebAssembly!');\r\nmod.defineData(new Uint8Array([...greeting, 0]), 0); // null-terminated\r\n\r\n// strlen: count bytes until null\r\nmod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const ptr = f.getParameter(0);\r\n const len = a.declareLocal(webasmjs.ValueType.Int32, 'len');\r\n\r\n a.const_i32(0);\r\n a.set_local(len);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n // Load byte at ptr + len\r\n a.get_local(ptr);\r\n a.get_local(len);\r\n a.add_i32();\r\n a.load8_i32_u(0, 0);\r\n a.eqz_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(len);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(len);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { strlen, memory } = instance.instance.exports;\r\n\r\n// Read the string from memory\r\nconst memView = new Uint8Array(memory.buffer);\r\nconst strLen = strlen(0);\r\nconst str = new TextDecoder().decode(memView.slice(0, strLen));\r\n\r\nlog('String in memory: \"' + str + '\"');\r\nlog('Length: ' + strLen);`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Globals & State \u2500\u2500\u2500\r\n globals: {\r\n label: 'Global Counter',\r\n group: 'Globals',\r\n code: `// Globals: mutable counter\r\nconst mod = new webasmjs.ModuleBuilder('globals');\r\n\r\nconst counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\nmod.defineFunction('increment', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(counter);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_global(counter);\r\n a.get_global(counter);\r\n}).withExport();\r\n\r\nmod.defineFunction('getCount', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(counter);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { increment, getCount } = instance.instance.exports;\r\n\r\nlog('Initial: ' + getCount());\r\nincrement();\r\nincrement();\r\nincrement();\r\nlog('After 3 increments: ' + getCount());\r\nfor (let i = 0; i < 7; i++) increment();\r\nlog('After 7 more: ' + getCount());`,\r\n },\r\n\r\n 'start-function': {\r\n label: 'Start Function',\r\n group: 'Globals',\r\n code: `// Start function \u2014 runs automatically on instantiation\r\nconst mod = new webasmjs.ModuleBuilder('startExample');\r\n\r\nconst initialized = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\n// This function runs automatically at instantiation\r\nconst initFn = mod.defineFunction('init', null, [], (f, a) => {\r\n a.const_i32(1);\r\n a.set_global(initialized);\r\n});\r\nmod.setStartFunction(initFn);\r\n\r\n// Exported getter\r\nmod.defineFunction('isInitialized', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(initialized);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isInitialized } = instance.instance.exports;\r\nlog('isInitialized (should be 1): ' + isInitialized());\r\nlog('The start function ran automatically!');`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Functions & Calls \u2500\u2500\u2500\r\n 'multi-func': {\r\n label: 'Function Calls',\r\n group: 'Functions',\r\n code: `// Multiple functions calling each other\r\nconst mod = new webasmjs.ModuleBuilder('multiFn');\r\n\r\n// Helper: square\r\nmod.defineFunction('square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(0));\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Helper: double\r\nmod.defineFunction('double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(2);\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Composed: 2 * x^2\r\nconst squareFn = mod._functions[0];\r\nconst doubleFn = mod._functions[1];\r\n\r\nmod.defineFunction('doubleSquare', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.call(squareFn);\r\n a.call(doubleFn);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { square, double: dbl, doubleSquare } = instance.instance.exports;\r\n\r\nfor (let x = 1; x <= 5; x++) {\r\n log('x=' + x + ': square=' + square(x) + ', double=' + dbl(x) + ', 2x\u00B2=' + doubleSquare(x));\r\n}`,\r\n },\r\n\r\n 'imports': {\r\n label: 'Import Functions',\r\n group: 'Functions',\r\n code: `// Importing host functions \u2014 WASM calling JavaScript\r\nconst mod = new webasmjs.ModuleBuilder('imports');\r\n\r\n// Declare an import: env.print takes an i32\r\nconst printImport = mod.importFunction('env', 'print', null, [webasmjs.ValueType.Int32]);\r\n\r\n// Declare another import: env.getTime returns an i32\r\nconst getTimeImport = mod.importFunction('env', 'getTime', [webasmjs.ValueType.Int32], []);\r\n\r\nmod.defineFunction('run', null, [], (f, a) => {\r\n // Call getTime, then print it\r\n a.call(getTimeImport);\r\n a.call(printImport);\r\n\r\n // Print some constants\r\n a.const_i32(100);\r\n a.call(printImport);\r\n a.const_i32(200);\r\n a.call(printImport);\r\n a.const_i32(300);\r\n a.call(printImport);\r\n}).withExport();\r\n\r\nconst logged = [];\r\nconst instance = await mod.instantiate({\r\n env: {\r\n print: (v) => { logged.push(v); },\r\n getTime: () => Date.now() & 0x7FFFFFFF,\r\n },\r\n});\r\n\r\ninstance.instance.exports.run();\r\n\r\nlog('Values printed by WASM:');\r\nlogged.forEach((v, i) => log(' [' + i + '] ' + v));`,\r\n },\r\n\r\n 'indirect-call': {\r\n label: 'Indirect Calls (Table)',\r\n group: 'Functions',\r\n code: `// Indirect calls via function table\r\nconst mod = new webasmjs.ModuleBuilder('indirectCall');\r\n\r\nconst add = mod.defineFunction('add', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n});\r\n\r\nconst sub = mod.defineFunction('sub', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.sub_i32();\r\n});\r\n\r\nconst mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i32();\r\n});\r\n\r\n// Create a table with 3 entries\r\nconst table = mod.defineTable(webasmjs.ElementType.AnyFunc, 3);\r\nmod.defineTableSegment(table, [add, sub, mul], 0);\r\n\r\n// Dispatcher: call function at table[opIndex](a, b)\r\nmod.defineFunction('dispatch', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(1)); // a\r\n a.get_local(f.getParameter(2)); // b\r\n a.get_local(f.getParameter(0)); // table index\r\n a.call_indirect(add.funcTypeBuilder);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { dispatch } = instance.instance.exports;\r\n\r\nconst ops = ['add', 'sub', 'mul'];\r\nfor (let op = 0; op < 3; op++) {\r\n log(ops[op] + '(10, 3) = ' + dispatch(op, 10, 3));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Numeric Types \u2500\u2500\u2500\r\n 'float-math': {\r\n label: 'Float Math',\r\n group: 'Numeric',\r\n code: `// Floating-point operations \u2014 f64 math functions\r\nconst mod = new webasmjs.ModuleBuilder('floatMath');\r\n\r\n// Distance: sqrt(dx*dx + dy*dy)\r\nmod.defineFunction('distance', [webasmjs.ValueType.Float64],\r\n [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64,\r\n webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => {\r\n const x1 = f.getParameter(0);\r\n const y1 = f.getParameter(1);\r\n const x2 = f.getParameter(2);\r\n const y2 = f.getParameter(3);\r\n const dx = a.declareLocal(webasmjs.ValueType.Float64, 'dx');\r\n const dy = a.declareLocal(webasmjs.ValueType.Float64, 'dy');\r\n\r\n // dx = x2 - x1\r\n a.get_local(x2);\r\n a.get_local(x1);\r\n a.sub_f64();\r\n a.set_local(dx);\r\n\r\n // dy = y2 - y1\r\n a.get_local(y2);\r\n a.get_local(y1);\r\n a.sub_f64();\r\n a.set_local(dy);\r\n\r\n // sqrt(dx*dx + dy*dy)\r\n a.get_local(dx);\r\n a.get_local(dx);\r\n a.mul_f64();\r\n a.get_local(dy);\r\n a.get_local(dy);\r\n a.mul_f64();\r\n a.add_f64();\r\n a.sqrt_f64();\r\n}).withExport();\r\n\r\n// Rounding functions\r\nmod.defineFunction('roundUp', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.ceil_f64();\r\n}).withExport();\r\n\r\nmod.defineFunction('roundDown', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.floor_f64();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { distance, roundUp, roundDown } = instance.instance.exports;\r\n\r\nlog('distance((0,0), (3,4)) = ' + distance(0, 0, 3, 4));\r\nlog('distance((1,1), (4,5)) = ' + distance(1, 1, 4, 5));\r\nlog('');\r\nlog('roundUp(2.3) = ' + roundUp(2.3));\r\nlog('roundUp(2.7) = ' + roundUp(2.7));\r\nlog('roundDown(2.3) = ' + roundDown(2.3));\r\nlog('roundDown(2.7) = ' + roundDown(2.7));`,\r\n },\r\n\r\n 'i64-bigint': {\r\n label: 'i64 / BigInt',\r\n group: 'Numeric',\r\n code: `// 64-bit integers \u2014 BigInt interop\r\nconst mod = new webasmjs.ModuleBuilder('i64ops');\r\n\r\nmod.defineFunction('add64', [webasmjs.ValueType.Int64],\r\n [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i64();\r\n}).withExport();\r\n\r\nmod.defineFunction('mul64', [webasmjs.ValueType.Int64],\r\n [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i64();\r\n}).withExport();\r\n\r\n// Factorial with i64 \u2014 can handle larger numbers\r\nmod.defineFunction('factorial64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int64], (f, a) => {\r\n const n = f.getParameter(0);\r\n const result = a.declareLocal(webasmjs.ValueType.Int64, 'result');\r\n const i = a.declareLocal(webasmjs.ValueType.Int64, 'i');\r\n\r\n a.const_i64(1n);\r\n a.set_local(result);\r\n a.const_i64(1n);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i64();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(result);\r\n a.get_local(i);\r\n a.mul_i64();\r\n a.set_local(result);\r\n\r\n a.get_local(i);\r\n a.const_i64(1n);\r\n a.add_i64();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(result);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { add64, mul64, factorial64 } = instance.instance.exports;\r\n\r\nlog('add64(1000000000000n, 2000000000000n) = ' + add64(1000000000000n, 2000000000000n));\r\nlog('mul64(123456789n, 987654321n) = ' + mul64(123456789n, 987654321n));\r\nlog('');\r\nlog('Factorial with i64 (no overflow up to 20!):');\r\nfor (let n = 0n; n <= 20n; n++) {\r\n log(' ' + n + '! = ' + factorial64(n));\r\n}`,\r\n },\r\n\r\n 'type-conversions': {\r\n label: 'Type Conversions',\r\n group: 'Numeric',\r\n code: `// Type conversions between numeric types\r\nconst mod = new webasmjs.ModuleBuilder('conversions');\r\n\r\n// i32 to f64\r\nmod.defineFunction('i32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.convert_i32_s_f64();\r\n}).withExport();\r\n\r\n// f64 to i32 (truncate)\r\nmod.defineFunction('f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_f64_s_i32();\r\n}).withExport();\r\n\r\n// i32 to i64 (sign extend)\r\nmod.defineFunction('i32_to_i64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend_i32_s_i64();\r\n}).withExport();\r\n\r\n// i64 to i32 (wrap)\r\nmod.defineFunction('i64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.wrap_i64_i32();\r\n}).withExport();\r\n\r\n// f32 to f64 (promote)\r\nmod.defineFunction('f32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.promote_f32_f64();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { i32_to_f64, f64_to_i32, i32_to_i64, i64_to_i32, f32_to_f64 } = instance.instance.exports;\r\n\r\nlog('i32(42) \u2192 f64: ' + i32_to_f64(42));\r\nlog('f64(3.14) \u2192 i32: ' + f64_to_i32(3.14));\r\nlog('f64(99.9) \u2192 i32: ' + f64_to_i32(99.9));\r\nlog('i32(42) \u2192 i64: ' + i32_to_i64(42));\r\nlog('i32(-1) \u2192 i64: ' + i32_to_i64(-1));\r\nlog('i64(0x1FFFFFFFFn) \u2192 i32: ' + i64_to_i32(0x1FFFFFFFFn));\r\nlog('f32(3.14) \u2192 f64: ' + f32_to_f64(3.140000104904175));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Algorithms \u2500\u2500\u2500\r\n 'bubble-sort': {\r\n label: 'Bubble Sort',\r\n group: 'Algorithms',\r\n code: `// Bubble sort in WASM memory\r\nconst mod = new webasmjs.ModuleBuilder('bubbleSort');\r\nmod.defineMemory(1);\r\n\r\n// Store i32 at index (index * 4)\r\nmod.defineFunction('set', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(4);\r\n a.mul_i32();\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0);\r\n}).withExport();\r\n\r\n// Load i32 at index\r\nmod.defineFunction('get', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(4);\r\n a.mul_i32();\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\nconst setFn = mod._functions[0];\r\nconst getFn = mod._functions[1];\r\n\r\n// Bubble sort(length)\r\nmod.defineFunction('sort', null, [webasmjs.ValueType.Int32], (f, a) => {\r\n const len = f.getParameter(0);\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n const j = a.declareLocal(webasmjs.ValueType.Int32, 'j');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n const swapped = a.declareLocal(webasmjs.ValueType.Int32, 'swapped');\r\n\r\n a.const_i32(0);\r\n a.set_local(i);\r\n\r\n // Outer loop\r\n a.loop(webasmjs.BlockType.Void, (outerLoop) => {\r\n a.block(webasmjs.BlockType.Void, (outerBreak) => {\r\n a.get_local(i);\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.sub_i32();\r\n a.ge_i32();\r\n a.br_if(outerBreak);\r\n\r\n a.const_i32(0);\r\n a.set_local(swapped);\r\n a.const_i32(0);\r\n a.set_local(j);\r\n\r\n // Inner loop\r\n a.loop(webasmjs.BlockType.Void, (innerLoop) => {\r\n a.block(webasmjs.BlockType.Void, (innerBreak) => {\r\n a.get_local(j);\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.sub_i32();\r\n a.get_local(i);\r\n a.sub_i32();\r\n a.ge_i32();\r\n a.br_if(innerBreak);\r\n\r\n // if arr[j] > arr[j+1], swap\r\n a.get_local(j);\r\n a.call(getFn);\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.call(getFn);\r\n a.gt_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n // temp = arr[j]\r\n a.get_local(j);\r\n a.call(getFn);\r\n a.set_local(temp);\r\n // arr[j] = arr[j+1]\r\n a.get_local(j);\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.call(getFn);\r\n a.call(setFn);\r\n // arr[j+1] = temp\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.get_local(temp);\r\n a.call(setFn);\r\n a.const_i32(1);\r\n a.set_local(swapped);\r\n });\r\n\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(j);\r\n a.br(innerLoop);\r\n });\r\n });\r\n\r\n // Early exit if no swaps\r\n a.get_local(swapped);\r\n a.eqz_i32();\r\n a.br_if(outerBreak);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(outerLoop);\r\n });\r\n });\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { set, get, sort } = instance.instance.exports;\r\n\r\nconst data = [64, 34, 25, 12, 22, 11, 90, 1, 55, 42];\r\nlog('Before: ' + data.join(', '));\r\n\r\ndata.forEach((v, i) => set(i, v));\r\nsort(data.length);\r\n\r\nconst sorted = [];\r\nfor (let i = 0; i < data.length; i++) sorted.push(get(i));\r\nlog('After: ' + sorted.join(', '));`,\r\n },\r\n\r\n 'gcd': {\r\n label: 'GCD (Euclidean)',\r\n group: 'Algorithms',\r\n code: `// Greatest common divisor \u2014 Euclidean algorithm\r\nconst mod = new webasmjs.ModuleBuilder('gcd');\r\n\r\nmod.defineFunction('gcd', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const x = f.getParameter(0);\r\n const y = f.getParameter(1);\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(y);\r\n a.eqz_i32();\r\n a.br_if(breakLabel);\r\n\r\n // temp = y\r\n a.get_local(y);\r\n a.set_local(temp);\r\n // y = x % y\r\n a.get_local(x);\r\n a.get_local(y);\r\n a.rem_i32_u();\r\n a.set_local(y);\r\n // x = temp\r\n a.get_local(temp);\r\n a.set_local(x);\r\n\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(x);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { gcd } = instance.instance.exports;\r\n\r\nconst pairs = [[12, 8], [100, 75], [17, 13], [48, 18], [0, 5], [7, 0], [1071, 462]];\r\nfor (const [a, b] of pairs) {\r\n log('gcd(' + a + ', ' + b + ') = ' + gcd(a, b));\r\n}`,\r\n },\r\n\r\n 'collatz': {\r\n label: 'Collatz Conjecture',\r\n group: 'Algorithms',\r\n code: `// Collatz conjecture \u2014 count steps to reach 1\r\nconst mod = new webasmjs.ModuleBuilder('collatz');\r\n\r\nmod.defineFunction('collatz', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const steps = a.declareLocal(webasmjs.ValueType.Int32, 'steps');\r\n\r\n a.const_i32(0);\r\n a.set_local(steps);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(steps);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(steps);\r\n\r\n // if n is odd: n = 3n + 1, else: n = n / 2\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.and_i32();\r\n a.if(webasmjs.BlockType.Void);\r\n // odd: n = 3n + 1\r\n a.get_local(n);\r\n a.const_i32(3);\r\n a.mul_i32();\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(n);\r\n a.else();\r\n // even: n = n / 2\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.shr_i32_u();\r\n a.set_local(n);\r\n a.end();\r\n\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(steps);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { collatz } = instance.instance.exports;\r\n\r\nfor (const n of [1, 2, 3, 6, 7, 9, 27, 97, 871]) {\r\n log('collatz(' + n + ') = ' + collatz(n) + ' steps');\r\n}`,\r\n },\r\n\r\n 'is-prime': {\r\n label: 'Primality Test',\r\n group: 'Algorithms',\r\n code: `// Primality test \u2014 trial division\r\nconst mod = new webasmjs.ModuleBuilder('prime');\r\n\r\nmod.defineFunction('isPrime', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n // n <= 1 \u2192 not prime\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n // n <= 3 \u2192 prime\r\n a.get_local(n);\r\n a.const_i32(3);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(1);\r\n a.return();\r\n });\r\n\r\n // divisible by 2 \u2192 not prime\r\n a.get_local(n);\r\n a.const_i32(2);\r\n a.rem_i32_u();\r\n a.eqz_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n // Trial division from 3 to sqrt(n)\r\n a.const_i32(3);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n // if i * i > n, break (is prime)\r\n a.get_local(i);\r\n a.get_local(i);\r\n a.mul_i32();\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n // if n % i == 0, not prime\r\n a.get_local(n);\r\n a.get_local(i);\r\n a.rem_i32_u();\r\n a.eqz_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n a.get_local(i);\r\n a.const_i32(2);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.const_i32(1);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isPrime } = instance.instance.exports;\r\n\r\nlog('Prime numbers up to 100:');\r\nconst primes = [];\r\nfor (let n = 2; n <= 100; n++) {\r\n if (isPrime(n)) primes.push(n);\r\n}\r\nlog(primes.join(', '));\r\nlog('');\r\nlog('Testing larger numbers:');\r\nfor (const n of [997, 1000, 7919, 7920, 104729]) {\r\n log(n + ' is ' + (isPrime(n) ? 'prime' : 'not prime'));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 WAT Parser \u2500\u2500\u2500\r\n 'wat-parser': {\r\n label: 'WAT Parser',\r\n group: 'WAT',\r\n code: `// Parse WAT text and instantiate\r\nconst watSource = \\`\r\n(module $parsed\r\n (func $add (param i32) (param i32) (result i32)\r\n local.get 0\r\n local.get 1\r\n i32.add\r\n )\r\n (export \"add\" (func $add))\r\n)\r\n\\`;\r\n\r\nlog('Parsing WAT source...');\r\nconst mod = webasmjs.parseWat(watSource);\r\nlog('WAT parsed successfully!');\r\nlog('');\r\n\r\nconst instance = await mod.instantiate();\r\nconst add = instance.instance.exports.add;\r\nlog('add(3, 4) = ' + add(3, 4));\r\nlog('add(100, 200) = ' + add(100, 200));\r\nlog('add(-5, 10) = ' + add(-5, 10));`,\r\n },\r\n\r\n 'wat-loop': {\r\n label: 'WAT Loop & Branch',\r\n group: 'WAT',\r\n code: `// WAT with loop and branch instructions\r\nconst watSource = \\`\r\n(module $loops\r\n (func $sum (param i32) (result i32)\r\n (local i32) ;; accumulator\r\n (local i32) ;; counter\r\n i32.const 0\r\n local.set 1\r\n i32.const 1\r\n local.set 2\r\n block $break\r\n loop $continue\r\n local.get 2\r\n local.get 0\r\n i32.gt_s\r\n br_if $break\r\n\r\n local.get 1\r\n local.get 2\r\n i32.add\r\n local.set 1\r\n\r\n local.get 2\r\n i32.const 1\r\n i32.add\r\n local.set 2\r\n br $continue\r\n end\r\n end\r\n local.get 1\r\n )\r\n (export \"sum\" (func $sum))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst sum = instance.instance.exports.sum;\r\n\r\nlog('Sum from 1 to N:');\r\nfor (const n of [0, 1, 5, 10, 50, 100]) {\r\n log(' sum(' + n + ') = ' + sum(n));\r\n}`,\r\n },\r\n\r\n 'wat-memory': {\r\n label: 'WAT Memory & Data',\r\n group: 'WAT',\r\n code: `// WAT with memory, data segments, and imports\r\nconst watSource = \\`\r\n(module $memTest\r\n (memory 1)\r\n (func $store (param i32) (param i32)\r\n local.get 0\r\n local.get 1\r\n i32.store offset=0 align=4\r\n )\r\n (func $load (param i32) (result i32)\r\n local.get 0\r\n i32.load offset=0 align=4\r\n )\r\n (export \"store\" (func $store))\r\n (export \"load\" (func $load))\r\n (export \"mem\" (memory 0))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst { store, load, mem } = instance.instance.exports;\r\n\r\n// Store values at various offsets\r\nstore(0, 11);\r\nstore(4, 22);\r\nstore(8, 33);\r\nstore(12, 44);\r\n\r\nlog('Memory contents:');\r\nfor (let addr = 0; addr < 16; addr += 4) {\r\n log(' [' + addr + '] = ' + load(addr));\r\n}\r\n\r\n// Also inspect raw memory\r\nconst view = new Uint8Array(mem.buffer);\r\nlog('');\r\nlog('Raw bytes [0..15]: ' + Array.from(view.slice(0, 16)).join(', '));`,\r\n },\r\n\r\n 'wat-global': {\r\n label: 'WAT Globals & Start',\r\n group: 'WAT',\r\n code: `// WAT with globals, start function, and if/else\r\nconst watSource = \\`\r\n(module $globalDemo\r\n (global $counter (mut i32) (i32.const 0))\r\n\r\n (func $init\r\n i32.const 100\r\n global.set 0\r\n )\r\n\r\n (func $inc (result i32)\r\n global.get 0\r\n i32.const 1\r\n i32.add\r\n global.set 0\r\n global.get 0\r\n )\r\n\r\n (func $dec (result i32)\r\n global.get 0\r\n i32.const 1\r\n i32.sub\r\n global.set 0\r\n global.get 0\r\n )\r\n\r\n (func $getCounter (result i32)\r\n global.get 0\r\n )\r\n\r\n (start $init)\r\n (export \"inc\" (func $inc))\r\n (export \"dec\" (func $dec))\r\n (export \"getCounter\" (func $getCounter))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst { inc, dec, getCounter } = instance.instance.exports;\r\n\r\nlog('Initial (set by start): ' + getCounter());\r\nlog('inc() = ' + inc());\r\nlog('inc() = ' + inc());\r\nlog('inc() = ' + inc());\r\nlog('dec() = ' + dec());\r\nlog('Final: ' + getCounter());`,\r\n },\r\n\r\n // \u2500\u2500\u2500 SIMD \u2500\u2500\u2500\r\n 'simd-vec-add': {\r\n label: 'SIMD Vector Add',\r\n group: 'SIMD',\r\n code: `// SIMD: add two f32x4 vectors in memory\r\nconst mod = new webasmjs.ModuleBuilder('simdAdd', { disableVerification: true });\r\nmod.defineMemory(1);\r\n\r\n// vec4_add(srcA, srcB, dst) \u2014 adds two 4-float vectors\r\nmod.defineFunction('vec4_add', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(2)); // push dest address first\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.add_f32x4();\r\n a.store_v128(2, 0); // store expects [addr, value] on stack\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getF32', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { vec4_add, setF32, getF32 } = instance.instance.exports;\r\n\r\n// A = [1, 2, 3, 4] at offset 0\r\n// B = [10, 20, 30, 40] at offset 16\r\nfor (let i = 0; i < 4; i++) {\r\n setF32(i * 4, i + 1);\r\n setF32(16 + i * 4, (i + 1) * 10);\r\n}\r\n\r\nvec4_add(0, 16, 32);\r\n\r\nlog('A = [1, 2, 3, 4]');\r\nlog('B = [10, 20, 30, 40]');\r\nlog('A + B:');\r\nfor (let i = 0; i < 4; i++) {\r\n log(' [' + i + '] = ' + getF32(32 + i * 4));\r\n}`,\r\n },\r\n\r\n 'simd-dot-product': {\r\n label: 'SIMD Dot Product',\r\n group: 'SIMD',\r\n code: `// SIMD dot product: multiply element-wise then sum lanes\r\nconst mod = new webasmjs.ModuleBuilder('simdDot', { disableVerification: true });\r\nmod.defineMemory(1);\r\n\r\nmod.defineFunction('dot4', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const products = a.declareLocal(webasmjs.ValueType.V128, 'products');\r\n\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.mul_f32x4();\r\n a.set_local(products);\r\n\r\n // Sum all 4 lanes\r\n a.get_local(products);\r\n a.extract_lane_f32x4(0);\r\n a.get_local(products);\r\n a.extract_lane_f32x4(1);\r\n a.add_f32();\r\n a.get_local(products);\r\n a.extract_lane_f32x4(2);\r\n a.add_f32();\r\n a.get_local(products);\r\n a.extract_lane_f32x4(3);\r\n a.add_f32();\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { dot4, setF32 } = instance.instance.exports;\r\n\r\nconst vecA = [1, 2, 3, 4];\r\nconst vecB = [5, 6, 7, 8];\r\n\r\nfor (let i = 0; i < 4; i++) {\r\n setF32(i * 4, vecA[i]);\r\n setF32(16 + i * 4, vecB[i]);\r\n}\r\n\r\nlog('A = [' + vecA + ']');\r\nlog('B = [' + vecB + ']');\r\nlog('dot(A, B) = ' + dot4(0, 16));\r\nlog('Expected: ' + (1*5 + 2*6 + 3*7 + 4*8));`,\r\n },\r\n\r\n 'simd-splat-scale': {\r\n label: 'SIMD Splat & Scale',\r\n group: 'SIMD',\r\n code: `// SIMD splat: broadcast a scalar to all lanes, then multiply\r\nconst mod = new webasmjs.ModuleBuilder('simdScale', { disableVerification: true });\r\nmod.defineMemory(1);\r\n\r\n// scale_vec4(src, dst, scalar) \u2014 multiply a vector by a scalar\r\nmod.defineFunction('scale_vec4', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(1)); // push dest address first\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(2));\r\n a.splat_f32x4(); // broadcast scalar to all 4 lanes\r\n a.mul_f32x4();\r\n a.store_v128(2, 0); // store expects [addr, value] on stack\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getF32', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { scale_vec4, setF32, getF32 } = instance.instance.exports;\r\n\r\nconst vec = [2.0, 4.0, 6.0, 8.0];\r\nfor (let i = 0; i < 4; i++) setF32(i * 4, vec[i]);\r\n\r\nscale_vec4(0, 16, 3.0);\r\n\r\nlog('Vector: [' + vec + ']');\r\nlog('Scalar: 3.0');\r\nlog('Scaled:');\r\nfor (let i = 0; i < 4; i++) {\r\n log(' [' + i + '] = ' + getF32(16 + i * 4));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Bulk Memory \u2500\u2500\u2500\r\n 'bulk-memory': {\r\n label: 'Bulk Memory Ops',\r\n group: 'Bulk Memory',\r\n code: `// Bulk memory: memory.fill and memory.copy\r\nconst mod = new webasmjs.ModuleBuilder('bulkMem');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// fill(dest, value, length)\r\nmod.defineFunction('fill', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.get_local(f.getParameter(2));\r\n a.memory_fill(0);\r\n}).withExport();\r\n\r\n// copy(dest, src, length)\r\nmod.defineFunction('copy', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.get_local(f.getParameter(2));\r\n a.memory_copy(0, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { fill, copy, memory } = instance.instance.exports;\r\nconst view = new Uint8Array(memory.buffer);\r\n\r\n// Fill 8 bytes at offset 0 with 0xAA\r\nfill(0, 0xAA, 8);\r\nlog('After fill(0, 0xAA, 8):');\r\nlog(' bytes[0..7] = [' + Array.from(view.slice(0, 8)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']');\r\n\r\n// Copy those 8 bytes to offset 32\r\ncopy(32, 0, 8);\r\nlog('');\r\nlog('After copy(32, 0, 8):');\r\nlog(' bytes[32..39] = [' + Array.from(view.slice(32, 40)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']');\r\n\r\n// Fill a region with incrementing pattern using a loop\r\nfill(64, 0, 16);\r\nfor (let i = 0; i < 16; i++) {\r\n view[64 + i] = i * 3;\r\n}\r\nlog('');\r\nlog('Manual pattern at [64..79]:');\r\nlog(' ' + Array.from(view.slice(64, 80)).join(', '));\r\n\r\n// Copy that pattern further\r\ncopy(128, 64, 16);\r\nlog('Copied to [128..143]:');\r\nlog(' ' + Array.from(view.slice(128, 144)).join(', '));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Post-MVP Features \u2500\u2500\u2500\r\n 'sign-extend': {\r\n label: 'Sign Extension',\r\n group: 'Post-MVP',\r\n code: `// Sign extension: interpret low bits as signed values\r\nconst mod = new webasmjs.ModuleBuilder('signExt');\r\n\r\n// Treat low 8 bits as a signed byte\r\nmod.defineFunction('extend8', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend8_s_i32();\r\n}).withExport();\r\n\r\n// Treat low 16 bits as a signed i16\r\nmod.defineFunction('extend16', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend16_s_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { extend8, extend16 } = instance.instance.exports;\r\n\r\nlog('i32.extend8_s:');\r\nlog(' extend8(0x7F) = ' + extend8(0x7F) + ' (127, positive byte)');\r\nlog(' extend8(0x80) = ' + extend8(0x80) + ' (128 \u2192 -128, sign bit set)');\r\nlog(' extend8(0xFF) = ' + extend8(0xFF) + ' (255 \u2192 -1)');\r\nlog(' extend8(0x100) = ' + extend8(0x100) + ' (256 \u2192 0, wraps to low byte)');\r\nlog('');\r\nlog('i32.extend16_s:');\r\nlog(' extend16(0x7FFF) = ' + extend16(0x7FFF) + ' (32767, positive)');\r\nlog(' extend16(0x8000) = ' + extend16(0x8000) + ' (32768 \u2192 -32768)');\r\nlog(' extend16(0xFFFF) = ' + extend16(0xFFFF) + ' (65535 \u2192 -1)');`,\r\n },\r\n\r\n 'sat-trunc': {\r\n label: 'Saturating Truncation',\r\n group: 'Post-MVP',\r\n code: `// Saturating truncation: float \u2192 int without trapping on overflow\r\nconst mod = new webasmjs.ModuleBuilder('satTrunc');\r\n\r\n// Normal trunc would trap on overflow; saturating clamps instead\r\nmod.defineFunction('sat_f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_sat_f64_s_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('sat_f64_to_u32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_sat_f64_u_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { sat_f64_to_i32, sat_f64_to_u32 } = instance.instance.exports;\r\n\r\nlog('Saturating f64 \u2192 i32 (signed):');\r\nlog(' 42.9 \u2192 ' + sat_f64_to_i32(42.9));\r\nlog(' -42.9 \u2192 ' + sat_f64_to_i32(-42.9));\r\nlog(' 1e20 \u2192 ' + sat_f64_to_i32(1e20) + ' (clamped to i32 max)');\r\nlog(' -1e20 \u2192 ' + sat_f64_to_i32(-1e20) + ' (clamped to i32 min)');\r\nlog(' NaN \u2192 ' + sat_f64_to_i32(NaN) + ' (NaN \u2192 0)');\r\nlog(' Inf \u2192 ' + sat_f64_to_i32(Infinity) + ' (clamped)');\r\nlog('');\r\nlog('Saturating f64 \u2192 u32 (unsigned, shown as signed i32):');\r\nlog(' 42.9 \u2192 ' + sat_f64_to_u32(42.9));\r\nlog(' -1.0 \u2192 ' + sat_f64_to_u32(-1.0) + ' (negative \u2192 0)');\r\nlog(' 1e20 \u2192 ' + sat_f64_to_u32(1e20) + ' (clamped to u32 max)');`,\r\n },\r\n\r\n 'ref-types': {\r\n label: 'Reference Types',\r\n group: 'Post-MVP',\r\n code: `// Reference types: ref.null, ref.is_null, ref.func\r\nconst mod = new webasmjs.ModuleBuilder('refTypes');\r\n\r\nconst double = mod.defineFunction('double', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(2);\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Check if a null funcref is null \u2192 1\r\nmod.defineFunction('isRefNull', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.ref_null(0x70);\r\n a.ref_is_null();\r\n}).withExport();\r\n\r\n// Check if a real function ref is null \u2192 0\r\nmod.defineFunction('isFuncNull', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.ref_func(double);\r\n a.ref_is_null();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isRefNull, isFuncNull } = instance.instance.exports;\r\n\r\nlog('ref.null + ref.is_null:');\r\nlog(' null funcref is null: ' + (isRefNull() === 1));\r\nlog(' real func ref is null: ' + (isFuncNull() === 1));\r\nlog('');\r\nlog('double(21) = ' + instance.instance.exports.double(21));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Debug & Inspection \u2500\u2500\u2500\r\n 'debug-names': {\r\n label: 'Debug Name Section',\r\n group: 'Debug',\r\n code: `// Inspect the debug name section in the binary\r\nconst mod = new webasmjs.ModuleBuilder('debugExample');\r\n\r\nconst g = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\ng.withName('counter');\r\n\r\nmod.defineFunction('add', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n f.getParameter(0).withName('x');\r\n f.getParameter(1).withName('y');\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('addThree', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n f.getParameter(0).withName('a');\r\n f.getParameter(1).withName('b');\r\n f.getParameter(2).withName('c');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n a.get_local(f.getParameter(2));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nconst bytes = mod.toBytes();\r\n\r\nlog('Binary size: ' + bytes.length + ' bytes');\r\nlog('');\r\n\r\n// Read back the name section\r\nconst reader = new webasmjs.BinaryReader(bytes);\r\nconst info = reader.read();\r\nconst ns = info.nameSection;\r\n\r\nif (ns) {\r\n log('Module name: ' + ns.moduleName);\r\n log('');\r\n\r\n if (ns.functionNames) {\r\n log('Function names:');\r\n ns.functionNames.forEach((name, idx) => {\r\n log(' [' + idx + '] ' + name);\r\n });\r\n }\r\n\r\n if (ns.localNames) {\r\n log('');\r\n log('Local/parameter names:');\r\n ns.localNames.forEach((locals, funcIdx) => {\r\n const funcName = ns.functionNames?.get(funcIdx) || 'func' + funcIdx;\r\n log(' ' + funcName + ':');\r\n locals.forEach((name, localIdx) => {\r\n log(' [' + localIdx + '] ' + name);\r\n });\r\n });\r\n }\r\n\r\n if (ns.globalNames) {\r\n log('');\r\n log('Global names:');\r\n ns.globalNames.forEach((name, idx) => {\r\n log(' [' + idx + '] ' + name);\r\n });\r\n }\r\n} else {\r\n log('No name section found!');\r\n}`,\r\n },\r\n\r\n 'binary-inspect': {\r\n label: 'Binary Inspector',\r\n group: 'Debug',\r\n code: `// Inspect the binary structure of a WASM module\r\nconst mod = new webasmjs.ModuleBuilder('inspect');\r\nmod.defineMemory(1);\r\n\r\nconst counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\nmod.defineFunction('add', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('noop', null, [], (f, a) => {\r\n a.nop();\r\n}).withExport();\r\n\r\nconst bytes = mod.toBytes();\r\n\r\nlog('=== Binary Analysis ===');\r\nlog('Total size: ' + bytes.length + ' bytes');\r\nlog('');\r\n\r\n// Read with BinaryReader\r\nconst reader = new webasmjs.BinaryReader(bytes);\r\nconst info = reader.read();\r\n\r\nlog('WASM version: ' + info.version);\r\nlog('Types: ' + info.types.length);\r\ninfo.types.forEach((t, i) => {\r\n const params = t.parameterTypes.map(p => p.name).join(', ');\r\n const results = t.returnTypes.map(r => r.name).join(', ');\r\n log(' [' + i + '] (' + params + ') -> (' + results + ')');\r\n});\r\n\r\nlog('Functions: ' + info.functions.length);\r\ninfo.functions.forEach((f, i) => {\r\n log(' [' + i + '] type=' + f.typeIndex + ', locals=' + f.locals.length + ', body=' + f.body.length + ' bytes');\r\n});\r\n\r\nlog('Memories: ' + info.memories.length);\r\ninfo.memories.forEach((m, i) => {\r\n log(' [' + i + '] initial=' + m.initial + ' pages (' + (m.initial * 64) + ' KB)');\r\n});\r\n\r\nlog('Globals: ' + info.globals.length);\r\ninfo.globals.forEach((g, i) => {\r\n log(' [' + i + '] mutable=' + g.mutable);\r\n});\r\n\r\nlog('Exports: ' + info.exports.length);\r\ninfo.exports.forEach((e) => {\r\n const kinds = ['function', 'table', 'memory', 'global'];\r\n log(' \"' + e.name + '\" -> ' + (kinds[e.kind] || 'unknown') + '[' + e.index + ']');\r\n});\r\n\r\nlog('');\r\nlog('Valid: ' + WebAssembly.validate(bytes.buffer));`,\r\n },\r\n\r\n 'wat-roundtrip': {\r\n label: 'WAT Roundtrip',\r\n group: 'Debug',\r\n code: `// Build a module programmatically, inspect WAT, parse it back\r\nconst mod = new webasmjs.ModuleBuilder('roundtrip');\r\n\r\nmod.defineFunction('multiply', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('negate', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.const_i32(0);\r\n a.get_local(f.getParameter(0));\r\n a.sub_i32();\r\n}).withExport();\r\n\r\n// Get WAT text\r\nconst watText = mod.toString();\r\nlog('=== Generated WAT ===');\r\nlog(watText);\r\n\r\n// Parse it back\r\nlog('');\r\nlog('=== Parsing WAT back... ===');\r\nconst mod2 = webasmjs.parseWat(watText);\r\n\r\n// Instantiate and test\r\nconst instance = await mod2.instantiate();\r\nconst { multiply, negate } = instance.instance.exports;\r\n\r\nlog('multiply(6, 7) = ' + multiply(6, 7));\r\nlog('multiply(100, -3) = ' + multiply(100, -3));\r\nlog('negate(42) = ' + negate(42));\r\nlog('negate(-10) = ' + negate(-10));\r\nlog('');\r\nlog('Roundtrip successful!');`,\r\n },\r\n};\r\n\r\n// \u2500\u2500\u2500 UI helpers \u2500\u2500\u2500\r\n\r\nconst GROUP_ICONS: Record = {\r\n Basics: '\\u{1F44B}',\r\n Memory: '\\u{1F4BE}',\r\n Globals: '\\u{1F30D}',\r\n Functions: '\\u{1F517}',\r\n Numeric: '\\u{1F522}',\r\n Algorithms: '\\u{2699}',\r\n SIMD: '\\u{26A1}',\r\n 'Bulk Memory': '\\u{1F4E6}',\r\n 'Post-MVP': '\\u{1F680}',\r\n WAT: '\\u{1F4DD}',\r\n Debug: '\\u{1F50D}',\r\n};\r\n\r\nfunction getEditor(): HTMLTextAreaElement {\r\n return document.getElementById('editor') as HTMLTextAreaElement;\r\n}\r\n\r\nfunction getWatOutput(): HTMLElement {\r\n return document.getElementById('watOutput') as HTMLElement;\r\n}\r\n\r\nfunction getRunOutput(): HTMLElement {\r\n return document.getElementById('runOutput') as HTMLElement;\r\n}\r\n\r\nfunction clearOutput(el: HTMLElement): void {\r\n el.textContent = '';\r\n}\r\n\r\nfunction appendOutput(el: HTMLElement, text: string, className?: string): void {\r\n const line = document.createElement('div');\r\n line.textContent = text;\r\n if (className) line.className = className;\r\n el.appendChild(line);\r\n}\r\n\r\nlet currentExampleKey = 'hello-wasm';\r\n\r\nfunction loadExample(name: string): void {\r\n const example = EXAMPLES[name];\r\n if (example) {\r\n currentExampleKey = name;\r\n getEditor().value = example.code;\r\n clearOutput(getWatOutput());\r\n clearOutput(getRunOutput());\r\n const label = document.getElementById('currentExample');\r\n if (label) label.textContent = example.label;\r\n }\r\n}\r\n\r\n// \u2500\u2500\u2500 Example picker dialog \u2500\u2500\u2500\r\n\r\nfunction openExamplePicker(): void {\r\n // Prevent duplicates\r\n const existing = document.getElementById('exampleDialog');\r\n if (existing) existing.remove();\r\n\r\n const overlay = document.createElement('div');\r\n overlay.id = 'exampleDialog';\r\n overlay.className = 'dialog-overlay';\r\n\r\n const dialog = document.createElement('div');\r\n dialog.className = 'dialog';\r\n\r\n // Header with search\r\n const header = document.createElement('div');\r\n header.className = 'dialog-header';\r\n header.innerHTML = '

Examples

';\r\n\r\n const searchInput = document.createElement('input');\r\n searchInput.type = 'text';\r\n searchInput.placeholder = 'Search examples...';\r\n searchInput.className = 'dialog-search';\r\n header.appendChild(searchInput);\r\n dialog.appendChild(header);\r\n\r\n // Build grouped grid\r\n const body = document.createElement('div');\r\n body.className = 'dialog-body';\r\n\r\n const groups = new Map();\r\n for (const [key, example] of Object.entries(EXAMPLES)) {\r\n const group = example.group;\r\n if (!groups.has(group)) groups.set(group, []);\r\n // Extract first line of code as description\r\n const firstComment = example.code.split('\\n')[0].replace(/^\\/\\/\\s*/, '');\r\n groups.get(group)!.push({ key, label: example.label, desc: firstComment });\r\n }\r\n\r\n const allCards: HTMLElement[] = [];\r\n const allSections: HTMLElement[] = [];\r\n\r\n for (const [groupName, items] of groups) {\r\n const section = document.createElement('div');\r\n section.className = 'dialog-group';\r\n section.dataset.group = groupName;\r\n\r\n const groupHeader = document.createElement('div');\r\n groupHeader.className = 'dialog-group-header';\r\n const icon = GROUP_ICONS[groupName] || '';\r\n groupHeader.textContent = `${icon} ${groupName}`;\r\n section.appendChild(groupHeader);\r\n\r\n const grid = document.createElement('div');\r\n grid.className = 'dialog-grid';\r\n\r\n for (const item of items) {\r\n const card = document.createElement('button');\r\n card.className = 'dialog-card';\r\n if (item.key === currentExampleKey) card.classList.add('active');\r\n card.dataset.key = item.key;\r\n card.dataset.search = `${item.label} ${item.desc} ${groupName}`.toLowerCase();\r\n\r\n const title = document.createElement('div');\r\n title.className = 'dialog-card-title';\r\n title.textContent = item.label;\r\n card.appendChild(title);\r\n\r\n const desc = document.createElement('div');\r\n desc.className = 'dialog-card-desc';\r\n desc.textContent = item.desc;\r\n card.appendChild(desc);\r\n\r\n card.addEventListener('click', () => {\r\n loadExample(item.key);\r\n overlay.remove();\r\n });\r\n\r\n grid.appendChild(card);\r\n allCards.push(card);\r\n }\r\n\r\n section.appendChild(grid);\r\n body.appendChild(section);\r\n allSections.push(section);\r\n }\r\n\r\n dialog.appendChild(body);\r\n overlay.appendChild(dialog);\r\n document.body.appendChild(overlay);\r\n\r\n // Search filtering\r\n searchInput.addEventListener('input', () => {\r\n const q = searchInput.value.toLowerCase().trim();\r\n for (const card of allCards) {\r\n const match = !q || card.dataset.search!.includes(q);\r\n (card as HTMLElement).style.display = match ? '' : 'none';\r\n }\r\n // Hide groups with no visible cards\r\n for (const section of allSections) {\r\n const visibleCards = section.querySelectorAll('.dialog-card:not([style*=\"display: none\"])');\r\n (section as HTMLElement).style.display = visibleCards.length > 0 ? '' : 'none';\r\n }\r\n });\r\n\r\n // Close on overlay click\r\n overlay.addEventListener('click', (e) => {\r\n if (e.target === overlay) overlay.remove();\r\n });\r\n\r\n // Close on Escape\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n overlay.remove();\r\n document.removeEventListener('keydown', onKey);\r\n }\r\n };\r\n document.addEventListener('keydown', onKey);\r\n\r\n // Focus search\r\n setTimeout(() => searchInput.focus(), 50);\r\n}\r\n\r\n// Expose library globally for eval'd code\r\n(window as any).webasmjs = {\r\n ModuleBuilder,\r\n ValueType,\r\n BlockType,\r\n ElementType,\r\n TextModuleWriter,\r\n BinaryReader,\r\n parseWat,\r\n};\r\n\r\nasync function run(): Promise {\r\n const watEl = getWatOutput();\r\n const runEl = getRunOutput();\r\n clearOutput(watEl);\r\n clearOutput(runEl);\r\n\r\n const code = getEditor().value;\r\n\r\n // Capture log calls\r\n const log = (msg: any) => {\r\n appendOutput(runEl, String(msg));\r\n };\r\n\r\n // Intercept ModuleBuilder to capture WAT before instantiate\r\n const OrigModuleBuilder = ModuleBuilder;\r\n const patchedClass = class extends OrigModuleBuilder {\r\n async instantiate(imports?: WebAssembly.Imports) {\r\n try {\r\n const wat = this.toString();\r\n appendOutput(watEl, wat);\r\n } catch (e: any) {\r\n appendOutput(watEl, 'Error generating WAT: ' + e.message, 'error');\r\n }\r\n return super.instantiate(imports);\r\n }\r\n };\r\n (window as any).webasmjs.ModuleBuilder = patchedClass;\r\n\r\n try {\r\n const asyncFn = new Function('log', 'webasmjs', `return (async () => {\\n${code}\\n})();`);\r\n await asyncFn(log, (window as any).webasmjs);\r\n appendOutput(runEl, '\\n--- Done ---');\r\n } catch (e: any) {\r\n appendOutput(runEl, 'Error: ' + e.message, 'error');\r\n if (e.stack) {\r\n appendOutput(runEl, e.stack, 'error');\r\n }\r\n } finally {\r\n (window as any).webasmjs.ModuleBuilder = OrigModuleBuilder;\r\n }\r\n}\r\n\r\n// Initialize\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n document.getElementById('examplesBtn')!.addEventListener('click', openExamplePicker);\r\n document.getElementById('runBtn')!.addEventListener('click', run);\r\n\r\n // Ctrl/Cmd+Enter to run\r\n getEditor().addEventListener('keydown', (e: KeyboardEvent) => {\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\r\n e.preventDefault();\r\n run();\r\n }\r\n });\r\n\r\n // Load default example\r\n loadExample('hello-wasm');\r\n});\r\n"], "mappings": "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", "names": ["MagicHeader", "index"] } diff --git a/playground/playground.ts b/playground/playground.ts index 9e734ba..4054bf4 100644 --- a/playground/playground.ts +++ b/playground/playground.ts @@ -1203,7 +1203,7 @@ log('Final: ' + getCounter());`, label: 'SIMD Vector Add', group: 'SIMD', code: `// SIMD: add two f32x4 vectors in memory -const mod = new webasmjs.ModuleBuilder('simdAdd', { disableVerification: true }); +const mod = new webasmjs.ModuleBuilder('simdAdd'); mod.defineMemory(1); // vec4_add(srcA, srcB, dst) — adds two 4-float vectors @@ -1255,7 +1255,7 @@ for (let i = 0; i < 4; i++) { label: 'SIMD Dot Product', group: 'SIMD', code: `// SIMD dot product: multiply element-wise then sum lanes -const mod = new webasmjs.ModuleBuilder('simdDot', { disableVerification: true }); +const mod = new webasmjs.ModuleBuilder('simdDot'); mod.defineMemory(1); mod.defineFunction('dot4', [webasmjs.ValueType.Float32], @@ -1311,7 +1311,7 @@ log('Expected: ' + (1*5 + 2*6 + 3*7 + 4*8));`, label: 'SIMD Splat & Scale', group: 'SIMD', code: `// SIMD splat: broadcast a scalar to all lanes, then multiply -const mod = new webasmjs.ModuleBuilder('simdScale', { disableVerification: true }); +const mod = new webasmjs.ModuleBuilder('simdScale'); mod.defineMemory(1); // scale_vec4(src, dst, scalar) — multiply a vector by a scalar diff --git a/src/OpCodes.ts b/src/OpCodes.ts index 0b3cdda..8ea3a07 100644 --- a/src/OpCodes.ts +++ b/src/OpCodes.ts @@ -95,7 +95,7 @@ const OpCodes = { value: 27, mnemonic: "select", stackBehavior: "PopPush", - popOperands: ["Int32","Any","Any"] as const, + popOperands: ["Any","Any","Int32"] as const, pushOperands: ["Any"] as const, }, "get_local": { diff --git a/src/verification/OperandStackVerifier.ts b/src/verification/OperandStackVerifier.ts index 5f563ac..5a75025 100644 --- a/src/verification/OperandStackVerifier.ts +++ b/src/verification/OperandStackVerifier.ts @@ -147,8 +147,8 @@ export default class OperandStackVerifier { for (let index = 0; index < remaining.length; index++) { if (remaining[index] !== this._funcType.returnTypes[index]) { errorMessage = - `A ${this._funcType.returnTypes[index]} was expected at ${remaining.length - index} ` + - `but a ${remaining[index]} was found. `; + `A ${this._funcType.returnTypes[index].name} was expected at ${remaining.length - index} ` + + `but a ${remaining[index].name} was found. `; } } @@ -213,32 +213,43 @@ export default class OperandStackVerifier { opCode: OpCodeDef, funcType: FuncTypeBuilder | null ): OperandStack { - if (funcType) { - stack = funcType.parameterTypes.reduce((i, x) => { - if (x !== i.valueType) { - throw new VerificationError( - `Unexpected type found on stack at offset ${this._instructionCount + 1}. ` + - `A ${x} was expected but a ${i.valueType} was found.` - ); - } - return i.pop(); - }, stack); - } - - stack = (opCode.popOperands || []).reduce((i, x) => { + // Pop popOperands first (e.g. call_indirect's table index sits on top of params). + // Iterate in reverse because the array is in push order (bottom-to-top) + // but we pop from the top of the stack. + const pops = opCode.popOperands || []; + for (let idx = pops.length - 1; idx >= 0; idx--) { + const x = pops[idx]; if (x === OperandStackType.Any) { - return i.pop(); + stack = stack.pop(); + continue; } const valueType = (ValueType as any)[x] as ValueTypeDescriptor; - if (valueType !== i.valueType) { + if (valueType !== stack.valueType) { throw new VerificationError( `Unexpected type found on stack at offset ${this._instructionCount + 1}. ` + - `A ${valueType} was expected but a ${i.valueType} was found.` + `A ${valueType.name} was expected but a ${stack.valueType.name} was found.` ); } - return i.pop(); - }, stack); + stack = stack.pop(); + } + + // Then pop function parameter types (for call / call_indirect). + // Iterate in reverse because parameters are pushed in declaration order + // (param 0 at bottom, last param on top). + if (funcType) { + const params = funcType.parameterTypes; + for (let idx = params.length - 1; idx >= 0; idx--) { + const x = params[idx]; + if (x !== stack.valueType) { + throw new VerificationError( + `Unexpected type found on stack at offset ${this._instructionCount + 1}. ` + + `A ${x.name} was expected but a ${stack.valueType.name} was found.` + ); + } + stack = stack.pop(); + } + } return stack; } diff --git a/tests/VerifierFix.test.ts b/tests/VerifierFix.test.ts new file mode 100644 index 0000000..c102e57 --- /dev/null +++ b/tests/VerifierFix.test.ts @@ -0,0 +1,268 @@ +import { ModuleBuilder, ValueType, ElementType } from '../src/index'; + +// These tests verify the operand stack verifier works correctly with +// heterogeneous types (the fix for pop order and funcType parameter order). + +describe('Verifier: store with heterogeneous types', () => { + test('f32.store with verification enabled', async () => { + const mod = new ModuleBuilder('test'); // verification enabled by default + mod.defineMemory(1); + + mod.defineFunction('store_f32', null, + [ValueType.Int32, ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); // addr (i32) + a.get_local(f.getParameter(1)); // value (f32) + a.store_f32(2, 0); + }).withExport(); + + mod.defineFunction('load_f32', [ValueType.Float32], + [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_f32(2, 0); + }).withExport(); + + const instance = await mod.instantiate(); + const { store_f32, load_f32 } = instance.instance.exports as any; + store_f32(0, 3.14); + expect(load_f32(0)).toBeCloseTo(3.14, 2); + }); + + test('f64.store with verification enabled', async () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + + mod.defineFunction('store_f64', null, + [ValueType.Int32, ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_f64(3, 0); + }).withExport(); + + mod.defineFunction('load_f64', [ValueType.Float64], + [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_f64(3, 0); + }).withExport(); + + const instance = await mod.instantiate(); + const { store_f64, load_f64 } = instance.instance.exports as any; + store_f64(0, 2.718281828); + expect(load_f64(0)).toBeCloseTo(2.718281828); + }); + + test('i64.store with verification enabled', async () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + + mod.defineFunction('store_i64', null, + [ValueType.Int32, ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i64(3, 0); + }).withExport(); + + mod.defineFunction('load_i64', [ValueType.Int64], + [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i64(3, 0); + }).withExport(); + + const instance = await mod.instantiate(); + const { store_i64, load_i64 } = instance.instance.exports as any; + store_i64(0, 0x123456789ABCDEFn); + expect(load_i64(0)).toBe(0x123456789ABCDEFn); + }); +}); + +describe('Verifier: SIMD with verification enabled', () => { + test('v128 load/store/add', async () => { + const mod = new ModuleBuilder('test'); // verification ON + mod.defineMemory(1); + + mod.defineFunction('vec4_add', null, + [ValueType.Int32, ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); // dest addr + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.add_f32x4(); + a.store_v128(2, 0); + }).withExport(); + + mod.defineFunction('setF32', null, + [ValueType.Int32, ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_f32(2, 0); + }).withExport(); + + mod.defineFunction('getF32', [ValueType.Float32], + [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_f32(2, 0); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const { vec4_add, setF32, getF32 } = instance.instance.exports as any; + for (let i = 0; i < 4; i++) { + setF32(i * 4, i + 1); + setF32(16 + i * 4, (i + 1) * 10); + } + vec4_add(0, 16, 32); + expect(getF32(32)).toBeCloseTo(11); + expect(getF32(36)).toBeCloseTo(22); + expect(getF32(40)).toBeCloseTo(33); + expect(getF32(44)).toBeCloseTo(44); + }); + + test('SIMD dot product with verification enabled', async () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + + mod.defineFunction('dot4', [ValueType.Float32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + const products = a.declareLocal(ValueType.V128, 'products'); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.mul_f32x4(); + a.set_local(products); + a.get_local(products); + a.extract_lane_f32x4(0); + a.get_local(products); + a.extract_lane_f32x4(1); + a.add_f32(); + a.get_local(products); + a.extract_lane_f32x4(2); + a.add_f32(); + a.get_local(products); + a.extract_lane_f32x4(3); + a.add_f32(); + }).withExport(); + + mod.defineFunction('setF32', null, + [ValueType.Int32, ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_f32(2, 0); + }).withExport(); + + const instance = await mod.instantiate(); + const { dot4, setF32 } = instance.instance.exports as any; + const vecA = [1, 2, 3, 4]; + const vecB = [5, 6, 7, 8]; + for (let i = 0; i < 4; i++) { + setF32(i * 4, vecA[i]); + setF32(16 + i * 4, vecB[i]); + } + expect(dot4(0, 16)).toBeCloseTo(70); + }); + + test('SIMD splat, replace_lane, extract_lane with verification', () => { + const mod = new ModuleBuilder('test'); + + mod.defineFunction('test', [ValueType.Float32], [], (f, a) => { + a.const_f32(3.14); + a.splat_f32x4(); + a.const_f32(99.0); + a.replace_lane_f32x4(2); + a.extract_lane_f32x4(2); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); + + test('SIMD shift (v128 + i32 operands) with verification', () => { + const mod = new ModuleBuilder('test'); + + mod.defineFunction('test', null, [], (f, a) => { + a.const_i32(42); + a.splat_i32x4(); + a.const_i32(2); + a.shl_i32x4(); + a.drop(); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); +}); + +describe('Verifier: select with heterogeneous types', () => { + test('select with f64 values and i32 condition', async () => { + const mod = new ModuleBuilder('test'); + + mod.defineFunction('selF64', [ValueType.Float64], + [ValueType.Float64, ValueType.Float64, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // val1 (f64) + a.get_local(f.getParameter(1)); // val2 (f64) + a.get_local(f.getParameter(2)); // condition (i32) + a.select(); + }).withExport(); + + const instance = await mod.instantiate(); + const { selF64 } = instance.instance.exports as any; + expect(selF64(1.5, 2.5, 1)).toBe(1.5); + expect(selF64(1.5, 2.5, 0)).toBe(2.5); + }); +}); + +describe('Verifier: bulk memory with verification enabled', () => { + test('memory.fill and memory.copy', async () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + + mod.defineFunction('test_fill', [ValueType.Int32], [], (f, a) => { + a.const_i32(0); // dest + a.const_i32(0xAB); // value + a.const_i32(4); // length + a.memory_fill(0); + a.const_i32(0); + a.load_i32(0, 0); + }).withExport(); + + mod.defineFunction('test_copy', [ValueType.Int32], [], (f, a) => { + a.const_i32(0); a.const_i32(42); a.store_i32(0, 0); + a.const_i32(16); // dest + a.const_i32(0); // src + a.const_i32(4); // length + a.memory_copy(0, 0); + a.const_i32(16); + a.load_i32(0, 0); + }).withExport(); + + const instance = await mod.instantiate(); + const exports = instance.instance.exports as any; + expect(exports.test_fill()).toBe(0xABABABAB | 0); + expect(exports.test_copy()).toBe(42); + }); +}); + +describe('Verifier: reference types with verification enabled', () => { + test('ref.null, ref.is_null, ref.func', async () => { + const mod = new ModuleBuilder('test'); + + const target = mod.defineFunction('target', null, [], (f, a) => {}).withExport(); + + mod.defineFunction('test_ref_null', [ValueType.Int32], [], (f, a) => { + a.ref_null(0x70); + a.ref_is_null(); + }).withExport(); + + mod.defineFunction('test_ref_func', [ValueType.Int32], [], (f, a) => { + a.ref_func(target); + a.ref_is_null(); + }).withExport(); + + const instance = await mod.instantiate(); + const exports = instance.instance.exports as any; + expect(exports.test_ref_null()).toBe(1); + expect(exports.test_ref_func()).toBe(0); + }); +}); diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo new file mode 100644 index 0000000..a6b8337 --- /dev/null +++ b/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/arg.ts","./src/assemblyemitter.ts","./src/binarymodulewriter.ts","./src/binaryreader.ts","./src/binarywriter.ts","./src/customsectionbuilder.ts","./src/datasegmentbuilder.ts","./src/elementsegmentbuilder.ts","./src/exportbuilder.ts","./src/functypebuilder.ts","./src/functypesignature.ts","./src/functionbuilder.ts","./src/functionemitter.ts","./src/functionparameterbuilder.ts","./src/globalbuilder.ts","./src/globaltype.ts","./src/immediate.ts","./src/immediateencoder.ts","./src/importbuilder.ts","./src/initexpressionemitter.ts","./src/instruction.ts","./src/labelbuilder.ts","./src/localbuilder.ts","./src/memorybuilder.ts","./src/memorytype.ts","./src/modulebuilder.ts","./src/opcodeemitter.ts","./src/opcodes.ts","./src/packagebuilder.ts","./src/resizablelimits.ts","./src/tablebuilder.ts","./src/tabletype.ts","./src/textmodulewriter.ts","./src/watparser.ts","./src/index.ts","./src/types.ts","./src/verification/controlflowblock.ts","./src/verification/controlflowverifier.ts","./src/verification/operandstack.ts","./src/verification/operandstackverifier.ts","./src/verification/verificationerror.ts","./src/verification/types.ts"],"version":"5.9.3"} \ No newline at end of file From 762a5fe0b6ef70d49f160b8ef3ae8969c64b873d Mon Sep 17 00:00:00 2001 From: zelmalki Date: Mon, 23 Feb 2026 23:03:33 -0800 Subject: [PATCH 2/3] - Expand from 172 to 531 opcodes (SIMD, atomics, bulk memory, reference types, tail calls, relaxed SIMD, exception handling, memory64, extended-const) - Add feature/target system (mvp, 2.0, 3.0, latest) with verification - Add WAT parser, exception handling, extended constant expressions - Add interactive playground with 65 examples, search/filter, split-view editor - Add 25 new test suites (1732 total tests) - Add CI workflows and docs --- README.md | 29 +- docs/api.md | 91 +- docs/examples.md | 990 ++ docs/getting-started.md | 27 + generator/index.ts | 228 +- generator/opcodes.csv | 437 - generator/opcodes.json | 15 + generator/opcodes/bulk-memory.json | 120 + generator/opcodes/core.json | 3103 +++++ generator/opcodes/exception-handling.json | 86 + generator/opcodes/reference-types.json | 140 + generator/opcodes/relaxed-simd.json | 387 + generator/opcodes/sat-trunc.json | 146 + generator/opcodes/sign-extend.json | 92 + generator/opcodes/simd.json | 4388 +++++++ generator/opcodes/tail-call.json | 32 + generator/opcodes/threads.json | 1258 ++ generator/split-opcodes.ts | 68 + package.json | 3 +- playground/build.ts | 19 +- playground/index.html | 244 +- playground/playground.bundle.js | 12667 +++++++++++++------- playground/playground.bundle.js.map | 6 +- playground/playground.ts | 2667 ++++- src/BinaryModuleWriter.ts | 5 + src/BinaryReader.ts | 14 +- src/DataSegmentBuilder.ts | 38 +- src/ElementSegmentBuilder.ts | 61 +- src/FuncTypeBuilder.ts | 2 +- src/GlobalBuilder.ts | 3 +- src/InitExpressionEmitter.ts | 38 +- src/MemoryBuilder.ts | 12 +- src/MemoryType.ts | 26 +- src/ModuleBuilder.ts | 71 +- src/OpCodeEmitter.ts | 380 + src/OpCodes.ts | 901 +- src/TagBuilder.ts | 37 + src/TextModuleWriter.ts | 56 +- src/types.ts | 16 +- src/verification/OperandStackVerifier.ts | 4 +- tests/AdvancedOps.test.ts | 348 + tests/BinaryFormat.test.ts | 198 +- tests/BinaryReader.test.ts | 199 + tests/BinaryWriter.test.ts | 30 + tests/ControlVerification.test.ts | 596 + tests/Data.test.ts | 75 +- tests/ErrorPaths.test.ts | 113 +- tests/Example.test.ts | 207 +- tests/ExceptionHandling.test.ts | 70 + tests/Features.test.ts | 372 + tests/Global.test.ts | 73 +- tests/ImmediateEncoder.test.ts | 41 +- tests/Import.test.ts | 4 +- tests/InitExpressionEmitter.test.ts | 57 + tests/Memory.test.ts | 10 +- tests/Memory64.test.ts | 49 + tests/ModuleBuilder.test.ts | 51 +- tests/PackageBuilder.test.ts | 82 + tests/RelaxedSimd.test.ts | 16 + tests/SimdLaneOps.test.ts | 374 + tests/StackVerification.test.ts | 464 +- tests/TextModuleWriter.test.ts | 151 + tests/ThreadsAndSharedMemory.test.ts | 123 + tests/WatParser.test.ts | 931 +- tests/generated/OpCodes.test.ts | 6756 +++++++++++ tsconfig.tsbuildinfo | 2 +- 66 files changed, 35240 insertions(+), 5059 deletions(-) delete mode 100644 generator/opcodes.csv create mode 100644 generator/opcodes.json create mode 100644 generator/opcodes/bulk-memory.json create mode 100644 generator/opcodes/core.json create mode 100644 generator/opcodes/exception-handling.json create mode 100644 generator/opcodes/reference-types.json create mode 100644 generator/opcodes/relaxed-simd.json create mode 100644 generator/opcodes/sat-trunc.json create mode 100644 generator/opcodes/sign-extend.json create mode 100644 generator/opcodes/simd.json create mode 100644 generator/opcodes/tail-call.json create mode 100644 generator/opcodes/threads.json create mode 100644 generator/split-opcodes.ts create mode 100644 src/TagBuilder.ts create mode 100644 tests/AdvancedOps.test.ts create mode 100644 tests/ExceptionHandling.test.ts create mode 100644 tests/Features.test.ts create mode 100644 tests/InitExpressionEmitter.test.ts create mode 100644 tests/Memory64.test.ts create mode 100644 tests/RelaxedSimd.test.ts create mode 100644 tests/SimdLaneOps.test.ts create mode 100644 tests/ThreadsAndSharedMemory.test.ts create mode 100644 tests/generated/OpCodes.test.ts diff --git a/README.md b/README.md index 7dd34eb..f2808db 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,20 @@ TypeScript library for programmatically generating WebAssembly modules. Build WA ## Features - Fluent builder pattern for constructing WASM modules -- Full instruction set — arithmetic, control flow, memory, tables, globals -- i32, i64, f32, f64 value types with BigInt support for i64 +- **531 instructions** — arithmetic, control flow, memory, tables, globals, SIMD, atomics, exception handling +- **Target system** — `mvp`, `2.0`, `3.0`, `latest` with automatic feature gating +- i32, i64, f32, f64, v128 value types with BigInt support for i64 +- **128-bit SIMD** — 236 vector instructions + 20 relaxed SIMD +- **Threads & atomics** — shared memory, 67 atomic operations +- **Exception handling** — tags, throw, try/catch/rethrow +- **Memory64** — 64-bit addressed memory +- Tail calls, multi-value returns, bulk memory, reference types - Function imports/exports with host interop - Memory and table management with import/export -- WAT text format output via `TextModuleWriter` -- WAT text format parsing via `parseWat()` +- WAT text format output and parsing - Binary reader for inspecting compiled modules - Compile-time verification (control flow + operand stack) -- Debug name section generation +- Data-driven — opcodes generated from `generator/opcodes.json` - Zero production dependencies ## Install @@ -53,6 +58,8 @@ The entry point for building a module. Create an instance, define functions/memo ```typescript const mod = new ModuleBuilder('myModule', { + target: 'latest', // 'mvp' | '2.0' | '3.0' | 'latest' + features: [], // additional features beyond target generateNameSection: true, disableVerification: false, }); @@ -120,10 +127,16 @@ const instance = await mod.instantiate({ ### Memory ```typescript -const mem = mod.defineMemory(1, 4); // 1 page initial, 4 max (64KB per page) +const mem = mod.defineMemory(1, 4); // 1 page initial, 4 max (64KB per page) mod.exportMemory(mem, 'memory'); -// Or import memory +// Shared memory (for threads/atomics — requires maximum size) +const shared = mod.defineMemory(1, 10, true); // shared = true + +// 64-bit addressed memory +const mem64 = mod.defineMemory(1, 100, false, true); // memory64 = true + +// Import memory mod.importMemory('env', 'mem', 1, 4); ``` @@ -152,7 +165,7 @@ See the [API Reference](docs/api.md) for complete documentation. ## Playground -Try webasmjs in the browser with the [interactive playground](https://devnamedzed.github.io/webasmjs/). It includes examples for arithmetic, control flow, memory, tables, imports, floating point, i64/BigInt, algorithms, and WAT parsing. +Try webasmjs in the browser with the [interactive playground](https://devnamedzed.github.io/webasmjs/). It includes 40+ examples covering arithmetic, control flow, memory, tables, imports, floating point, i64/BigInt, SIMD, algorithms, WAT parsing, and post-MVP features. To run the playground locally: diff --git a/docs/api.md b/docs/api.md index 92e37f4..639e28e 100644 --- a/docs/api.md +++ b/docs/api.md @@ -16,6 +16,8 @@ new ModuleBuilder(name: string, options?: ModuleBuilderOptions) |--------|------|---------|-------------| | `generateNameSection` | `boolean` | `true` | Include debug name section in output | | `disableVerification` | `boolean` | `false` | Skip control flow and operand stack verification | +| `target` | `WasmTarget` | `'latest'` | WebAssembly target: `'mvp'`, `'2.0'`, `'3.0'`, or `'latest'` | +| `features` | `WasmFeature[]` | `[]` | Additional feature flags beyond those included by the target | ### Methods @@ -49,7 +51,7 @@ importFunction( ): ImportBuilder // Import memory -importMemory(module: string, name: string, initial: number, maximum?: number): void +importMemory(module: string, name: string, initial: number, maximum?: number, shared?: boolean): ImportBuilder // Import a table importTable( @@ -69,6 +71,13 @@ importGlobal( ): ImportBuilder ``` +#### Tags + +```typescript +// Define an exception tag +defineTag(parameters: ValueType[]): TagBuilder +``` + #### Exports ```typescript @@ -81,7 +90,7 @@ exportGlobal(global: GlobalBuilder, name: string): void #### Memory ```typescript -defineMemory(initial: number, maximum?: number): MemoryBuilder +defineMemory(initial: number, maximum?: number, shared?: boolean, memory64?: boolean): MemoryBuilder defineData(data: Uint8Array, offset: number): DataSegmentBuilder ``` @@ -96,6 +105,13 @@ defineTableSegment( ): ElementSegmentBuilder ``` +#### Passive Element Segments + +```typescript +// Define a passive element segment (for use with table.init) +definePassiveElementSegment(elements: FunctionBuilder[]): ElementSegmentBuilder +``` + #### Globals ```typescript @@ -121,6 +137,13 @@ instantiate(imports?: WebAssembly.Imports): Promise { + const dividend = f.getParameter(0); + const divisor = f.getParameter(1); + + // quotient + a.get_local(dividend); + a.get_local(divisor); + a.div_s_i32(); + + // remainder + a.get_local(dividend); + a.get_local(divisor); + a.rem_s_i32(); +}).withExport(); + +const instance = await mod.instantiate(); +const divmod = instance.instance.exports.divmod as Function; + +const [quotient, remainder] = divmod(17, 5); +console.log(`17 / 5 = ${quotient} remainder ${remainder}`); // 17 / 5 = 3 remainder 2 +``` + +## Mutable Global Export + +Export a mutable global so JavaScript can read it: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('mutableGlobal'); + +const counter = mod.defineGlobal(ValueType.Int32, true, 0); +mod.exportGlobal(counter, 'counter'); + +mod.defineFunction('increment', null, [], (f, a) => { + a.get_global(counter); + a.const_i32(1); + a.add_i32(); + a.set_global(counter); +}).withExport(); + +const instance = await mod.instantiate(); +const { increment, counter: counterGlobal } = instance.instance.exports as any; + +console.log(counterGlobal.value); // 0 +increment(); +increment(); +increment(); +console.log(counterGlobal.value); // 3 +``` + +## Tail Calls + +Tail-recursive factorial using `return_call` — no stack overflow for deep recursion: + +```typescript +import { ModuleBuilder, ValueType, BlockType } from 'webasmjs'; + +const mod = new ModuleBuilder('tailCall'); + +// Helper: tail-recursive accumulator +const factHelper = mod.defineFunction('fact_helper', [ValueType.Int64], + [ValueType.Int64, ValueType.Int64], (f, a) => { + const n = f.getParameter(0); + const acc = f.getParameter(1); + + // if n <= 1, return acc + a.get_local(n); + a.const_i64(1n); + a.le_s_i64(); + a.if(BlockType.Void, () => { + a.get_local(acc); + a.return(); + }); + + // return_call fact_helper(n - 1, n * acc) + a.get_local(n); + a.const_i64(1n); + a.sub_i64(); + a.get_local(n); + a.get_local(acc); + a.mul_i64(); + a.return_call(factHelper); +}); + +// Public entry point +mod.defineFunction('factorial', [ValueType.Int64], [ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i64(1n); + a.call(factHelper); +}).withExport(); + +const instance = await mod.instantiate(); +const factorial = instance.instance.exports.factorial as Function; + +console.log(factorial(20n)); // 2432902008176640000n +``` + +## Shared Memory and Atomics + +Use shared memory with atomic operations for thread-safe access: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('atomics'); + +// Shared memory requires both initial and maximum size +const mem = mod.defineMemory(1, 10, true); // shared = true +mod.exportMemory(mem, 'memory'); + +// Atomic increment: atomically adds 1 to the i32 at the given address +mod.defineFunction('atomicIncrement', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // address + a.const_i32(1); // value to add + a.atomic_rmw_add_i32(2, 0); // returns old value +}).withExport(); + +// Atomic load: read an i32 atomically +mod.defineFunction('atomicLoad', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.atomic_load_i32(2, 0); +}).withExport(); + +// Atomic store: write an i32 atomically +mod.defineFunction('atomicStore', null, [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // address + a.get_local(f.getParameter(1)); // value + a.atomic_store_i32(2, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { atomicIncrement, atomicLoad, atomicStore } = instance.instance.exports as any; + +atomicStore(0, 100); +console.log(atomicLoad(0)); // 100 +atomicIncrement(0); +atomicIncrement(0); +console.log(atomicLoad(0)); // 102 +``` + +## Exception Handling + +Define exception tags and throw exceptions: + +```typescript +import { ModuleBuilder, ValueType, BlockType } from 'webasmjs'; + +const mod = new ModuleBuilder('exceptions', { disableVerification: true }); + +// Define a tag with an i32 payload (like an error code) +const errorTag = mod.defineTag([ValueType.Int32]); + +// Function that throws when input is negative +mod.defineFunction('checkPositive', null, [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(0); + a.lt_s_i32(); + a.if(BlockType.Void, () => { + a.get_local(f.getParameter(0)); + a.throw(errorTag._index); + }); +}).withExport(); + +const bytes = mod.toBytes(); +console.log(`Module compiled: ${bytes.length} bytes`); + +// WAT output shows the tag and throw instruction +const wat = mod.toString(); +console.log(wat); +``` + +## Memory64 + +Use 64-bit addressed memory for very large address spaces: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('memory64'); + +// memory64 flag makes addresses 64-bit +const mem = mod.defineMemory(1, 100, false, true); // memory64 = true +mod.exportMemory(mem, 'memory'); + +// Store: address is i64 +mod.defineFunction('store64', null, [ValueType.Int64, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // i64 address + a.get_local(f.getParameter(1)); // i32 value + a.store_i32(2, 0); +}).withExport(); + +// Load: address is i64 +mod.defineFunction('load64', [ValueType.Int32], [ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); // i64 address + a.load_i32(2, 0); +}).withExport(); + +// Compile to bytes (runtime instantiation requires engine support for memory64) +const bytes = mod.toBytes(); +console.log(`Module compiled: ${bytes.length} bytes`); + +const wat = mod.toString(); +console.log(wat); // shows (memory i64 1 100) +``` + +## Passive Data Segments + +Use passive data segments with `memory.init` for lazy initialization: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('passiveData'); +const mem = mod.defineMemory(1); +mod.exportMemory(mem, 'memory'); + +// Define a passive data segment (not placed in memory automatically) +const greeting = new TextEncoder().encode('Hello, WebAssembly!'); +const dataSegment = mod.defineData(new Uint8Array([...greeting])); + +// Copy passive data into memory at runtime using memory.init +mod.defineFunction('init', null, [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // destination offset + a.const_i32(0); // source offset in data segment + a.const_i32(greeting.length); // length + a.memory_init(dataSegment._index, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { init, memory } = instance.instance.exports as any; + +init(0); // copy data to offset 0 +const view = new Uint8Array(memory.buffer); +const text = new TextDecoder().decode(view.slice(0, greeting.length)); +console.log(text); // Hello, WebAssembly! +``` + +## Extended Constants + +Use arithmetic in global initialization expressions with the extended-const feature: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('extConst', { + target: 'mvp', + features: ['extended-const'], +}); + +// Base offset as an immutable global +const base = mod.defineGlobal(ValueType.Int32, false, 100); + +// Computed global: base + 50 (uses i32.add in init expression) +const offset1 = mod.defineGlobal(ValueType.Int32, false, (asm) => { + asm.get_global(base); + asm.const_i32(50); + asm.add_i32(); +}); + +// Computed global: base * 3 (uses i32.mul in init expression) +const scaled = mod.defineGlobal(ValueType.Int32, false, (asm) => { + asm.get_global(base); + asm.const_i32(3); + asm.mul_i32(); +}); + +mod.defineFunction('getBase', [ValueType.Int32], [], (f, a) => { + a.get_global(base); +}).withExport(); + +mod.defineFunction('getOffset1', [ValueType.Int32], [], (f, a) => { + a.get_global(offset1); +}).withExport(); + +mod.defineFunction('getScaled', [ValueType.Int32], [], (f, a) => { + a.get_global(scaled); +}).withExport(); + +const instance = await mod.instantiate(); +const { getBase, getOffset1, getScaled } = instance.instance.exports as any; + +console.log(getBase()); // 100 +console.log(getOffset1()); // 150 +console.log(getScaled()); // 300 +``` + +## Multi-Memory + +Define and use multiple linear memories in a single module: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('multiMem', { + target: 'mvp', + features: ['multi-memory'], +}); + +const mem0 = mod.defineMemory(1); +mod.exportMemory(mem0, 'mem0'); +const mem1 = mod.defineMemory(1); +mod.exportMemory(mem1, 'mem1'); + +// Store to memory 0 +mod.defineFunction('store0', null, + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0, 0); // memIndex=0 +}).withExport(); + +// Load from memory 0 +mod.defineFunction('load0', [ValueType.Int32], + [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0, 0); // memIndex=0 +}).withExport(); + +// Store to memory 1 +mod.defineFunction('store1', null, + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0, 1); // memIndex=1 +}).withExport(); + +// Load from memory 1 +mod.defineFunction('load1', [ValueType.Int32], + [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0, 1); // memIndex=1 +}).withExport(); + +const bytes = mod.toBytes(); +console.log(`Module compiled: ${bytes.length} bytes`); +console.log(`Valid: ${WebAssembly.validate(bytes.buffer)}`); +``` + +## Multi-Table + +Define multiple function tables and dispatch through each: + +```typescript +import { ModuleBuilder, ValueType, ElementType } from 'webasmjs'; + +const mod = new ModuleBuilder('multiTable', { + target: 'mvp', + features: ['multi-table'], +}); + +const add = mod.defineFunction('add', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_i32(); +}); + +const sub = mod.defineFunction('sub', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.sub_i32(); +}); + +const mul = mod.defineFunction('mul', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.mul_i32(); +}); + +// Two tables with different function arrangements +const table0 = mod.defineTable(ElementType.AnyFunc, 3); +mod.defineTableSegment(table0, [add, sub, mul], 0); + +const table1 = mod.defineTable(ElementType.AnyFunc, 2); +mod.defineTableSegment(table1, [mul, add], 0); + +const bytes = mod.toBytes(); +console.log(`Module compiled: ${bytes.length} bytes`); +console.log(`Valid: ${WebAssembly.validate(bytes.buffer)}`); +``` + +## Relaxed SIMD + +Use relaxed SIMD operations for performance-sensitive vector code: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('relaxedSimd'); +mod.defineMemory(1); + +// relaxed_madd: a * b + c (fused multiply-add) +mod.defineFunction('madd_f32x4', null, + [ValueType.Int32, ValueType.Int32, + ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(3)); // dest address + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); // load A + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); // load B + a.get_local(f.getParameter(2)); + a.load_v128(2, 0); // load C + a.relaxed_madd_f32x4(); // A * B + C + a.store_v128(2, 0); +}).withExport(); + +const bytes = mod.toBytes(); +console.log(`Module compiled: ${bytes.length} bytes`); +console.log(`Valid: ${WebAssembly.validate(bytes.buffer)}`); +``` + +## Atomic Read-Modify-Write Operations + +Demonstrate all RMW variants: sub, and, or, xor, exchange on shared memory: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('atomicRMW'); +const mem = mod.defineMemory(1, 10, true); // shared +mod.exportMemory(mem, 'memory'); + +mod.defineFunction('store', null, + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_store_i32(2, 0); +}).withExport(); + +mod.defineFunction('load', [ValueType.Int32], + [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.atomic_load_i32(2, 0); +}).withExport(); + +// Each RMW op returns the old value +mod.defineFunction('atomicSub', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_sub_i32(2, 0); +}).withExport(); + +mod.defineFunction('atomicAnd', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_and_i32(2, 0); +}).withExport(); + +mod.defineFunction('atomicOr', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_or_i32(2, 0); +}).withExport(); + +mod.defineFunction('atomicXor', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_xor_i32(2, 0); +}).withExport(); + +mod.defineFunction('atomicXchg', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_xchg_i32(2, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { store, load, atomicSub, atomicAnd, atomicXchg } = instance.instance.exports as any; + +store(0, 100); +console.log(atomicSub(0, 30)); // old: 100, new value at addr 0 is 70 +console.log(load(0)); // 70 + +store(0, 0xFF); +console.log(atomicAnd(0, 0x0F)); // old: 255, new: 15 + +store(0, 42); +console.log(atomicXchg(0, 99)); // old: 42, new: 99 +``` + +## Atomic Wait, Notify & Fence + +Thread synchronization primitives — wait/notify for blocking coordination, fence for memory ordering: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('waitNotify', { disableVerification: true }); +const mem = mod.defineMemory(1, 10, true); +mod.exportMemory(mem, 'memory'); + +// wait32(addr, expected, timeout_ns) -> 0=ok, 1=not-equal, 2=timed-out +mod.defineFunction('wait32', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32, ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.get_local(f.getParameter(2)); + a.atomic_wait32(2, 0); +}).withExport(); + +// notify(addr, count) -> number of waiters woken +mod.defineFunction('notify', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_notify(2, 0); +}).withExport(); + +// fence — full memory barrier +mod.defineFunction('fence', null, [], (f, a) => { + a.atomic_fence(0); +}).withExport(); + +const bytes = mod.toBytes(); +console.log(`Module compiled: ${bytes.length} bytes`); +console.log(`Valid: ${WebAssembly.validate(bytes.buffer)}`); + +// In a multi-threaded setup: +// Thread A: wait32(addr, 0, -1n) // block until value != 0 +// Thread B: store(addr, 1); notify(addr, 1) // wake thread A +``` + +## SIMD Integer Ops + +Integer SIMD: i32x4 add, min, lane extract, and splat: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('simdInt'); +mod.defineMemory(1); + +// Add two i32x4 vectors +mod.defineFunction('add_i32x4', null, + [ValueType.Int32, ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.add_i32x4(); + a.store_v128(2, 0); +}).withExport(); + +// Element-wise min (signed) +mod.defineFunction('min_s_i32x4', null, + [ValueType.Int32, ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.min_s_i32x4(); + a.store_v128(2, 0); +}).withExport(); + +// Extract lane 0 +mod.defineFunction('extract', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.extract_lane_i32x4(0); +}).withExport(); + +// Splat a scalar to all 4 lanes +mod.defineFunction('splat_i32x4', null, + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // dest + a.get_local(f.getParameter(1)); // scalar + a.splat_i32x4(); + a.store_v128(2, 0); +}).withExport(); +``` + +## SIMD Shuffle & Swizzle + +Rearrange vector lanes with shuffle (static indices) and swizzle (dynamic indices): + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('simdShuffle'); +mod.defineMemory(1); + +// shuffle: pick 16 bytes from two source vectors by index +// Indices 0-15 = first vector, 16-31 = second vector +mod.defineFunction('interleave', null, + [ValueType.Int32, ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); // dest + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); // vector A + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); // vector B + a.shuffle_i8x16(new Uint8Array([0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23])); + a.store_v128(2, 0); +}).withExport(); + +// Reverse bytes within a vector +mod.defineFunction('reverse', null, + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(1)); // dest + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.shuffle_i8x16(new Uint8Array([15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])); + a.store_v128(2, 0); +}).withExport(); + +// swizzle: rearrange bytes using a dynamic index vector +mod.defineFunction('swizzle', null, + [ValueType.Int32, ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); // dest + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); // data + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); // indices + a.swizzle_i8x16(); + a.store_v128(2, 0); +}).withExport(); +``` + +## SIMD Widen & Narrow + +Convert between vector widths — narrow i16x8 to i8x16, extend i8x16 to i16x8: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('simdWidenNarrow'); +mod.defineMemory(1); + +// Narrow two i16x8 vectors into one i8x16 (saturating, unsigned) +mod.defineFunction('narrow_u', null, + [ValueType.Int32, ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.narrow_i16x8_u_i8x16(); + a.store_v128(2, 0); +}).withExport(); + +// Extend low half of i8x16 to i16x8 (signed) +mod.defineFunction('extend_low_s', null, + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(1)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.extend_low_i8x16_s_i16x8(); + a.store_v128(2, 0); +}).withExport(); +``` + +## SIMD Saturating Math + +Saturating add/sub that clamp on overflow instead of wrapping: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('simdSat'); +mod.defineMemory(1); + +// Saturating unsigned add on i8x16 +mod.defineFunction('add_sat_u', null, + [ValueType.Int32, ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.add_sat_u_i8x16(); + a.store_v128(2, 0); +}).withExport(); + +// Saturating unsigned sub on i8x16 +mod.defineFunction('sub_sat_u', null, + [ValueType.Int32, ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.sub_sat_u_i8x16(); + a.store_v128(2, 0); +}).withExport(); + +// Regular (wrapping) add for comparison +mod.defineFunction('add_wrap', null, + [ValueType.Int32, ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.add_i8x16(); + a.store_v128(2, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { add_sat_u, sub_sat_u, add_wrap, setByte, getByte } = instance.instance.exports; + +// A = [200, 100, 255, 0, 128, 50, 250, 10] +// B = [100, 200, 10, 5, 128, 250, 50, 0] +// add_sat_u: 200+100=255(clamped), 100+200=255, 255+10=255, ... +// add_wrap: 200+100=44(wrapped), 100+200=44, ... +``` + +## Passive Data Segments + +Lazy-init memory with passive data segments and memory.init: + +```typescript +import { ModuleBuilder, ValueType, BlockType } from 'webasmjs'; + +const mod = new ModuleBuilder('passiveData'); +const mem = mod.defineMemory(1); +mod.exportMemory(mem, 'memory'); + +// Passive segment: not placed in memory until memory.init is called +const greeting = new TextEncoder().encode('Hello, WebAssembly!'); +const dataSegment = mod.defineData(new Uint8Array([...greeting])); + +// Copy passive data into memory +mod.defineFunction('init', null, [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // destination offset + a.const_i32(0); // source offset in data segment + a.const_i32(19); // length + a.memory_init(dataSegment._index, 0); +}).withExport(); + +// Drop data segment (free it after init) +mod.defineFunction('drop', null, [], (f, a) => { + a.data_drop(dataSegment._index); +}).withExport(); + +const instance = await mod.instantiate(); +const { init, drop: dataDrop, memory } = instance.instance.exports; +const view = new Uint8Array(memory.buffer); + +// Memory starts empty (passive segment not yet loaded) +console.log('Before init:', view[0]); // 0 + +init(0); // Load passive data at offset 0 +console.log('After init:', new TextDecoder().decode(view.slice(0, 19))); + +dataDrop(); // Free the data segment +``` + +## Bulk Table Operations + +table.fill and table.copy for bulk table manipulation: + +```typescript +import { ModuleBuilder, ValueType, ElementType } from 'webasmjs'; + +const mod = new ModuleBuilder('bulkTable'); + +const add = mod.defineFunction('add', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_i32(); +}).withExport(); + +const mul = mod.defineFunction('mul', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.mul_i32(); +}).withExport(); + +const table = mod.defineTable(ElementType.AnyFunc, 8); +mod.defineTableSegment(table, [add, mul], 0); + +// table.fill(start, ref, count) +mod.defineFunction('fillWithAdd', null, [], (f, a) => { + a.const_i32(2); + a.ref_func(add); + a.const_i32(4); + a.table_fill(0); +}).withExport(); + +// table.copy(dest, src, count) +mod.defineFunction('copySlots', null, [], (f, a) => { + a.const_i32(6); + a.const_i32(0); + a.const_i32(2); + a.table_copy(0, 0); +}).withExport(); +``` + +## Table Get/Set/Grow + +Dynamic table manipulation with table.get, table.set, and table.grow: + +```typescript +import { ModuleBuilder, ValueType, ElementType } from 'webasmjs'; + +const mod = new ModuleBuilder('tableOps'); + +const double = mod.defineFunction('double', [ValueType.Int32], + [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(2); + a.mul_i32(); +}).withExport(); + +const table = mod.defineTable(ElementType.AnyFunc, 2); +mod.defineTableSegment(table, [double], 0); + +// table.set: place a function ref at an index +mod.defineFunction('setSlot', null, [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.ref_func(double); + a.table_set(0); +}).withExport(); + +// table.grow: add N slots (returns old size, or -1 on failure) +mod.defineFunction('growTable', [ValueType.Int32], + [ValueType.Int32], (f, a) => { + a.ref_null(0x70); // fill new slots with null + a.get_local(f.getParameter(0)); + a.table_grow(0); +}).withExport(); + +// table.size +mod.defineFunction('size', [ValueType.Int32], [], (f, a) => { + a.table_size(0); +}).withExport(); + +// Check if a slot is null +mod.defineFunction('isNull', [ValueType.Int32], + [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.table_get(0); + a.ref_is_null(); +}).withExport(); +``` + +## Try/Catch Exception Handling + +Full try/catch exception handling with multiple tags: + +```typescript +import { ModuleBuilder, ValueType, BlockType } from 'webasmjs'; + +const mod = new ModuleBuilder('tryCatch', { disableVerification: true }); + +// Define two exception tags with different payloads +const errorTag = mod.defineTag([ValueType.Int32]); // error code +const overflowTag = mod.defineTag([ValueType.Int32]); // overflow value + +// Function that may throw +mod.defineFunction('checkedAdd', [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], (f, a) => { + const x = f.getParameter(0); + const y = f.getParameter(1); + const result = a.declareLocal(ValueType.Int32, 'result'); + + a.get_local(x); + a.get_local(y); + a.add_i32(); + a.set_local(result); + + // Check for "overflow" (result > 1000) + a.get_local(result); + a.const_i32(1000); + a.gt_i32(); + a.if(BlockType.Void, () => { + a.get_local(result); + a.throw(overflowTag._index); + }); + + a.get_local(result); +}).withExport(); + +const bytes = mod.toBytes(); +console.log(`Module compiled: ${bytes.length} bytes`); +console.log(`Valid: ${WebAssembly.validate(bytes.buffer)}`); +``` + +## f32 Math + +Single-precision float operations — min, max, abs, neg, sqrt, and f32 vs f64 precision: + +```typescript +import { ModuleBuilder, ValueType } from 'webasmjs'; + +const mod = new ModuleBuilder('f32math'); + +mod.defineFunction('min', [ValueType.Float32], + [ValueType.Float32, ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.min_f32(); +}).withExport(); + +mod.defineFunction('max', [ValueType.Float32], + [ValueType.Float32, ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.max_f32(); +}).withExport(); + +mod.defineFunction('abs', [ValueType.Float32], + [ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.abs_f32(); +}).withExport(); + +mod.defineFunction('sqrt', [ValueType.Float32], + [ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.sqrt_f32(); +}).withExport(); + +// Compare f32 vs f64 precision +mod.defineFunction('addF32', [ValueType.Float32], + [ValueType.Float32, ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_f32(); +}).withExport(); + +mod.defineFunction('addF64', [ValueType.Float64], + [ValueType.Float64, ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_f64(); +}).withExport(); + +const instance = await mod.instantiate(); +const { min, max, abs, sqrt, addF32, addF64 } = instance.instance.exports; + +console.log('min(3.14, 2.71) =', min(3.14, 2.71)); +console.log('max(3.14, 2.71) =', max(3.14, 2.71)); +console.log('abs(-42.5) =', abs(-42.5)); +console.log('sqrt(9.0) =', sqrt(9.0)); +console.log('f32: 0.1 + 0.2 =', addF32(0.1, 0.2)); +console.log('f64: 0.1 + 0.2 =', addF64(0.1, 0.2)); +``` diff --git a/docs/getting-started.md b/docs/getting-started.md index 21af619..f7b771e 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -76,6 +76,7 @@ The `end` instruction is automatically added when using the callback form. | `i64` | `ValueType.Int64` | 64-bit integer (uses BigInt in JS) | | `f32` | `ValueType.Float32` | 32-bit float | | `f64` | `ValueType.Float64` | 64-bit float | +| `v128` | `ValueType.V128` | 128-bit SIMD vector | ## Control Flow @@ -108,6 +109,31 @@ a.loop(BlockType.Void, (loopLabel) => { }); ``` +## Target System + +webasmjs supports WebAssembly feature proposals through a target system. Each target enables a set of features automatically: + +```typescript +// Default: 'latest' — all standardized features enabled +const mod = new ModuleBuilder('myModule'); + +// Target a specific version for compatibility +const mod2 = new ModuleBuilder('compat', { target: '2.0' }); + +// MVP with specific features added +const mod3 = new ModuleBuilder('custom', { + target: 'mvp', + features: ['simd', 'bulk-memory'], +}); +``` + +| Target | Features Included | +|--------|-------------------| +| `mvp` | None — WebAssembly 1.0 only | +| `2.0` | sign-extend, sat-trunc, bulk-memory, reference-types, multi-value, mutable-globals | +| `3.0` | All of 2.0 + simd, tail-call, exception-handling, threads, multi-memory, multi-table, memory64, extended-const | +| `latest` | All of 3.0 + relaxed-simd, gc | + ## WAT Output Every module can be converted to WAT text format for debugging: @@ -121,4 +147,5 @@ console.log(wat); - [API Reference](api.md) — complete documentation of all builders and emitters - [Examples](examples.md) — annotated examples covering common patterns +- [Feature Spec](../spec/FEATURES.md) — detailed specification of all supported WebAssembly features - [Playground](https://devnamedzed.github.io/webasmjs/) — try webasmjs in the browser diff --git a/generator/index.ts b/generator/index.ts index 1898e42..b847a83 100644 --- a/generator/index.ts +++ b/generator/index.ts @@ -1,6 +1,26 @@ import * as fs from 'fs'; import * as path from 'path'; +interface OpCodeJson { + value: number; + name: string; + mnemonic: string; + friendlyName: string; + immediate: string | null; + controlFlow: string | null; + pop: string[] | null; + push: string[] | null; + prefix: number | null; + feature: string | null; + group: string; + order?: number; +} + +interface OpCodeManifest { + description: string; + includes: string[]; +} + interface OpCode { value: number; name: string; @@ -13,6 +33,7 @@ interface OpCode { pushOperands: string[] | null; prefix: number | null; feature: string | null; + group: string; } interface OperandInfo { @@ -70,88 +91,50 @@ function getStackBehavior(pop: string[] | null, push: string[] | null): string { return 'None'; } -function parseOperands(value: string): string[] | null { - if (!value || value === '') return null; - return JSON.parse(value).filter((x: string) => x !== 'Arguments' && x !== 'Returns'); +function isManifest(data: unknown): data is OpCodeManifest { + return typeof data === 'object' && data !== null && 'includes' in data && Array.isArray((data as OpCodeManifest).includes); } -function parseCSV(csv: string): string[][] { - const rows: string[][] = []; - let current = ''; - let inQuotes = false; - let row: string[] = []; - - for (let i = 0; i < csv.length; i++) { - const ch = csv[i]; - if (inQuotes) { - if (ch === '"' && csv[i + 1] === '"') { - current += '"'; - i++; - } else if (ch === '"') { - inQuotes = false; - } else { - current += ch; - } - } else { - if (ch === '"') { - inQuotes = true; - } else if (ch === ',') { - row.push(current); - current = ''; - } else if (ch === '\n' || ch === '\r') { - if (ch === '\r' && csv[i + 1] === '\n') i++; - row.push(current); - current = ''; - if (row.some((c) => c !== '')) rows.push(row); - row = []; - } else { - current += ch; - } +function loadRawOpcodes(jsonPath: string): OpCodeJson[] { + const data = JSON.parse(fs.readFileSync(jsonPath, 'utf8')); + if (isManifest(data)) { + const dir = path.dirname(jsonPath); + const entries: OpCodeJson[] = []; + for (const include of data.includes) { + const subPath = path.join(dir, include); + const subEntries: OpCodeJson[] = JSON.parse(fs.readFileSync(subPath, 'utf8')); + entries.push(...subEntries); } + entries.sort((a, b) => (a.order ?? 0) - (b.order ?? 0)); + return entries; } + return data; +} - row.push(current); - if (row.some((c) => c !== '')) rows.push(row); +function loadOpcodes(jsonPath: string): OpCode[] { + const raw = loadRawOpcodes(jsonPath); - return rows; -} + return raw.map((entry) => { + const pop = entry.pop && entry.pop.length > 0 ? entry.pop : null; + const push = entry.push && entry.push.length > 0 ? entry.push : null; + const isCall = entry.name.startsWith('call') || entry.name.startsWith('return_call'); + const stackBehavior = isCall ? 'PopPush' : getStackBehavior(pop, push); -function parseOpcodes(data: string[][]): OpCode[] { - const result: OpCode[] = []; - // Header: value,name,mnemonic,friendlyName,immediate,controlflow,pop,push,prefix - for (let index = 1; index < data.length; index++) { - const row = data[index]; - if (!row[0] && row[0] !== '0') continue; - - const pop = parseOperands(row[6]); - const push = parseOperands(row[7]); - const isCall = row[1].startsWith('call'); - const stackBehavior = isCall ? 'PopPush' : getStackBehavior( - pop && pop.length !== 0 ? pop : null, - push && push.length !== 0 ? push : null - ); - - const prefixStr = row[8]?.trim(); - const prefix = prefixStr ? parseInt(prefixStr, 10) : null; - const featureStr = row[9]?.trim(); - const feature = featureStr || null; - - result.push({ - value: parseInt(row[0], 10), - name: row[1], - mnemonic: row[2], - friendlyName: row[3], - immediate: row[4] || null, - controlFlow: row[5] || null, + return { + value: entry.value, + name: entry.name, + mnemonic: entry.mnemonic, + friendlyName: entry.friendlyName, + immediate: entry.immediate, + controlFlow: entry.controlFlow, stackBehavior, popOperands: pop, pushOperands: push, - prefix, - feature, - }); - } - - return result; + prefix: entry.prefix, + feature: entry.feature, + group: entry.group, + }; + }); } function generateOpCodes(opCodes: OpCode[]): string { @@ -202,21 +185,114 @@ function generateOpCodeEmitter(opCodes: OpCode[]): string { return out; } +function generateTests(opCodes: OpCode[]): string { + let out = '// AUTO-GENERATED — do not edit. Run `npm run generate` to regenerate.\n'; + out += "import OpCodes from '../../src/OpCodes';\n"; + out += "import OpCodeEmitter from '../../src/OpCodeEmitter';\n\n"; + + // Group opcodes + const groups = new Map(); + for (const op of opCodes) { + if (!groups.has(op.group)) groups.set(op.group, []); + groups.get(op.group)!.push(op); + } + + // Group opcodes by feature + const features = new Map(); + for (const op of opCodes) { + if (op.feature) { + if (!features.has(op.feature)) features.set(op.feature, []); + features.get(op.feature)!.push(op); + } + } + + out += `describe('OpCode definitions', () => {\n`; + out += ` test('total opcode count is ${opCodes.length}', () => {\n`; + out += ` expect(Object.keys(OpCodes).length).toBe(${opCodes.length});\n`; + out += ` });\n\n`; + + // Per-group describe blocks + for (const [group, ops] of groups) { + out += ` describe('${group}', () => {\n`; + for (const op of ops) { + const checks: string[] = []; + checks.push(`expect(op.value).toBe(${op.value})`); + checks.push(`expect(op.mnemonic).toBe(${JSON.stringify(op.mnemonic)})`); + if (op.prefix !== null) { + checks.push(`expect(op.prefix).toBe(${op.prefix})`); + } + if (op.feature) { + checks.push(`expect(op.feature).toBe(${JSON.stringify(op.feature)})`); + } + + out += ` test('${op.name}', () => {\n`; + out += ` const op = (OpCodes as any).${op.name};\n`; + out += ` expect(op).toBeDefined();\n`; + for (const check of checks) { + out += ` ${check};\n`; + } + out += ` });\n\n`; + } + out += ` });\n\n`; + } + + // Feature group summaries + if (features.size > 0) { + out += ` describe('feature groups', () => {\n`; + for (const [feature, ops] of features) { + const prefixes = new Set(ops.map((o) => o.prefix)); + const prefix = prefixes.size === 1 ? [...prefixes][0] : null; + out += ` test('${feature}: ${ops.length} opcodes', () => {\n`; + out += ` const ops = Object.values(OpCodes).filter((op: any) => op.feature === '${feature}');\n`; + out += ` expect(ops.length).toBe(${ops.length});\n`; + if (prefix !== null) { + out += ` ops.forEach((op: any) => expect(op.prefix).toBe(${prefix}));\n`; + } + out += ` });\n\n`; + } + out += ` });\n`; + } + + out += `});\n\n`; + + // Emitter method tests + out += `describe('Emitter methods', () => {\n`; + for (const [group, ops] of groups) { + out += ` describe('${group}', () => {\n`; + for (const op of ops) { + out += ` test('${op.friendlyName}', () => {\n`; + out += ` expect(typeof (OpCodeEmitter.prototype as any).${op.friendlyName}).toBe('function');\n`; + out += ` });\n\n`; + } + out += ` });\n\n`; + } + out += `});\n`; + + return out; +} + // Main const generatorDir = __dirname; -const csvPath = path.join(generatorDir, 'opcodes.csv'); +const jsonPath = path.join(generatorDir, 'opcodes.json'); const srcDir = path.join(generatorDir, '..', 'src'); +const testsDir = path.join(generatorDir, '..', 'tests', 'generated'); -const csv = fs.readFileSync(csvPath, 'utf8'); -const csvData = parseCSV(csv); -const opcodeList = parseOpcodes(csvData); +const opcodeList = loadOpcodes(jsonPath); const opCodesOutput = generateOpCodes(opcodeList); const emitterOutput = generateOpCodeEmitter(opcodeList); +const testsOutput = generateTests(opcodeList); fs.writeFileSync(path.join(srcDir, 'OpCodes.ts'), opCodesOutput); fs.writeFileSync(path.join(srcDir, 'OpCodeEmitter.ts'), emitterOutput); +// Ensure tests/generated directory exists +if (!fs.existsSync(testsDir)) { + fs.mkdirSync(testsDir, { recursive: true }); +} +fs.writeFileSync(path.join(testsDir, 'OpCodes.test.ts'), testsOutput); + console.log(`Generated ${opcodeList.length} opcodes.`); console.log(` OpCodes.ts written to ${path.join(srcDir, 'OpCodes.ts')}`); console.log(` OpCodeEmitter.ts written to ${path.join(srcDir, 'OpCodeEmitter.ts')}`); +console.log(` OpCodes.test.ts written to ${path.join(testsDir, 'OpCodes.test.ts')}`); diff --git a/generator/opcodes.csv b/generator/opcodes.csv deleted file mode 100644 index b857969..0000000 --- a/generator/opcodes.csv +++ /dev/null @@ -1,437 +0,0 @@ -value,name,mnemonic,friendlyName,immediate,controlflow,pop,push,prefix,feature -0,unreachable,unreachable,unreachable,,,,,, -1,nop,nop,nop,,,,,, -2,block,block,block,BlockSignature,Push,,,, -3,loop,loop,loop,BlockSignature,Push,,,, -4,if,if,if,BlockSignature,Push,"[""Int32""]",,, -5,else,else,else,,,,,, -11,end,end,end,,Pop,,,, -12,br,br,br,RelativeDepth,,,,, -13,br_if,br_if,br_if,RelativeDepth,,"[""Int32""]",,, -14,br_table,br_table,br_table,BranchTable,,"[""Int32""]",,, -15,return,return,return,,,,,, -16,call,call,call,Function,,"[""Arguments""]","[""Returns""]",, -17,call_indirect,call_indirect,call_indirect,IndirectFunction,,"[""Arguments"",""Int32""]","[""Returns""]",, -26,drop,drop,drop,,,"[""Any""]",,, -27,select,select,select,,,"[""Any"",""Any"",""Int32""]","[""Any""]",, -32,get_local,local.get,get_local,Local,,,"[""Any""]",, -33,set_local,local.set,set_local,Local,,"[""Any""]",,, -34,tee_local,local.tee,tee_local,Local,,"[""Any""]","[""Any""]",, -35,get_global,global.get,get_global,Global,,,"[""Any""]",, -36,set_global,global.set,set_global,Global,,"[""Any""]",,, -40,i32_load,i32.load,load_i32,MemoryImmediate,,"[""Int32""]","[""Int32""]",, -41,i64_load,i64.load,load_i64,MemoryImmediate,,"[""Int32""]","[""Int64""]",, -42,f32_load,f32.load,load_f32,MemoryImmediate,,"[""Int32""]","[""Float32""]",, -43,f64_load,f64.load,load_f64,MemoryImmediate,,"[""Int32""]","[""Float64""]",, -44,i32_load8_s,i32.load8_s,load8_i32,MemoryImmediate,,"[""Int32""]","[""Int32""]",, -45,i32_load8_u,i32.load8_u,load8_i32_u,MemoryImmediate,,"[""Int32""]","[""Int32""]",, -46,i32_load16_s,i32.load16_s,load16_i32,MemoryImmediate,,"[""Int32""]","[""Int32""]",, -47,i32_load16_u,i32.load16_u,load16_i32_u,MemoryImmediate,,"[""Int32""]","[""Int32""]",, -48,i64_load8_s,i64.load8_s,load8_i64,MemoryImmediate,,"[""Int32""]","[""Int64""]",, -49,i64_load8_u,i64.load8_u,load8_i64_u,MemoryImmediate,,"[""Int32""]","[""Int64""]",, -50,i64_load16_s,i64.load16_s,load16_i64,MemoryImmediate,,"[""Int32""]","[""Int64""]",, -51,i64_load16_u,i64.load16_u,load16_i64_u,MemoryImmediate,,"[""Int32""]","[""Int64""]",, -52,i64_load32_s,i64.load32_s,load32_i64,MemoryImmediate,,"[""Int32""]","[""Int64""]",, -53,i64_load32_u,i64.load32_u,load32_i64_u,MemoryImmediate,,"[""Int32""]","[""Int64""]",, -54,i32_store,i32.store,store_i32,MemoryImmediate,,"[""Int32"",""Int32""]",,, -55,i64_store,i64.store,store_i64,MemoryImmediate,,"[""Int32"",""Int64""]",,, -56,f32_store,f32.store,store_f32,MemoryImmediate,,"[""Int32"",""Float32""]",,, -57,f64_store,f64.store,store_f64,MemoryImmediate,,"[""Int32"",""Float64""]",,, -58,i32_store8,i32.store8,store8_i32,MemoryImmediate,,"[""Int32"",""Int32""]",,, -59,i32_store16,i32.store16,store16_i32,MemoryImmediate,,"[""Int32"",""Int32""]",,, -60,i64_store8,i64.store8,store8_i64,MemoryImmediate,,"[""Int32"",""Int64""]",,, -61,i64_store16,i64.store16,store16_i64,MemoryImmediate,,"[""Int32"",""Int64""]",,, -62,i64_store32,i64.store32,store32_i64,MemoryImmediate,,"[""Int32"",""Int64""]",,, -63,mem_size,memory.size,mem_size,VarUInt1,,,"[""Int32""]",, -64,mem_grow,memory.grow,mem_grow,VarUInt1,,"[""Int32""]","[""Int32""]",, -65,i32_const,i32.const,const_i32,VarInt32,,,"[""Int32""]",, -66,i64_const,i64.const,const_i64,VarInt64,,,"[""Int64""]",, -67,f32_const,f32.const,const_f32,Float32,,,"[""Float32""]",, -68,f64_const,f64.const,const_f64,Float64,,,"[""Float64""]",, -69,i32_eqz,i32.eqz,eqz_i32,,,"[""Int32""]","[""Int32""]",, -70,i32_eq,i32.eq,eq_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -71,i32_ne,i32.ne,ne_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -72,i32_lt_s,i32.lt_s,lt_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -73,i32_lt_u,i32.lt_u,lt_i32_u,,,"[""Int32"",""Int32""]","[""Int32""]",, -74,i32_gt_s,i32.gt_s,gt_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -75,i32_gt_u,i32.gt_u,gt_i32_u,,,"[""Int32"",""Int32""]","[""Int32""]",, -76,i32_le_s,i32.le_s,le_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -77,i32_le_u,i32.le_u,le_i32_u,,,"[""Int32"",""Int32""]","[""Int32""]",, -78,i32_ge_s,i32.ge_s,ge_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -79,i32_ge_u,i32.ge_u,ge_i32_u,,,"[""Int32"",""Int32""]","[""Int32""]",, -80,i64_eqz,i64.eqz,eqz_i64,,,"[""Int64""]","[""Int32""]",, -81,i64_eq,i64.eq,eq_i64,,,"[""Int64"",""Int64""]","[""Int32""]",, -82,i64_ne,i64.ne,ne_i64,,,"[""Int64"",""Int64""]","[""Int32""]",, -83,i64_lt_s,i64.lt_s,lt_i64,,,"[""Int64"",""Int64""]","[""Int32""]",, -84,i64_lt_u,i64.lt_u,lt_i64_u,,,"[""Int64"",""Int64""]","[""Int32""]",, -85,i64_gt_s,i64.gt_s,gt_i64,,,"[""Int64"",""Int64""]","[""Int32""]",, -86,i64_gt_u,i64.gt_u,gt_i64_u,,,"[""Int64"",""Int64""]","[""Int32""]",, -87,i64_le_s,i64.le_s,le_i64,,,"[""Int64"",""Int64""]","[""Int32""]",, -88,i64_le_u,i64.le_u,le_i64_u,,,"[""Int64"",""Int64""]","[""Int32""]",, -89,i64_ge_s,i64.ge_s,ge_i64,,,"[""Int64"",""Int64""]","[""Int32""]",, -90,i64_ge_u,i64.ge_u,ge_i64_u,,,"[""Int64"",""Int64""]","[""Int32""]",, -91,f32_eq,f32.eq,eq_f32,,,"[""Float32"",""Float32""]","[""Int32""]",, -92,f32_ne,f32.ne,ne_f32,,,"[""Float32"",""Float32""]","[""Int32""]",, -93,f32_lt,f32.lt,lt_f32,,,"[""Float32"",""Float32""]","[""Int32""]",, -94,f32_gt,f32.gt,gt_f32,,,"[""Float32"",""Float32""]","[""Int32""]",, -95,f32_le,f32.le,le_f32,,,"[""Float32"",""Float32""]","[""Int32""]",, -96,f32_ge,f32.ge,ge_f32,,,"[""Float32"",""Float32""]","[""Int32""]",, -97,f64_eq,f64.eq,eq_f64,,,"[""Float64"",""Float64""]","[""Int32""]",, -98,f64_ne,f64.ne,ne_f64,,,"[""Float64"",""Float64""]","[""Int32""]",, -99,f64_lt,f64.lt,lt_f64,,,"[""Float64"",""Float64""]","[""Int32""]",, -100,f64_gt,f64.gt,gt_f64,,,"[""Float64"",""Float64""]","[""Int32""]",, -101,f64_le,f64.le,le_f64,,,"[""Float64"",""Float64""]","[""Int32""]",, -102,f64_ge,f64.ge,ge_f64,,,"[""Float64"",""Float64""]","[""Int32""]",, -103,i32_clz,i32.clz,clz_i32,,,"[""Int32""]","[""Int32""]",, -104,i32_ctz,i32.ctz,ctz_i32,,,"[""Int32""]","[""Int32""]",, -105,i32_popcnt,i32.popcnt,popcnt_i32,,,"[""Int32""]","[""Int32""]",, -106,i32_add,i32.add,add_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -107,i32_sub,i32.sub,sub_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -108,i32_mul,i32.mul,mul_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -109,i32_div_s,i32.div_s,div_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -110,i32_div_u,i32.div_u,div_i32_u,,,"[""Int32"",""Int32""]","[""Int32""]",, -111,i32_rem_s,i32.rem_s,rem_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -112,i32_rem_u,i32.rem_u,rem_i32_u,,,"[""Int32"",""Int32""]","[""Int32""]",, -113,i32_and,i32.and,and_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -114,i32_or,i32.or,or_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -115,i32_xor,i32.xor,xor_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -116,i32_shl,i32.shl,shl_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -117,i32_shr_s,i32.shr_s,shr_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -118,i32_shr_u,i32.shr_u,shr_i32_u,,,"[""Int32"",""Int32""]","[""Int32""]",, -119,i32_rotl,i32.rotl,rotl_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -120,i32_rotr,i32.rotr,rotr_i32,,,"[""Int32"",""Int32""]","[""Int32""]",, -121,i64_clz,i64.clz,clz_i64,,,"[""Int64""]","[""Int64""]",, -122,i64_ctz,i64.ctz,ctz_i64,,,"[""Int64""]","[""Int64""]",, -123,i64_popcnt,i64.popcnt,popcnt_i64,,,"[""Int64""]","[""Int64""]",, -124,i64_add,i64.add,add_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -125,i64_sub,i64.sub,sub_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -126,i64_mul,i64.mul,mul_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -127,i64_div_s,i64.div_s,div_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -128,i64_div_u,i64.div_u,div_i64_u,,,"[""Int64"",""Int64""]","[""Int64""]",, -129,i64_rem_s,i64.rem_s,rem_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -130,i64_rem_u,i64.rem_u,rem_i64_u,,,"[""Int64"",""Int64""]","[""Int64""]",, -131,i64_and,i64.and,and_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -132,i64_or,i64.or,or_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -133,i64_xor,i64.xor,xor_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -134,i64_shl,i64.shl,shl_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -135,i64_shr_s,i64.shr_s,shr_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -136,i64_shr_u,i64.shr_u,shr_i64_u,,,"[""Int64"",""Int64""]","[""Int64""]",, -137,i64_rotl,i64.rotl,rotl_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -138,i64_rotr,i64.rotr,rotr_i64,,,"[""Int64"",""Int64""]","[""Int64""]",, -139,f32_abs,f32.abs,abs_f32,,,"[""Float32""]","[""Float32""]",, -140,f32_neg,f32.neg,neg_f32,,,"[""Float32""]","[""Float32""]",, -141,f32_ceil,f32.ceil,ceil_f32,,,"[""Float32""]","[""Float32""]",, -142,f32_floor,f32.floor,floor_f32,,,"[""Float32""]","[""Float32""]",, -143,f32_trunc,f32.trunc,trunc_f32,,,"[""Float32""]","[""Float32""]",, -144,f32_nearest,f32.nearest,nearest_f32,,,"[""Float32""]","[""Float32""]",, -145,f32_sqrt,f32.sqrt,sqrt_f32,,,"[""Float32""]","[""Float32""]",, -146,f32_add,f32.add,add_f32,,,"[""Float32"",""Float32""]","[""Float32""]",, -147,f32_sub,f32.sub,sub_f32,,,"[""Float32"",""Float32""]","[""Float32""]",, -148,f32_mul,f32.mul,mul_f32,,,"[""Float32"",""Float32""]","[""Float32""]",, -149,f32_div,f32.div,div_f32,,,"[""Float32"",""Float32""]","[""Float32""]",, -150,f32_min,f32.min,min_f32,,,"[""Float32"",""Float32""]","[""Float32""]",, -151,f32_max,f32.max,max_f32,,,"[""Float32"",""Float32""]","[""Float32""]",, -152,f32_copysign,f32.copysign,copysign_f32,,,"[""Float32"",""Float32""]","[""Float32""]",, -153,f64_abs,f64.abs,abs_f64,,,"[""Float64""]","[""Float64""]",, -154,f64_neg,f64.neg,neg_f64,,,"[""Float64""]","[""Float64""]",, -155,f64_ceil,f64.ceil,ceil_f64,,,"[""Float64""]","[""Float64""]",, -156,f64_floor,f64.floor,floor_f64,,,"[""Float64""]","[""Float64""]",, -157,f64_trunc,f64.trunc,trunc_f64,,,"[""Float64""]","[""Float64""]",, -158,f64_nearest,f64.nearest,nearest_f64,,,"[""Float64""]","[""Float64""]",, -159,f64_sqrt,f64.sqrt,sqrt_f64,,,"[""Float64""]","[""Float64""]",, -160,f64_add,f64.add,add_f64,,,"[""Float64"",""Float64""]","[""Float64""]",, -161,f64_sub,f64.sub,sub_f64,,,"[""Float64"",""Float64""]","[""Float64""]",, -162,f64_mul,f64.mul,mul_f64,,,"[""Float64"",""Float64""]","[""Float64""]",, -163,f64_div,f64.div,div_f64,,,"[""Float64"",""Float64""]","[""Float64""]",, -164,f64_min,f64.min,min_f64,,,"[""Float64"",""Float64""]","[""Float64""]",, -165,f64_max,f64.max,max_f64,,,"[""Float64"",""Float64""]","[""Float64""]",, -166,f64_copysign,f64.copysign,copysign_f64,,,"[""Float64"",""Float64""]","[""Float64""]",, -167,i32_wrap_i64,i32.wrap_i64,wrap_i64_i32,,,"[""Int64""]","[""Int32""]",, -168,i32_trunc_f32_s,i32.trunc_f32_s,trunc_f32_s_i32,,,"[""Float32""]","[""Int32""]",, -169,i32_trunc_f32_u,i32.trunc_f32_u,trunc_f32_u_i32,,,"[""Float32""]","[""Int32""]",, -170,i32_trunc_f64_s,i32.trunc_f64_s,trunc_f64_s_i32,,,"[""Float64""]","[""Int32""]",, -171,i32_trunc_f64_u,i32.trunc_f64_u,trunc_f64_u_i32,,,"[""Float64""]","[""Int32""]",, -172,i64_extend_i32_s,i64.extend_i32_s,extend_i32_s_i64,,,"[""Int32""]","[""Int64""]",, -173,i64_extend_i32_u,i64.extend_i32_u,extend_i32_u_i64,,,"[""Int32""]","[""Int64""]",, -174,i64_trunc_f32_s,i64.trunc_f32_s,trunc_f32_s_i64,,,"[""Float32""]","[""Int64""]",, -175,i64_trunc_f32_u,i64.trunc_f32_u,trunc_f32_u_i64,,,"[""Float32""]","[""Int64""]",, -176,i64_trunc_f64_s,i64.trunc_f64_s,trunc_f64_s_i64,,,"[""Float64""]","[""Int64""]",, -177,i64_trunc_f64_u,i64.trunc_f64_u,trunc_f64_u_i64,,,"[""Float64""]","[""Int64""]",, -178,f32_convert_i32_s,f32.convert_i32_s,convert_i32_s_f32,,,"[""Int32""]","[""Float32""]",, -179,f32_convert_i32_u,f32.convert_i32_u,convert_i32_u_f32,,,"[""Int32""]","[""Float32""]",, -180,f32_convert_i64_s,f32.convert_i64_s,convert_i64_s_f32,,,"[""Int64""]","[""Float32""]",, -181,f32_convert_i64_u,f32.convert_i64_u,convert_i64_u_f32,,,"[""Int64""]","[""Float32""]",, -182,f32_demote_f64,f32.demote_f64,demote_f64_f32,,,"[""Float64""]","[""Float32""]",, -183,f64_convert_i32_s,f64.convert_i32_s,convert_i32_s_f64,,,"[""Int32""]","[""Float64""]",, -184,f64_convert_i32_u,f64.convert_i32_u,convert_i32_u_f64,,,"[""Int32""]","[""Float64""]",, -185,f64_convert_i64_s,f64.convert_i64_s,convert_i64_s_f64,,,"[""Int64""]","[""Float64""]",, -186,f64_convert_i64_u,f64.convert_i64_u,convert_i64_u_f64,,,"[""Int64""]","[""Float64""]",, -187,f64_promote_f32,f64.promote_f32,promote_f32_f64,,,"[""Float32""]","[""Float64""]",, -188,i32_reinterpret_f32,i32.reinterpret_f32,reinterpret_f32_i32,,,"[""Float32""]","[""Int32""]",, -189,i64_reinterpret_f64,i64.reinterpret_f64,reinterpret_f64_i64,,,"[""Float64""]","[""Int64""]",, -190,f32_reinterpret_i32,f32.reinterpret_i32,reinterpret_i32_f32,,,"[""Int32""]","[""Float32""]",, -191,f64_reinterpret_i64,f64.reinterpret_i64,reinterpret_i64_f64,,,"[""Int64""]","[""Float64""]",, -192,i32_extend8_s,i32.extend8_s,extend8_s_i32,,,"[""Int32""]","[""Int32""]",,sign-extend -193,i32_extend16_s,i32.extend16_s,extend16_s_i32,,,"[""Int32""]","[""Int32""]",,sign-extend -194,i64_extend8_s,i64.extend8_s,extend8_s_i64,,,"[""Int64""]","[""Int64""]",,sign-extend -195,i64_extend16_s,i64.extend16_s,extend16_s_i64,,,"[""Int64""]","[""Int64""]",,sign-extend -196,i64_extend32_s,i64.extend32_s,extend32_s_i64,,,"[""Int64""]","[""Int64""]",,sign-extend -0,i32_trunc_sat_f32_s,i32.trunc_sat_f32_s,trunc_sat_f32_s_i32,,,"[""Float32""]","[""Int32""]",252,sat-trunc -1,i32_trunc_sat_f32_u,i32.trunc_sat_f32_u,trunc_sat_f32_u_i32,,,"[""Float32""]","[""Int32""]",252,sat-trunc -2,i32_trunc_sat_f64_s,i32.trunc_sat_f64_s,trunc_sat_f64_s_i32,,,"[""Float64""]","[""Int32""]",252,sat-trunc -3,i32_trunc_sat_f64_u,i32.trunc_sat_f64_u,trunc_sat_f64_u_i32,,,"[""Float64""]","[""Int32""]",252,sat-trunc -4,i64_trunc_sat_f32_s,i64.trunc_sat_f32_s,trunc_sat_f32_s_i64,,,"[""Float32""]","[""Int64""]",252,sat-trunc -5,i64_trunc_sat_f32_u,i64.trunc_sat_f32_u,trunc_sat_f32_u_i64,,,"[""Float32""]","[""Int64""]",252,sat-trunc -6,i64_trunc_sat_f64_s,i64.trunc_sat_f64_s,trunc_sat_f64_s_i64,,,"[""Float64""]","[""Int64""]",252,sat-trunc -7,i64_trunc_sat_f64_u,i64.trunc_sat_f64_u,trunc_sat_f64_u_i64,,,"[""Float64""]","[""Int64""]",252,sat-trunc -8,memory_init,memory.init,memory_init,MemoryImmediate,,"[""Int32"",""Int32"",""Int32""]",,252,bulk-memory -9,data_drop,data.drop,data_drop,VarUInt32,,,,252,bulk-memory -10,memory_copy,memory.copy,memory_copy,MemoryImmediate,,"[""Int32"",""Int32"",""Int32""]",,252,bulk-memory -11,memory_fill,memory.fill,memory_fill,VarUInt1,,"[""Int32"",""Int32"",""Int32""]",,252,bulk-memory -12,table_init,table.init,table_init,MemoryImmediate,,"[""Int32"",""Int32"",""Int32""]",,252,bulk-memory -13,elem_drop,elem.drop,elem_drop,VarUInt32,,,,252,bulk-memory -14,table_copy,table.copy,table_copy,MemoryImmediate,,"[""Int32"",""Int32"",""Int32""]",,252,bulk-memory -15,table_grow,table.grow,table_grow,VarUInt32,,"[""Int32"",""Int32""]","[""Int32""]",252,reference-types -16,table_size,table.size,table_size,VarUInt32,,,"[""Int32""]",252,reference-types -17,table_fill,table.fill,table_fill,VarUInt32,,"[""Int32"",""Int32"",""Int32""]",,252,reference-types -208,ref_null,ref.null,ref_null,VarUInt32,,,"[""Int32""]",,reference-types -209,ref_is_null,ref.is_null,ref_is_null,,,"[""Int32""]","[""Int32""]",,reference-types -210,ref_func,ref.func,ref_func,Function,,,"[""Int32""]",,reference-types -37,table_get,table.get,table_get,VarUInt32,,"[""Int32""]","[""Int32""]",,reference-types -38,table_set,table.set,table_set,VarUInt32,,"[""Int32"",""Int32""]",,,reference-types -0,v128_load,v128.load,load_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -1,v128_load8x8_s,v128.load8x8_s,load8x8_s_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -2,v128_load8x8_u,v128.load8x8_u,load8x8_u_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -3,v128_load16x4_s,v128.load16x4_s,load16x4_s_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -4,v128_load16x4_u,v128.load16x4_u,load16x4_u_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -5,v128_load32x2_s,v128.load32x2_s,load32x2_s_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -6,v128_load32x2_u,v128.load32x2_u,load32x2_u_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -7,v128_load8_splat,v128.load8_splat,load8_splat_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -8,v128_load16_splat,v128.load16_splat,load16_splat_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -9,v128_load32_splat,v128.load32_splat,load32_splat_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -10,v128_load64_splat,v128.load64_splat,load64_splat_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -11,v128_store,v128.store,store_v128,MemoryImmediate,,"[""Int32"",""V128""]",,253,simd -12,v128_const,v128.const,const_v128,V128Const,,,"[""V128""]",253,simd -13,i8x16_shuffle,i8x16.shuffle,shuffle_i8x16,ShuffleMask,,"[""V128"",""V128""]","[""V128""]",253,simd -14,i8x16_swizzle,i8x16.swizzle,swizzle_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -15,i8x16_splat,i8x16.splat,splat_i8x16,,,"[""Int32""]","[""V128""]",253,simd -16,i16x8_splat,i16x8.splat,splat_i16x8,,,"[""Int32""]","[""V128""]",253,simd -17,i32x4_splat,i32x4.splat,splat_i32x4,,,"[""Int32""]","[""V128""]",253,simd -18,i64x2_splat,i64x2.splat,splat_i64x2,,,"[""Int64""]","[""V128""]",253,simd -19,f32x4_splat,f32x4.splat,splat_f32x4,,,"[""Float32""]","[""V128""]",253,simd -20,f64x2_splat,f64x2.splat,splat_f64x2,,,"[""Float64""]","[""V128""]",253,simd -21,i8x16_extract_lane_s,i8x16.extract_lane_s,extract_lane_s_i8x16,LaneIndex,,"[""V128""]","[""Int32""]",253,simd -22,i8x16_extract_lane_u,i8x16.extract_lane_u,extract_lane_u_i8x16,LaneIndex,,"[""V128""]","[""Int32""]",253,simd -23,i8x16_replace_lane,i8x16.replace_lane,replace_lane_i8x16,LaneIndex,,"[""V128"",""Int32""]","[""V128""]",253,simd -24,i16x8_extract_lane_s,i16x8.extract_lane_s,extract_lane_s_i16x8,LaneIndex,,"[""V128""]","[""Int32""]",253,simd -25,i16x8_extract_lane_u,i16x8.extract_lane_u,extract_lane_u_i16x8,LaneIndex,,"[""V128""]","[""Int32""]",253,simd -26,i16x8_replace_lane,i16x8.replace_lane,replace_lane_i16x8,LaneIndex,,"[""V128"",""Int32""]","[""V128""]",253,simd -27,i32x4_extract_lane,i32x4.extract_lane,extract_lane_i32x4,LaneIndex,,"[""V128""]","[""Int32""]",253,simd -28,i32x4_replace_lane,i32x4.replace_lane,replace_lane_i32x4,LaneIndex,,"[""V128"",""Int32""]","[""V128""]",253,simd -29,i64x2_extract_lane,i64x2.extract_lane,extract_lane_i64x2,LaneIndex,,"[""V128""]","[""Int64""]",253,simd -30,i64x2_replace_lane,i64x2.replace_lane,replace_lane_i64x2,LaneIndex,,"[""V128"",""Int64""]","[""V128""]",253,simd -31,f32x4_extract_lane,f32x4.extract_lane,extract_lane_f32x4,LaneIndex,,"[""V128""]","[""Float32""]",253,simd -32,f32x4_replace_lane,f32x4.replace_lane,replace_lane_f32x4,LaneIndex,,"[""V128"",""Float32""]","[""V128""]",253,simd -33,f64x2_extract_lane,f64x2.extract_lane,extract_lane_f64x2,LaneIndex,,"[""V128""]","[""Float64""]",253,simd -34,f64x2_replace_lane,f64x2.replace_lane,replace_lane_f64x2,LaneIndex,,"[""V128"",""Float64""]","[""V128""]",253,simd -35,i8x16_eq,i8x16.eq,eq_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -36,i8x16_ne,i8x16.ne,ne_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -37,i8x16_lt_s,i8x16.lt_s,lt_s_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -38,i8x16_lt_u,i8x16.lt_u,lt_u_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -39,i8x16_gt_s,i8x16.gt_s,gt_s_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -40,i8x16_gt_u,i8x16.gt_u,gt_u_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -41,i8x16_le_s,i8x16.le_s,le_s_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -42,i8x16_le_u,i8x16.le_u,le_u_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -43,i8x16_ge_s,i8x16.ge_s,ge_s_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -44,i8x16_ge_u,i8x16.ge_u,ge_u_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -45,i16x8_eq,i16x8.eq,eq_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -46,i16x8_ne,i16x8.ne,ne_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -47,i16x8_lt_s,i16x8.lt_s,lt_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -48,i16x8_lt_u,i16x8.lt_u,lt_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -49,i16x8_gt_s,i16x8.gt_s,gt_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -50,i16x8_gt_u,i16x8.gt_u,gt_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -51,i16x8_le_s,i16x8.le_s,le_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -52,i16x8_le_u,i16x8.le_u,le_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -53,i16x8_ge_s,i16x8.ge_s,ge_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -54,i16x8_ge_u,i16x8.ge_u,ge_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -55,i32x4_eq,i32x4.eq,eq_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -56,i32x4_ne,i32x4.ne,ne_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -57,i32x4_lt_s,i32x4.lt_s,lt_s_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -58,i32x4_lt_u,i32x4.lt_u,lt_u_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -59,i32x4_gt_s,i32x4.gt_s,gt_s_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -60,i32x4_gt_u,i32x4.gt_u,gt_u_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -61,i32x4_le_s,i32x4.le_s,le_s_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -62,i32x4_le_u,i32x4.le_u,le_u_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -63,i32x4_ge_s,i32x4.ge_s,ge_s_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -64,i32x4_ge_u,i32x4.ge_u,ge_u_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -65,f32x4_eq,f32x4.eq,eq_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -66,f32x4_ne,f32x4.ne,ne_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -67,f32x4_lt,f32x4.lt,lt_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -68,f32x4_gt,f32x4.gt,gt_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -69,f32x4_le,f32x4.le,le_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -70,f32x4_ge,f32x4.ge,ge_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -71,f64x2_eq,f64x2.eq,eq_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -72,f64x2_ne,f64x2.ne,ne_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -73,f64x2_lt,f64x2.lt,lt_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -74,f64x2_gt,f64x2.gt,gt_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -75,f64x2_le,f64x2.le,le_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -76,f64x2_ge,f64x2.ge,ge_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -77,v128_not,v128.not,not_v128,,,"[""V128""]","[""V128""]",253,simd -78,v128_and,v128.and,and_v128,,,"[""V128"",""V128""]","[""V128""]",253,simd -79,v128_andnot,v128.andnot,andnot_v128,,,"[""V128"",""V128""]","[""V128""]",253,simd -80,v128_or,v128.or,or_v128,,,"[""V128"",""V128""]","[""V128""]",253,simd -81,v128_xor,v128.xor,xor_v128,,,"[""V128"",""V128""]","[""V128""]",253,simd -82,v128_bitselect,v128.bitselect,bitselect_v128,,,"[""V128"",""V128"",""V128""]","[""V128""]",253,simd -83,v128_any_true,v128.any_true,any_true_v128,,,"[""V128""]","[""Int32""]",253,simd -84,v128_load8_lane,v128.load8_lane,load8_lane_v128,MemoryImmediate,,"[""Int32"",""V128""]","[""V128""]",253,simd -85,v128_load16_lane,v128.load16_lane,load16_lane_v128,MemoryImmediate,,"[""Int32"",""V128""]","[""V128""]",253,simd -86,v128_load32_lane,v128.load32_lane,load32_lane_v128,MemoryImmediate,,"[""Int32"",""V128""]","[""V128""]",253,simd -87,v128_load64_lane,v128.load64_lane,load64_lane_v128,MemoryImmediate,,"[""Int32"",""V128""]","[""V128""]",253,simd -88,v128_store8_lane,v128.store8_lane,store8_lane_v128,MemoryImmediate,,"[""Int32"",""V128""]",,253,simd -89,v128_store16_lane,v128.store16_lane,store16_lane_v128,MemoryImmediate,,"[""Int32"",""V128""]",,253,simd -90,v128_store32_lane,v128.store32_lane,store32_lane_v128,MemoryImmediate,,"[""Int32"",""V128""]",,253,simd -91,v128_store64_lane,v128.store64_lane,store64_lane_v128,MemoryImmediate,,"[""Int32"",""V128""]",,253,simd -92,v128_load32_zero,v128.load32_zero,load32_zero_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -93,v128_load64_zero,v128.load64_zero,load64_zero_v128,MemoryImmediate,,"[""Int32""]","[""V128""]",253,simd -94,i32x4_trunc_sat_f32x4_s,i32x4.trunc_sat_f32x4_s,trunc_sat_f32x4_s_i32x4,,,"[""V128""]","[""V128""]",253,simd -95,i32x4_trunc_sat_f32x4_u,i32x4.trunc_sat_f32x4_u,trunc_sat_f32x4_u_i32x4,,,"[""V128""]","[""V128""]",253,simd -96,i8x16_abs,i8x16.abs,abs_i8x16,,,"[""V128""]","[""V128""]",253,simd -97,i8x16_neg,i8x16.neg,neg_i8x16,,,"[""V128""]","[""V128""]",253,simd -98,i8x16_popcnt,i8x16.popcnt,popcnt_i8x16,,,"[""V128""]","[""V128""]",253,simd -99,i8x16_all_true,i8x16.all_true,all_true_i8x16,,,"[""V128""]","[""Int32""]",253,simd -100,i8x16_bitmask,i8x16.bitmask,bitmask_i8x16,,,"[""V128""]","[""Int32""]",253,simd -101,i8x16_narrow_i16x8_s,i8x16.narrow_i16x8_s,narrow_i16x8_s_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -102,i8x16_narrow_i16x8_u,i8x16.narrow_i16x8_u,narrow_i16x8_u_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -103,f32x4_ceil,f32x4.ceil,ceil_f32x4,,,"[""V128""]","[""V128""]",253,simd -104,f32x4_floor,f32x4.floor,floor_f32x4,,,"[""V128""]","[""V128""]",253,simd -105,f32x4_trunc,f32x4.trunc,trunc_f32x4,,,"[""V128""]","[""V128""]",253,simd -106,f32x4_nearest,f32x4.nearest,nearest_f32x4,,,"[""V128""]","[""V128""]",253,simd -107,i8x16_shl,i8x16.shl,shl_i8x16,,,"[""V128"",""Int32""]","[""V128""]",253,simd -108,i8x16_shr_s,i8x16.shr_s,shr_s_i8x16,,,"[""V128"",""Int32""]","[""V128""]",253,simd -109,i8x16_shr_u,i8x16.shr_u,shr_u_i8x16,,,"[""V128"",""Int32""]","[""V128""]",253,simd -110,i8x16_add,i8x16.add,add_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -111,i8x16_add_sat_s,i8x16.add_sat_s,add_sat_s_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -112,i8x16_add_sat_u,i8x16.add_sat_u,add_sat_u_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -113,i8x16_sub,i8x16.sub,sub_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -114,i8x16_sub_sat_s,i8x16.sub_sat_s,sub_sat_s_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -115,i8x16_sub_sat_u,i8x16.sub_sat_u,sub_sat_u_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -116,f64x2_ceil,f64x2.ceil,ceil_f64x2,,,"[""V128""]","[""V128""]",253,simd -117,f64x2_floor,f64x2.floor,floor_f64x2,,,"[""V128""]","[""V128""]",253,simd -118,i8x16_min_s,i8x16.min_s,min_s_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -119,i8x16_min_u,i8x16.min_u,min_u_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -120,i8x16_max_s,i8x16.max_s,max_s_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -121,i8x16_max_u,i8x16.max_u,max_u_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -122,f64x2_trunc,f64x2.trunc,trunc_f64x2,,,"[""V128""]","[""V128""]",253,simd -123,i8x16_avgr_u,i8x16.avgr_u,avgr_u_i8x16,,,"[""V128"",""V128""]","[""V128""]",253,simd -124,i16x8_extadd_pairwise_i8x16_s,i16x8.extadd_pairwise_i8x16_s,extadd_pairwise_i8x16_s_i16x8,,,"[""V128""]","[""V128""]",253,simd -125,i16x8_extadd_pairwise_i8x16_u,i16x8.extadd_pairwise_i8x16_u,extadd_pairwise_i8x16_u_i16x8,,,"[""V128""]","[""V128""]",253,simd -126,i32x4_extadd_pairwise_i16x8_s,i32x4.extadd_pairwise_i16x8_s,extadd_pairwise_i16x8_s_i32x4,,,"[""V128""]","[""V128""]",253,simd -127,i32x4_extadd_pairwise_i16x8_u,i32x4.extadd_pairwise_i16x8_u,extadd_pairwise_i16x8_u_i32x4,,,"[""V128""]","[""V128""]",253,simd -128,i16x8_abs,i16x8.abs,abs_i16x8,,,"[""V128""]","[""V128""]",253,simd -129,i16x8_neg,i16x8.neg,neg_i16x8,,,"[""V128""]","[""V128""]",253,simd -130,i16x8_q15mulr_sat_s,i16x8.q15mulr_sat_s,q15mulr_sat_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -131,i16x8_all_true,i16x8.all_true,all_true_i16x8,,,"[""V128""]","[""Int32""]",253,simd -132,i16x8_bitmask,i16x8.bitmask,bitmask_i16x8,,,"[""V128""]","[""Int32""]",253,simd -133,i16x8_narrow_i32x4_s,i16x8.narrow_i32x4_s,narrow_i32x4_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -134,i16x8_narrow_i32x4_u,i16x8.narrow_i32x4_u,narrow_i32x4_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -135,i16x8_extend_low_i8x16_s,i16x8.extend_low_i8x16_s,extend_low_i8x16_s_i16x8,,,"[""V128""]","[""V128""]",253,simd -136,i16x8_extend_high_i8x16_s,i16x8.extend_high_i8x16_s,extend_high_i8x16_s_i16x8,,,"[""V128""]","[""V128""]",253,simd -137,i16x8_extend_low_i8x16_u,i16x8.extend_low_i8x16_u,extend_low_i8x16_u_i16x8,,,"[""V128""]","[""V128""]",253,simd -138,i16x8_extend_high_i8x16_u,i16x8.extend_high_i8x16_u,extend_high_i8x16_u_i16x8,,,"[""V128""]","[""V128""]",253,simd -139,i16x8_shl,i16x8.shl,shl_i16x8,,,"[""V128"",""Int32""]","[""V128""]",253,simd -140,i16x8_shr_s,i16x8.shr_s,shr_s_i16x8,,,"[""V128"",""Int32""]","[""V128""]",253,simd -141,i16x8_shr_u,i16x8.shr_u,shr_u_i16x8,,,"[""V128"",""Int32""]","[""V128""]",253,simd -142,i16x8_add,i16x8.add,add_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -143,i16x8_add_sat_s,i16x8.add_sat_s,add_sat_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -144,i16x8_add_sat_u,i16x8.add_sat_u,add_sat_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -145,i16x8_sub,i16x8.sub,sub_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -146,i16x8_sub_sat_s,i16x8.sub_sat_s,sub_sat_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -147,i16x8_sub_sat_u,i16x8.sub_sat_u,sub_sat_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -148,f64x2_nearest,f64x2.nearest,nearest_f64x2,,,"[""V128""]","[""V128""]",253,simd -149,i16x8_mul,i16x8.mul,mul_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -150,i16x8_min_s,i16x8.min_s,min_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -151,i16x8_min_u,i16x8.min_u,min_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -152,i16x8_max_s,i16x8.max_s,max_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -153,i16x8_max_u,i16x8.max_u,max_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -155,i16x8_avgr_u,i16x8.avgr_u,avgr_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -156,i16x8_extmul_low_i8x16_s,i16x8.extmul_low_i8x16_s,extmul_low_i8x16_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -157,i16x8_extmul_high_i8x16_s,i16x8.extmul_high_i8x16_s,extmul_high_i8x16_s_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -158,i16x8_extmul_low_i8x16_u,i16x8.extmul_low_i8x16_u,extmul_low_i8x16_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -159,i16x8_extmul_high_i8x16_u,i16x8.extmul_high_i8x16_u,extmul_high_i8x16_u_i16x8,,,"[""V128"",""V128""]","[""V128""]",253,simd -160,i32x4_abs,i32x4.abs,abs_i32x4,,,"[""V128""]","[""V128""]",253,simd -161,i32x4_neg,i32x4.neg,neg_i32x4,,,"[""V128""]","[""V128""]",253,simd -163,i32x4_all_true,i32x4.all_true,all_true_i32x4,,,"[""V128""]","[""Int32""]",253,simd -164,i32x4_bitmask,i32x4.bitmask,bitmask_i32x4,,,"[""V128""]","[""Int32""]",253,simd -167,i32x4_extend_low_i16x8_s,i32x4.extend_low_i16x8_s,extend_low_i16x8_s_i32x4,,,"[""V128""]","[""V128""]",253,simd -168,i32x4_extend_high_i16x8_s,i32x4.extend_high_i16x8_s,extend_high_i16x8_s_i32x4,,,"[""V128""]","[""V128""]",253,simd -169,i32x4_extend_low_i16x8_u,i32x4.extend_low_i16x8_u,extend_low_i16x8_u_i32x4,,,"[""V128""]","[""V128""]",253,simd -170,i32x4_extend_high_i16x8_u,i32x4.extend_high_i16x8_u,extend_high_i16x8_u_i32x4,,,"[""V128""]","[""V128""]",253,simd -171,i32x4_shl,i32x4.shl,shl_i32x4,,,"[""V128"",""Int32""]","[""V128""]",253,simd -172,i32x4_shr_s,i32x4.shr_s,shr_s_i32x4,,,"[""V128"",""Int32""]","[""V128""]",253,simd -173,i32x4_shr_u,i32x4.shr_u,shr_u_i32x4,,,"[""V128"",""Int32""]","[""V128""]",253,simd -174,i32x4_add,i32x4.add,add_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -175,f32x4_convert_i32x4_s,f32x4.convert_i32x4_s,convert_i32x4_s_f32x4,,,"[""V128""]","[""V128""]",253,simd -176,f32x4_convert_i32x4_u,f32x4.convert_i32x4_u,convert_i32x4_u_f32x4,,,"[""V128""]","[""V128""]",253,simd -177,i32x4_sub,i32x4.sub,sub_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -181,i32x4_mul,i32x4.mul,mul_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -182,i32x4_min_s,i32x4.min_s,min_s_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -183,i32x4_min_u,i32x4.min_u,min_u_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -184,i32x4_max_s,i32x4.max_s,max_s_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -185,i32x4_max_u,i32x4.max_u,max_u_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -186,i32x4_dot_i16x8_s,i32x4.dot_i16x8_s,dot_i16x8_s_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -188,i32x4_extmul_low_i16x8_s,i32x4.extmul_low_i16x8_s,extmul_low_i16x8_s_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -189,i32x4_extmul_high_i16x8_s,i32x4.extmul_high_i16x8_s,extmul_high_i16x8_s_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -190,i32x4_extmul_low_i16x8_u,i32x4.extmul_low_i16x8_u,extmul_low_i16x8_u_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -191,i32x4_extmul_high_i16x8_u,i32x4.extmul_high_i16x8_u,extmul_high_i16x8_u_i32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -192,i64x2_abs,i64x2.abs,abs_i64x2,,,"[""V128""]","[""V128""]",253,simd -193,i64x2_neg,i64x2.neg,neg_i64x2,,,"[""V128""]","[""V128""]",253,simd -195,i64x2_all_true,i64x2.all_true,all_true_i64x2,,,"[""V128""]","[""Int32""]",253,simd -196,i64x2_bitmask,i64x2.bitmask,bitmask_i64x2,,,"[""V128""]","[""Int32""]",253,simd -199,i64x2_extend_low_i32x4_s,i64x2.extend_low_i32x4_s,extend_low_i32x4_s_i64x2,,,"[""V128""]","[""V128""]",253,simd -200,i64x2_extend_high_i32x4_s,i64x2.extend_high_i32x4_s,extend_high_i32x4_s_i64x2,,,"[""V128""]","[""V128""]",253,simd -201,i64x2_extend_low_i32x4_u,i64x2.extend_low_i32x4_u,extend_low_i32x4_u_i64x2,,,"[""V128""]","[""V128""]",253,simd -202,i64x2_extend_high_i32x4_u,i64x2.extend_high_i32x4_u,extend_high_i32x4_u_i64x2,,,"[""V128""]","[""V128""]",253,simd -203,i64x2_shl,i64x2.shl,shl_i64x2,,,"[""V128"",""Int32""]","[""V128""]",253,simd -204,i64x2_shr_s,i64x2.shr_s,shr_s_i64x2,,,"[""V128"",""Int32""]","[""V128""]",253,simd -205,i64x2_shr_u,i64x2.shr_u,shr_u_i64x2,,,"[""V128"",""Int32""]","[""V128""]",253,simd -206,i64x2_add,i64x2.add,add_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -209,i64x2_sub,i64x2.sub,sub_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -213,i64x2_mul,i64x2.mul,mul_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -214,i64x2_eq,i64x2.eq,eq_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -215,i64x2_ne,i64x2.ne,ne_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -216,i64x2_lt_s,i64x2.lt_s,lt_s_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -217,i64x2_gt_s,i64x2.gt_s,gt_s_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -218,i64x2_le_s,i64x2.le_s,le_s_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -219,i64x2_ge_s,i64x2.ge_s,ge_s_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -220,i64x2_extmul_low_i32x4_s,i64x2.extmul_low_i32x4_s,extmul_low_i32x4_s_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -221,i64x2_extmul_high_i32x4_s,i64x2.extmul_high_i32x4_s,extmul_high_i32x4_s_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -222,i64x2_extmul_low_i32x4_u,i64x2.extmul_low_i32x4_u,extmul_low_i32x4_u_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -223,i64x2_extmul_high_i32x4_u,i64x2.extmul_high_i32x4_u,extmul_high_i32x4_u_i64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -224,f32x4_abs,f32x4.abs,abs_f32x4,,,"[""V128""]","[""V128""]",253,simd -225,f32x4_neg,f32x4.neg,neg_f32x4,,,"[""V128""]","[""V128""]",253,simd -227,f32x4_sqrt,f32x4.sqrt,sqrt_f32x4,,,"[""V128""]","[""V128""]",253,simd -228,f32x4_add,f32x4.add,add_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -229,f32x4_sub,f32x4.sub,sub_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -230,f32x4_mul,f32x4.mul,mul_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -231,f32x4_div,f32x4.div,div_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -232,f32x4_min,f32x4.min,min_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -233,f32x4_max,f32x4.max,max_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -234,f32x4_pmin,f32x4.pmin,pmin_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -235,f32x4_pmax,f32x4.pmax,pmax_f32x4,,,"[""V128"",""V128""]","[""V128""]",253,simd -236,f64x2_abs,f64x2.abs,abs_f64x2,,,"[""V128""]","[""V128""]",253,simd -237,f64x2_neg,f64x2.neg,neg_f64x2,,,"[""V128""]","[""V128""]",253,simd -239,f64x2_sqrt,f64x2.sqrt,sqrt_f64x2,,,"[""V128""]","[""V128""]",253,simd -240,f64x2_add,f64x2.add,add_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -241,f64x2_sub,f64x2.sub,sub_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -242,f64x2_mul,f64x2.mul,mul_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -243,f64x2_div,f64x2.div,div_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -244,f64x2_min,f64x2.min,min_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -245,f64x2_max,f64x2.max,max_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -246,f64x2_pmin,f64x2.pmin,pmin_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -247,f64x2_pmax,f64x2.pmax,pmax_f64x2,,,"[""V128"",""V128""]","[""V128""]",253,simd -248,i32x4_trunc_sat_f64x2_s_zero,i32x4.trunc_sat_f64x2_s_zero,trunc_sat_f64x2_s_zero_i32x4,,,"[""V128""]","[""V128""]",253,simd -249,i32x4_trunc_sat_f64x2_u_zero,i32x4.trunc_sat_f64x2_u_zero,trunc_sat_f64x2_u_zero_i32x4,,,"[""V128""]","[""V128""]",253,simd -250,f64x2_convert_low_i32x4_s,f64x2.convert_low_i32x4_s,convert_low_i32x4_s_f64x2,,,"[""V128""]","[""V128""]",253,simd -251,f64x2_convert_low_i32x4_u,f64x2.convert_low_i32x4_u,convert_low_i32x4_u_f64x2,,,"[""V128""]","[""V128""]",253,simd -252,f32x4_demote_f64x2_zero,f32x4.demote_f64x2_zero,demote_f64x2_zero_f32x4,,,"[""V128""]","[""V128""]",253,simd -253,f64x2_promote_low_f32x4,f64x2.promote_low_f32x4,promote_low_f32x4_f64x2,,,"[""V128""]","[""V128""]",253,simd diff --git a/generator/opcodes.json b/generator/opcodes.json new file mode 100644 index 0000000..21cc2b4 --- /dev/null +++ b/generator/opcodes.json @@ -0,0 +1,15 @@ +{ + "description": "WebAssembly opcode definitions, split by feature/proposal.", + "includes": [ + "opcodes/core.json", + "opcodes/exception-handling.json", + "opcodes/tail-call.json", + "opcodes/sign-extend.json", + "opcodes/sat-trunc.json", + "opcodes/bulk-memory.json", + "opcodes/reference-types.json", + "opcodes/simd.json", + "opcodes/threads.json", + "opcodes/relaxed-simd.json" + ] +} diff --git a/generator/opcodes/bulk-memory.json b/generator/opcodes/bulk-memory.json new file mode 100644 index 0000000..75d726f --- /dev/null +++ b/generator/opcodes/bulk-memory.json @@ -0,0 +1,120 @@ +[ + { + "value": 8, + "name": "memory_init", + "mnemonic": "memory.init", + "friendlyName": "memory_init", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32", + "Int32" + ], + "push": null, + "prefix": 252, + "feature": "bulk-memory", + "group": "bulk-memory", + "order": 193 + }, + { + "value": 9, + "name": "data_drop", + "mnemonic": "data.drop", + "friendlyName": "data_drop", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": null, + "push": null, + "prefix": 252, + "feature": "bulk-memory", + "group": "bulk-memory", + "order": 194 + }, + { + "value": 10, + "name": "memory_copy", + "mnemonic": "memory.copy", + "friendlyName": "memory_copy", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32", + "Int32" + ], + "push": null, + "prefix": 252, + "feature": "bulk-memory", + "group": "bulk-memory", + "order": 195 + }, + { + "value": 11, + "name": "memory_fill", + "mnemonic": "memory.fill", + "friendlyName": "memory_fill", + "immediate": "VarUInt1", + "controlFlow": null, + "pop": [ + "Int32", + "Int32", + "Int32" + ], + "push": null, + "prefix": 252, + "feature": "bulk-memory", + "group": "bulk-memory", + "order": 196 + }, + { + "value": 12, + "name": "table_init", + "mnemonic": "table.init", + "friendlyName": "table_init", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32", + "Int32" + ], + "push": null, + "prefix": 252, + "feature": "bulk-memory", + "group": "bulk-memory", + "order": 197 + }, + { + "value": 13, + "name": "elem_drop", + "mnemonic": "elem.drop", + "friendlyName": "elem_drop", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": null, + "push": null, + "prefix": 252, + "feature": "bulk-memory", + "group": "bulk-memory", + "order": 198 + }, + { + "value": 14, + "name": "table_copy", + "mnemonic": "table.copy", + "friendlyName": "table_copy", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32", + "Int32" + ], + "push": null, + "prefix": 252, + "feature": "bulk-memory", + "group": "bulk-memory", + "order": 199 + } +] diff --git a/generator/opcodes/core.json b/generator/opcodes/core.json new file mode 100644 index 0000000..c591d0c --- /dev/null +++ b/generator/opcodes/core.json @@ -0,0 +1,3103 @@ +[ + { + "value": 0, + "name": "unreachable", + "mnemonic": "unreachable", + "friendlyName": "unreachable", + "immediate": null, + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": null, + "group": "control-flow", + "order": 0 + }, + { + "value": 1, + "name": "nop", + "mnemonic": "nop", + "friendlyName": "nop", + "immediate": null, + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": null, + "group": "control-flow", + "order": 1 + }, + { + "value": 2, + "name": "block", + "mnemonic": "block", + "friendlyName": "block", + "immediate": "BlockSignature", + "controlFlow": "Push", + "pop": null, + "push": null, + "prefix": null, + "feature": null, + "group": "control-flow", + "order": 2 + }, + { + "value": 3, + "name": "loop", + "mnemonic": "loop", + "friendlyName": "loop", + "immediate": "BlockSignature", + "controlFlow": "Push", + "pop": null, + "push": null, + "prefix": null, + "feature": null, + "group": "control-flow", + "order": 3 + }, + { + "value": 4, + "name": "if", + "mnemonic": "if", + "friendlyName": "if", + "immediate": "BlockSignature", + "controlFlow": "Push", + "pop": [ + "Int32" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "control-flow", + "order": 4 + }, + { + "value": 5, + "name": "else", + "mnemonic": "else", + "friendlyName": "else", + "immediate": null, + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": null, + "group": "control-flow", + "order": 5 + }, + { + "value": 11, + "name": "end", + "mnemonic": "end", + "friendlyName": "end", + "immediate": null, + "controlFlow": "Pop", + "pop": null, + "push": null, + "prefix": null, + "feature": null, + "group": "control-flow", + "order": 10 + }, + { + "value": 12, + "name": "br", + "mnemonic": "br", + "friendlyName": "br", + "immediate": "RelativeDepth", + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": null, + "group": "control-flow", + "order": 11 + }, + { + "value": 13, + "name": "br_if", + "mnemonic": "br_if", + "friendlyName": "br_if", + "immediate": "RelativeDepth", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "control-flow", + "order": 12 + }, + { + "value": 14, + "name": "br_table", + "mnemonic": "br_table", + "friendlyName": "br_table", + "immediate": "BranchTable", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "control-flow", + "order": 13 + }, + { + "value": 15, + "name": "return", + "mnemonic": "return", + "friendlyName": "return", + "immediate": null, + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": null, + "group": "control-flow", + "order": 14 + }, + { + "value": 16, + "name": "call", + "mnemonic": "call", + "friendlyName": "call", + "immediate": "Function", + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": null, + "group": "call", + "order": 15 + }, + { + "value": 17, + "name": "call_indirect", + "mnemonic": "call_indirect", + "friendlyName": "call_indirect", + "immediate": "IndirectFunction", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "call", + "order": 16 + }, + { + "value": 26, + "name": "drop", + "mnemonic": "drop", + "friendlyName": "drop", + "immediate": null, + "controlFlow": null, + "pop": [ + "Any" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "parametric", + "order": 21 + }, + { + "value": 27, + "name": "select", + "mnemonic": "select", + "friendlyName": "select", + "immediate": null, + "controlFlow": null, + "pop": [ + "Any", + "Any", + "Int32" + ], + "push": [ + "Any" + ], + "prefix": null, + "feature": null, + "group": "parametric", + "order": 22 + }, + { + "value": 32, + "name": "get_local", + "mnemonic": "local.get", + "friendlyName": "get_local", + "immediate": "Local", + "controlFlow": null, + "pop": null, + "push": [ + "Any" + ], + "prefix": null, + "feature": null, + "group": "variable", + "order": 23 + }, + { + "value": 33, + "name": "set_local", + "mnemonic": "local.set", + "friendlyName": "set_local", + "immediate": "Local", + "controlFlow": null, + "pop": [ + "Any" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "variable", + "order": 24 + }, + { + "value": 34, + "name": "tee_local", + "mnemonic": "local.tee", + "friendlyName": "tee_local", + "immediate": "Local", + "controlFlow": null, + "pop": [ + "Any" + ], + "push": [ + "Any" + ], + "prefix": null, + "feature": null, + "group": "variable", + "order": 25 + }, + { + "value": 35, + "name": "get_global", + "mnemonic": "global.get", + "friendlyName": "get_global", + "immediate": "Global", + "controlFlow": null, + "pop": null, + "push": [ + "Any" + ], + "prefix": null, + "feature": null, + "group": "variable", + "order": 26 + }, + { + "value": 36, + "name": "set_global", + "mnemonic": "global.set", + "friendlyName": "set_global", + "immediate": "Global", + "controlFlow": null, + "pop": [ + "Any" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "variable", + "order": 27 + }, + { + "value": 40, + "name": "i32_load", + "mnemonic": "i32.load", + "friendlyName": "load_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 28 + }, + { + "value": 41, + "name": "i64_load", + "mnemonic": "i64.load", + "friendlyName": "load_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 29 + }, + { + "value": 42, + "name": "f32_load", + "mnemonic": "f32.load", + "friendlyName": "load_f32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 30 + }, + { + "value": 43, + "name": "f64_load", + "mnemonic": "f64.load", + "friendlyName": "load_f64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 31 + }, + { + "value": 44, + "name": "i32_load8_s", + "mnemonic": "i32.load8_s", + "friendlyName": "load8_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 32 + }, + { + "value": 45, + "name": "i32_load8_u", + "mnemonic": "i32.load8_u", + "friendlyName": "load8_i32_u", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 33 + }, + { + "value": 46, + "name": "i32_load16_s", + "mnemonic": "i32.load16_s", + "friendlyName": "load16_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 34 + }, + { + "value": 47, + "name": "i32_load16_u", + "mnemonic": "i32.load16_u", + "friendlyName": "load16_i32_u", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 35 + }, + { + "value": 48, + "name": "i64_load8_s", + "mnemonic": "i64.load8_s", + "friendlyName": "load8_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 36 + }, + { + "value": 49, + "name": "i64_load8_u", + "mnemonic": "i64.load8_u", + "friendlyName": "load8_i64_u", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 37 + }, + { + "value": 50, + "name": "i64_load16_s", + "mnemonic": "i64.load16_s", + "friendlyName": "load16_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 38 + }, + { + "value": 51, + "name": "i64_load16_u", + "mnemonic": "i64.load16_u", + "friendlyName": "load16_i64_u", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 39 + }, + { + "value": 52, + "name": "i64_load32_s", + "mnemonic": "i64.load32_s", + "friendlyName": "load32_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 40 + }, + { + "value": 53, + "name": "i64_load32_u", + "mnemonic": "i64.load32_u", + "friendlyName": "load32_i64_u", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 41 + }, + { + "value": 54, + "name": "i32_store", + "mnemonic": "i32.store", + "friendlyName": "store_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "memory", + "order": 42 + }, + { + "value": 55, + "name": "i64_store", + "mnemonic": "i64.store", + "friendlyName": "store_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "memory", + "order": 43 + }, + { + "value": 56, + "name": "f32_store", + "mnemonic": "f32.store", + "friendlyName": "store_f32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Float32" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "memory", + "order": 44 + }, + { + "value": 57, + "name": "f64_store", + "mnemonic": "f64.store", + "friendlyName": "store_f64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Float64" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "memory", + "order": 45 + }, + { + "value": 58, + "name": "i32_store8", + "mnemonic": "i32.store8", + "friendlyName": "store8_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "memory", + "order": 46 + }, + { + "value": 59, + "name": "i32_store16", + "mnemonic": "i32.store16", + "friendlyName": "store16_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "memory", + "order": 47 + }, + { + "value": 60, + "name": "i64_store8", + "mnemonic": "i64.store8", + "friendlyName": "store8_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "memory", + "order": 48 + }, + { + "value": 61, + "name": "i64_store16", + "mnemonic": "i64.store16", + "friendlyName": "store16_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "memory", + "order": 49 + }, + { + "value": 62, + "name": "i64_store32", + "mnemonic": "i64.store32", + "friendlyName": "store32_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": null, + "prefix": null, + "feature": null, + "group": "memory", + "order": 50 + }, + { + "value": 63, + "name": "mem_size", + "mnemonic": "memory.size", + "friendlyName": "mem_size", + "immediate": "VarUInt1", + "controlFlow": null, + "pop": null, + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 51 + }, + { + "value": 64, + "name": "mem_grow", + "mnemonic": "memory.grow", + "friendlyName": "mem_grow", + "immediate": "VarUInt1", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "memory", + "order": 52 + }, + { + "value": 65, + "name": "i32_const", + "mnemonic": "i32.const", + "friendlyName": "const_i32", + "immediate": "VarInt32", + "controlFlow": null, + "pop": null, + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "constant", + "order": 53 + }, + { + "value": 66, + "name": "i64_const", + "mnemonic": "i64.const", + "friendlyName": "const_i64", + "immediate": "VarInt64", + "controlFlow": null, + "pop": null, + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "constant", + "order": 54 + }, + { + "value": 67, + "name": "f32_const", + "mnemonic": "f32.const", + "friendlyName": "const_f32", + "immediate": "Float32", + "controlFlow": null, + "pop": null, + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "constant", + "order": 55 + }, + { + "value": 68, + "name": "f64_const", + "mnemonic": "f64.const", + "friendlyName": "const_f64", + "immediate": "Float64", + "controlFlow": null, + "pop": null, + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "constant", + "order": 56 + }, + { + "value": 69, + "name": "i32_eqz", + "mnemonic": "i32.eqz", + "friendlyName": "eqz_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-comparison", + "order": 57 + }, + { + "value": 70, + "name": "i32_eq", + "mnemonic": "i32.eq", + "friendlyName": "eq_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-comparison", + "order": 58 + }, + { + "value": 71, + "name": "i32_ne", + "mnemonic": "i32.ne", + "friendlyName": "ne_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-comparison", + "order": 59 + }, + { + "value": 72, + "name": "i32_lt_s", + "mnemonic": "i32.lt_s", + "friendlyName": "lt_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-comparison", + "order": 60 + }, + { + "value": 73, + "name": "i32_lt_u", + "mnemonic": "i32.lt_u", + "friendlyName": "lt_i32_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-comparison", + "order": 61 + }, + { + "value": 74, + "name": "i32_gt_s", + "mnemonic": "i32.gt_s", + "friendlyName": "gt_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-comparison", + "order": 62 + }, + { + "value": 75, + "name": "i32_gt_u", + "mnemonic": "i32.gt_u", + "friendlyName": "gt_i32_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-comparison", + "order": 63 + }, + { + "value": 76, + "name": "i32_le_s", + "mnemonic": "i32.le_s", + "friendlyName": "le_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-comparison", + "order": 64 + }, + { + "value": 77, + "name": "i32_le_u", + "mnemonic": "i32.le_u", + "friendlyName": "le_i32_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-comparison", + "order": 65 + }, + { + "value": 78, + "name": "i32_ge_s", + "mnemonic": "i32.ge_s", + "friendlyName": "ge_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-comparison", + "order": 66 + }, + { + "value": 79, + "name": "i32_ge_u", + "mnemonic": "i32.ge_u", + "friendlyName": "ge_i32_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-comparison", + "order": 67 + }, + { + "value": 80, + "name": "i64_eqz", + "mnemonic": "i64.eqz", + "friendlyName": "eqz_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i64-comparison", + "order": 68 + }, + { + "value": 81, + "name": "i64_eq", + "mnemonic": "i64.eq", + "friendlyName": "eq_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i64-comparison", + "order": 69 + }, + { + "value": 82, + "name": "i64_ne", + "mnemonic": "i64.ne", + "friendlyName": "ne_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i64-comparison", + "order": 70 + }, + { + "value": 83, + "name": "i64_lt_s", + "mnemonic": "i64.lt_s", + "friendlyName": "lt_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i64-comparison", + "order": 71 + }, + { + "value": 84, + "name": "i64_lt_u", + "mnemonic": "i64.lt_u", + "friendlyName": "lt_i64_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i64-comparison", + "order": 72 + }, + { + "value": 85, + "name": "i64_gt_s", + "mnemonic": "i64.gt_s", + "friendlyName": "gt_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i64-comparison", + "order": 73 + }, + { + "value": 86, + "name": "i64_gt_u", + "mnemonic": "i64.gt_u", + "friendlyName": "gt_i64_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i64-comparison", + "order": 74 + }, + { + "value": 87, + "name": "i64_le_s", + "mnemonic": "i64.le_s", + "friendlyName": "le_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i64-comparison", + "order": 75 + }, + { + "value": 88, + "name": "i64_le_u", + "mnemonic": "i64.le_u", + "friendlyName": "le_i64_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i64-comparison", + "order": 76 + }, + { + "value": 89, + "name": "i64_ge_s", + "mnemonic": "i64.ge_s", + "friendlyName": "ge_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i64-comparison", + "order": 77 + }, + { + "value": 90, + "name": "i64_ge_u", + "mnemonic": "i64.ge_u", + "friendlyName": "ge_i64_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i64-comparison", + "order": 78 + }, + { + "value": 91, + "name": "f32_eq", + "mnemonic": "f32.eq", + "friendlyName": "eq_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f32-comparison", + "order": 79 + }, + { + "value": 92, + "name": "f32_ne", + "mnemonic": "f32.ne", + "friendlyName": "ne_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f32-comparison", + "order": 80 + }, + { + "value": 93, + "name": "f32_lt", + "mnemonic": "f32.lt", + "friendlyName": "lt_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f32-comparison", + "order": 81 + }, + { + "value": 94, + "name": "f32_gt", + "mnemonic": "f32.gt", + "friendlyName": "gt_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f32-comparison", + "order": 82 + }, + { + "value": 95, + "name": "f32_le", + "mnemonic": "f32.le", + "friendlyName": "le_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f32-comparison", + "order": 83 + }, + { + "value": 96, + "name": "f32_ge", + "mnemonic": "f32.ge", + "friendlyName": "ge_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f32-comparison", + "order": 84 + }, + { + "value": 97, + "name": "f64_eq", + "mnemonic": "f64.eq", + "friendlyName": "eq_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f64-comparison", + "order": 85 + }, + { + "value": 98, + "name": "f64_ne", + "mnemonic": "f64.ne", + "friendlyName": "ne_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f64-comparison", + "order": 86 + }, + { + "value": 99, + "name": "f64_lt", + "mnemonic": "f64.lt", + "friendlyName": "lt_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f64-comparison", + "order": 87 + }, + { + "value": 100, + "name": "f64_gt", + "mnemonic": "f64.gt", + "friendlyName": "gt_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f64-comparison", + "order": 88 + }, + { + "value": 101, + "name": "f64_le", + "mnemonic": "f64.le", + "friendlyName": "le_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f64-comparison", + "order": 89 + }, + { + "value": 102, + "name": "f64_ge", + "mnemonic": "f64.ge", + "friendlyName": "ge_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "f64-comparison", + "order": 90 + }, + { + "value": 103, + "name": "i32_clz", + "mnemonic": "i32.clz", + "friendlyName": "clz_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-bitwise", + "order": 91 + }, + { + "value": 104, + "name": "i32_ctz", + "mnemonic": "i32.ctz", + "friendlyName": "ctz_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-bitwise", + "order": 92 + }, + { + "value": 105, + "name": "i32_popcnt", + "mnemonic": "i32.popcnt", + "friendlyName": "popcnt_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-bitwise", + "order": 93 + }, + { + "value": 106, + "name": "i32_add", + "mnemonic": "i32.add", + "friendlyName": "add_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-arithmetic", + "order": 94 + }, + { + "value": 107, + "name": "i32_sub", + "mnemonic": "i32.sub", + "friendlyName": "sub_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-arithmetic", + "order": 95 + }, + { + "value": 108, + "name": "i32_mul", + "mnemonic": "i32.mul", + "friendlyName": "mul_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-arithmetic", + "order": 96 + }, + { + "value": 109, + "name": "i32_div_s", + "mnemonic": "i32.div_s", + "friendlyName": "div_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-arithmetic", + "order": 97 + }, + { + "value": 110, + "name": "i32_div_u", + "mnemonic": "i32.div_u", + "friendlyName": "div_i32_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-arithmetic", + "order": 98 + }, + { + "value": 111, + "name": "i32_rem_s", + "mnemonic": "i32.rem_s", + "friendlyName": "rem_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-arithmetic", + "order": 99 + }, + { + "value": 112, + "name": "i32_rem_u", + "mnemonic": "i32.rem_u", + "friendlyName": "rem_i32_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-arithmetic", + "order": 100 + }, + { + "value": 113, + "name": "i32_and", + "mnemonic": "i32.and", + "friendlyName": "and_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-bitwise", + "order": 101 + }, + { + "value": 114, + "name": "i32_or", + "mnemonic": "i32.or", + "friendlyName": "or_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-bitwise", + "order": 102 + }, + { + "value": 115, + "name": "i32_xor", + "mnemonic": "i32.xor", + "friendlyName": "xor_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-bitwise", + "order": 103 + }, + { + "value": 116, + "name": "i32_shl", + "mnemonic": "i32.shl", + "friendlyName": "shl_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-bitwise", + "order": 104 + }, + { + "value": 117, + "name": "i32_shr_s", + "mnemonic": "i32.shr_s", + "friendlyName": "shr_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-bitwise", + "order": 105 + }, + { + "value": 118, + "name": "i32_shr_u", + "mnemonic": "i32.shr_u", + "friendlyName": "shr_i32_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-bitwise", + "order": 106 + }, + { + "value": 119, + "name": "i32_rotl", + "mnemonic": "i32.rotl", + "friendlyName": "rotl_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-bitwise", + "order": 107 + }, + { + "value": 120, + "name": "i32_rotr", + "mnemonic": "i32.rotr", + "friendlyName": "rotr_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "i32-bitwise", + "order": 108 + }, + { + "value": 121, + "name": "i64_clz", + "mnemonic": "i64.clz", + "friendlyName": "clz_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-bitwise", + "order": 109 + }, + { + "value": 122, + "name": "i64_ctz", + "mnemonic": "i64.ctz", + "friendlyName": "ctz_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-bitwise", + "order": 110 + }, + { + "value": 123, + "name": "i64_popcnt", + "mnemonic": "i64.popcnt", + "friendlyName": "popcnt_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-bitwise", + "order": 111 + }, + { + "value": 124, + "name": "i64_add", + "mnemonic": "i64.add", + "friendlyName": "add_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-arithmetic", + "order": 112 + }, + { + "value": 125, + "name": "i64_sub", + "mnemonic": "i64.sub", + "friendlyName": "sub_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-arithmetic", + "order": 113 + }, + { + "value": 126, + "name": "i64_mul", + "mnemonic": "i64.mul", + "friendlyName": "mul_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-arithmetic", + "order": 114 + }, + { + "value": 127, + "name": "i64_div_s", + "mnemonic": "i64.div_s", + "friendlyName": "div_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-arithmetic", + "order": 115 + }, + { + "value": 128, + "name": "i64_div_u", + "mnemonic": "i64.div_u", + "friendlyName": "div_i64_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-arithmetic", + "order": 116 + }, + { + "value": 129, + "name": "i64_rem_s", + "mnemonic": "i64.rem_s", + "friendlyName": "rem_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-arithmetic", + "order": 117 + }, + { + "value": 130, + "name": "i64_rem_u", + "mnemonic": "i64.rem_u", + "friendlyName": "rem_i64_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-arithmetic", + "order": 118 + }, + { + "value": 131, + "name": "i64_and", + "mnemonic": "i64.and", + "friendlyName": "and_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-bitwise", + "order": 119 + }, + { + "value": 132, + "name": "i64_or", + "mnemonic": "i64.or", + "friendlyName": "or_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-bitwise", + "order": 120 + }, + { + "value": 133, + "name": "i64_xor", + "mnemonic": "i64.xor", + "friendlyName": "xor_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-bitwise", + "order": 121 + }, + { + "value": 134, + "name": "i64_shl", + "mnemonic": "i64.shl", + "friendlyName": "shl_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-bitwise", + "order": 122 + }, + { + "value": 135, + "name": "i64_shr_s", + "mnemonic": "i64.shr_s", + "friendlyName": "shr_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-bitwise", + "order": 123 + }, + { + "value": 136, + "name": "i64_shr_u", + "mnemonic": "i64.shr_u", + "friendlyName": "shr_i64_u", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-bitwise", + "order": 124 + }, + { + "value": 137, + "name": "i64_rotl", + "mnemonic": "i64.rotl", + "friendlyName": "rotl_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-bitwise", + "order": 125 + }, + { + "value": 138, + "name": "i64_rotr", + "mnemonic": "i64.rotr", + "friendlyName": "rotr_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "i64-bitwise", + "order": 126 + }, + { + "value": 139, + "name": "f32_abs", + "mnemonic": "f32.abs", + "friendlyName": "abs_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 127 + }, + { + "value": 140, + "name": "f32_neg", + "mnemonic": "f32.neg", + "friendlyName": "neg_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 128 + }, + { + "value": 141, + "name": "f32_ceil", + "mnemonic": "f32.ceil", + "friendlyName": "ceil_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 129 + }, + { + "value": 142, + "name": "f32_floor", + "mnemonic": "f32.floor", + "friendlyName": "floor_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 130 + }, + { + "value": 143, + "name": "f32_trunc", + "mnemonic": "f32.trunc", + "friendlyName": "trunc_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 131 + }, + { + "value": 144, + "name": "f32_nearest", + "mnemonic": "f32.nearest", + "friendlyName": "nearest_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 132 + }, + { + "value": 145, + "name": "f32_sqrt", + "mnemonic": "f32.sqrt", + "friendlyName": "sqrt_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 133 + }, + { + "value": 146, + "name": "f32_add", + "mnemonic": "f32.add", + "friendlyName": "add_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 134 + }, + { + "value": 147, + "name": "f32_sub", + "mnemonic": "f32.sub", + "friendlyName": "sub_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 135 + }, + { + "value": 148, + "name": "f32_mul", + "mnemonic": "f32.mul", + "friendlyName": "mul_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 136 + }, + { + "value": 149, + "name": "f32_div", + "mnemonic": "f32.div", + "friendlyName": "div_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 137 + }, + { + "value": 150, + "name": "f32_min", + "mnemonic": "f32.min", + "friendlyName": "min_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 138 + }, + { + "value": 151, + "name": "f32_max", + "mnemonic": "f32.max", + "friendlyName": "max_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 139 + }, + { + "value": 152, + "name": "f32_copysign", + "mnemonic": "f32.copysign", + "friendlyName": "copysign_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32", + "Float32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "f32-arithmetic", + "order": 140 + }, + { + "value": 153, + "name": "f64_abs", + "mnemonic": "f64.abs", + "friendlyName": "abs_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 141 + }, + { + "value": 154, + "name": "f64_neg", + "mnemonic": "f64.neg", + "friendlyName": "neg_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 142 + }, + { + "value": 155, + "name": "f64_ceil", + "mnemonic": "f64.ceil", + "friendlyName": "ceil_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 143 + }, + { + "value": 156, + "name": "f64_floor", + "mnemonic": "f64.floor", + "friendlyName": "floor_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 144 + }, + { + "value": 157, + "name": "f64_trunc", + "mnemonic": "f64.trunc", + "friendlyName": "trunc_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 145 + }, + { + "value": 158, + "name": "f64_nearest", + "mnemonic": "f64.nearest", + "friendlyName": "nearest_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 146 + }, + { + "value": 159, + "name": "f64_sqrt", + "mnemonic": "f64.sqrt", + "friendlyName": "sqrt_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 147 + }, + { + "value": 160, + "name": "f64_add", + "mnemonic": "f64.add", + "friendlyName": "add_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 148 + }, + { + "value": 161, + "name": "f64_sub", + "mnemonic": "f64.sub", + "friendlyName": "sub_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 149 + }, + { + "value": 162, + "name": "f64_mul", + "mnemonic": "f64.mul", + "friendlyName": "mul_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 150 + }, + { + "value": 163, + "name": "f64_div", + "mnemonic": "f64.div", + "friendlyName": "div_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 151 + }, + { + "value": 164, + "name": "f64_min", + "mnemonic": "f64.min", + "friendlyName": "min_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 152 + }, + { + "value": 165, + "name": "f64_max", + "mnemonic": "f64.max", + "friendlyName": "max_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 153 + }, + { + "value": 166, + "name": "f64_copysign", + "mnemonic": "f64.copysign", + "friendlyName": "copysign_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64", + "Float64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "f64-arithmetic", + "order": 154 + }, + { + "value": 167, + "name": "i32_wrap_i64", + "mnemonic": "i32.wrap_i64", + "friendlyName": "wrap_i64_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 155 + }, + { + "value": 168, + "name": "i32_trunc_f32_s", + "mnemonic": "i32.trunc_f32_s", + "friendlyName": "trunc_f32_s_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 156 + }, + { + "value": 169, + "name": "i32_trunc_f32_u", + "mnemonic": "i32.trunc_f32_u", + "friendlyName": "trunc_f32_u_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 157 + }, + { + "value": 170, + "name": "i32_trunc_f64_s", + "mnemonic": "i32.trunc_f64_s", + "friendlyName": "trunc_f64_s_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 158 + }, + { + "value": 171, + "name": "i32_trunc_f64_u", + "mnemonic": "i32.trunc_f64_u", + "friendlyName": "trunc_f64_u_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 159 + }, + { + "value": 172, + "name": "i64_extend_i32_s", + "mnemonic": "i64.extend_i32_s", + "friendlyName": "extend_i32_s_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 160 + }, + { + "value": 173, + "name": "i64_extend_i32_u", + "mnemonic": "i64.extend_i32_u", + "friendlyName": "extend_i32_u_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 161 + }, + { + "value": 174, + "name": "i64_trunc_f32_s", + "mnemonic": "i64.trunc_f32_s", + "friendlyName": "trunc_f32_s_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 162 + }, + { + "value": 175, + "name": "i64_trunc_f32_u", + "mnemonic": "i64.trunc_f32_u", + "friendlyName": "trunc_f32_u_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 163 + }, + { + "value": 176, + "name": "i64_trunc_f64_s", + "mnemonic": "i64.trunc_f64_s", + "friendlyName": "trunc_f64_s_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 164 + }, + { + "value": 177, + "name": "i64_trunc_f64_u", + "mnemonic": "i64.trunc_f64_u", + "friendlyName": "trunc_f64_u_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 165 + }, + { + "value": 178, + "name": "f32_convert_i32_s", + "mnemonic": "f32.convert_i32_s", + "friendlyName": "convert_i32_s_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 166 + }, + { + "value": 179, + "name": "f32_convert_i32_u", + "mnemonic": "f32.convert_i32_u", + "friendlyName": "convert_i32_u_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 167 + }, + { + "value": 180, + "name": "f32_convert_i64_s", + "mnemonic": "f32.convert_i64_s", + "friendlyName": "convert_i64_s_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 168 + }, + { + "value": 181, + "name": "f32_convert_i64_u", + "mnemonic": "f32.convert_i64_u", + "friendlyName": "convert_i64_u_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 169 + }, + { + "value": 182, + "name": "f32_demote_f64", + "mnemonic": "f32.demote_f64", + "friendlyName": "demote_f64_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 170 + }, + { + "value": 183, + "name": "f64_convert_i32_s", + "mnemonic": "f64.convert_i32_s", + "friendlyName": "convert_i32_s_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 171 + }, + { + "value": 184, + "name": "f64_convert_i32_u", + "mnemonic": "f64.convert_i32_u", + "friendlyName": "convert_i32_u_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 172 + }, + { + "value": 185, + "name": "f64_convert_i64_s", + "mnemonic": "f64.convert_i64_s", + "friendlyName": "convert_i64_s_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 173 + }, + { + "value": 186, + "name": "f64_convert_i64_u", + "mnemonic": "f64.convert_i64_u", + "friendlyName": "convert_i64_u_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 174 + }, + { + "value": 187, + "name": "f64_promote_f32", + "mnemonic": "f64.promote_f32", + "friendlyName": "promote_f32_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 175 + }, + { + "value": 188, + "name": "i32_reinterpret_f32", + "mnemonic": "i32.reinterpret_f32", + "friendlyName": "reinterpret_f32_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 176 + }, + { + "value": 189, + "name": "i64_reinterpret_f64", + "mnemonic": "i64.reinterpret_f64", + "friendlyName": "reinterpret_f64_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 177 + }, + { + "value": 190, + "name": "f32_reinterpret_i32", + "mnemonic": "f32.reinterpret_i32", + "friendlyName": "reinterpret_i32_f32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Float32" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 178 + }, + { + "value": 191, + "name": "f64_reinterpret_i64", + "mnemonic": "f64.reinterpret_i64", + "friendlyName": "reinterpret_i64_f64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Float64" + ], + "prefix": null, + "feature": null, + "group": "conversion", + "order": 179 + } +] diff --git a/generator/opcodes/exception-handling.json b/generator/opcodes/exception-handling.json new file mode 100644 index 0000000..a6d0555 --- /dev/null +++ b/generator/opcodes/exception-handling.json @@ -0,0 +1,86 @@ +[ + { + "value": 6, + "name": "try", + "mnemonic": "try", + "friendlyName": "try", + "immediate": "BlockSignature", + "controlFlow": "Push", + "pop": null, + "push": null, + "prefix": null, + "feature": "exception-handling", + "group": "exception-handling", + "order": 6 + }, + { + "value": 7, + "name": "catch", + "mnemonic": "catch", + "friendlyName": "catch", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": "exception-handling", + "group": "exception-handling", + "order": 7 + }, + { + "value": 8, + "name": "throw", + "mnemonic": "throw", + "friendlyName": "throw", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": "exception-handling", + "group": "exception-handling", + "order": 8 + }, + { + "value": 9, + "name": "rethrow", + "mnemonic": "rethrow", + "friendlyName": "rethrow", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": "exception-handling", + "group": "exception-handling", + "order": 9 + }, + { + "value": 24, + "name": "delegate", + "mnemonic": "delegate", + "friendlyName": "delegate", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": "exception-handling", + "group": "exception-handling", + "order": 19 + }, + { + "value": 25, + "name": "catch_all", + "mnemonic": "catch_all", + "friendlyName": "catch_all", + "immediate": null, + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": "exception-handling", + "group": "exception-handling", + "order": 20 + } +] diff --git a/generator/opcodes/reference-types.json b/generator/opcodes/reference-types.json new file mode 100644 index 0000000..21da22f --- /dev/null +++ b/generator/opcodes/reference-types.json @@ -0,0 +1,140 @@ +[ + { + "value": 15, + "name": "table_grow", + "mnemonic": "table.grow", + "friendlyName": "table_grow", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 252, + "feature": "reference-types", + "group": "reference-types", + "order": 200 + }, + { + "value": 16, + "name": "table_size", + "mnemonic": "table.size", + "friendlyName": "table_size", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": null, + "push": [ + "Int32" + ], + "prefix": 252, + "feature": "reference-types", + "group": "reference-types", + "order": 201 + }, + { + "value": 17, + "name": "table_fill", + "mnemonic": "table.fill", + "friendlyName": "table_fill", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": [ + "Int32", + "Int32", + "Int32" + ], + "push": null, + "prefix": 252, + "feature": "reference-types", + "group": "reference-types", + "order": 202 + }, + { + "value": 208, + "name": "ref_null", + "mnemonic": "ref.null", + "friendlyName": "ref_null", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": null, + "push": [ + "Int32" + ], + "prefix": null, + "feature": "reference-types", + "group": "reference-types", + "order": 203 + }, + { + "value": 209, + "name": "ref_is_null", + "mnemonic": "ref.is_null", + "friendlyName": "ref_is_null", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": "reference-types", + "group": "reference-types", + "order": 204 + }, + { + "value": 210, + "name": "ref_func", + "mnemonic": "ref.func", + "friendlyName": "ref_func", + "immediate": "Function", + "controlFlow": null, + "pop": null, + "push": [ + "Int32" + ], + "prefix": null, + "feature": "reference-types", + "group": "reference-types", + "order": 205 + }, + { + "value": 37, + "name": "table_get", + "mnemonic": "table.get", + "friendlyName": "table_get", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": "reference-types", + "group": "reference-types", + "order": 206 + }, + { + "value": 38, + "name": "table_set", + "mnemonic": "table.set", + "friendlyName": "table_set", + "immediate": "VarUInt32", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": null, + "prefix": null, + "feature": "reference-types", + "group": "reference-types", + "order": 207 + } +] diff --git a/generator/opcodes/relaxed-simd.json b/generator/opcodes/relaxed-simd.json new file mode 100644 index 0000000..76cb20d --- /dev/null +++ b/generator/opcodes/relaxed-simd.json @@ -0,0 +1,387 @@ +[ + { + "value": 256, + "name": "i8x16_relaxed_swizzle", + "mnemonic": "i8x16.relaxed_swizzle", + "friendlyName": "relaxed_swizzle_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 511 + }, + { + "value": 257, + "name": "i32x4_relaxed_trunc_f32x4_s", + "mnemonic": "i32x4.relaxed_trunc_f32x4_s", + "friendlyName": "relaxed_trunc_f32x4_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 512 + }, + { + "value": 258, + "name": "i32x4_relaxed_trunc_f32x4_u", + "mnemonic": "i32x4.relaxed_trunc_f32x4_u", + "friendlyName": "relaxed_trunc_f32x4_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 513 + }, + { + "value": 259, + "name": "i32x4_relaxed_trunc_f64x2_s_zero", + "mnemonic": "i32x4.relaxed_trunc_f64x2_s_zero", + "friendlyName": "relaxed_trunc_f64x2_s_zero_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 514 + }, + { + "value": 260, + "name": "i32x4_relaxed_trunc_f64x2_u_zero", + "mnemonic": "i32x4.relaxed_trunc_f64x2_u_zero", + "friendlyName": "relaxed_trunc_f64x2_u_zero_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 515 + }, + { + "value": 261, + "name": "f32x4_relaxed_madd", + "mnemonic": "f32x4.relaxed_madd", + "friendlyName": "relaxed_madd_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 516 + }, + { + "value": 262, + "name": "f32x4_relaxed_nmadd", + "mnemonic": "f32x4.relaxed_nmadd", + "friendlyName": "relaxed_nmadd_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 517 + }, + { + "value": 263, + "name": "f64x2_relaxed_madd", + "mnemonic": "f64x2.relaxed_madd", + "friendlyName": "relaxed_madd_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 518 + }, + { + "value": 264, + "name": "f64x2_relaxed_nmadd", + "mnemonic": "f64x2.relaxed_nmadd", + "friendlyName": "relaxed_nmadd_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 519 + }, + { + "value": 265, + "name": "i8x16_relaxed_laneselect", + "mnemonic": "i8x16.relaxed_laneselect", + "friendlyName": "relaxed_laneselect_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 520 + }, + { + "value": 266, + "name": "i16x8_relaxed_laneselect", + "mnemonic": "i16x8.relaxed_laneselect", + "friendlyName": "relaxed_laneselect_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 521 + }, + { + "value": 267, + "name": "i32x4_relaxed_laneselect", + "mnemonic": "i32x4.relaxed_laneselect", + "friendlyName": "relaxed_laneselect_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 522 + }, + { + "value": 268, + "name": "i64x2_relaxed_laneselect", + "mnemonic": "i64x2.relaxed_laneselect", + "friendlyName": "relaxed_laneselect_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 523 + }, + { + "value": 269, + "name": "f32x4_relaxed_min", + "mnemonic": "f32x4.relaxed_min", + "friendlyName": "relaxed_min_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 524 + }, + { + "value": 270, + "name": "f32x4_relaxed_max", + "mnemonic": "f32x4.relaxed_max", + "friendlyName": "relaxed_max_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 525 + }, + { + "value": 271, + "name": "f64x2_relaxed_min", + "mnemonic": "f64x2.relaxed_min", + "friendlyName": "relaxed_min_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 526 + }, + { + "value": 272, + "name": "f64x2_relaxed_max", + "mnemonic": "f64x2.relaxed_max", + "friendlyName": "relaxed_max_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 527 + }, + { + "value": 273, + "name": "i16x8_relaxed_q15mulr_s", + "mnemonic": "i16x8.relaxed_q15mulr_s", + "friendlyName": "relaxed_q15mulr_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 528 + }, + { + "value": 274, + "name": "i16x8_relaxed_dot_i8x16_i7x16_s", + "mnemonic": "i16x8.relaxed_dot_i8x16_i7x16_s", + "friendlyName": "relaxed_dot_i8x16_i7x16_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 529 + }, + { + "value": 275, + "name": "i32x4_relaxed_dot_i8x16_i7x16_add_s", + "mnemonic": "i32x4.relaxed_dot_i8x16_i7x16_add_s", + "friendlyName": "relaxed_dot_i8x16_i7x16_add_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "relaxed-simd", + "group": "relaxed-simd", + "order": 530 + } +] diff --git a/generator/opcodes/sat-trunc.json b/generator/opcodes/sat-trunc.json new file mode 100644 index 0000000..ad83dc5 --- /dev/null +++ b/generator/opcodes/sat-trunc.json @@ -0,0 +1,146 @@ +[ + { + "value": 0, + "name": "i32_trunc_sat_f32_s", + "mnemonic": "i32.trunc_sat_f32_s", + "friendlyName": "trunc_sat_f32_s_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Int32" + ], + "prefix": 252, + "feature": "sat-trunc", + "group": "sat-trunc", + "order": 185 + }, + { + "value": 1, + "name": "i32_trunc_sat_f32_u", + "mnemonic": "i32.trunc_sat_f32_u", + "friendlyName": "trunc_sat_f32_u_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Int32" + ], + "prefix": 252, + "feature": "sat-trunc", + "group": "sat-trunc", + "order": 186 + }, + { + "value": 2, + "name": "i32_trunc_sat_f64_s", + "mnemonic": "i32.trunc_sat_f64_s", + "friendlyName": "trunc_sat_f64_s_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Int32" + ], + "prefix": 252, + "feature": "sat-trunc", + "group": "sat-trunc", + "order": 187 + }, + { + "value": 3, + "name": "i32_trunc_sat_f64_u", + "mnemonic": "i32.trunc_sat_f64_u", + "friendlyName": "trunc_sat_f64_u_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Int32" + ], + "prefix": 252, + "feature": "sat-trunc", + "group": "sat-trunc", + "order": 188 + }, + { + "value": 4, + "name": "i64_trunc_sat_f32_s", + "mnemonic": "i64.trunc_sat_f32_s", + "friendlyName": "trunc_sat_f32_s_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Int64" + ], + "prefix": 252, + "feature": "sat-trunc", + "group": "sat-trunc", + "order": 189 + }, + { + "value": 5, + "name": "i64_trunc_sat_f32_u", + "mnemonic": "i64.trunc_sat_f32_u", + "friendlyName": "trunc_sat_f32_u_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "Int64" + ], + "prefix": 252, + "feature": "sat-trunc", + "group": "sat-trunc", + "order": 190 + }, + { + "value": 6, + "name": "i64_trunc_sat_f64_s", + "mnemonic": "i64.trunc_sat_f64_s", + "friendlyName": "trunc_sat_f64_s_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Int64" + ], + "prefix": 252, + "feature": "sat-trunc", + "group": "sat-trunc", + "order": 191 + }, + { + "value": 7, + "name": "i64_trunc_sat_f64_u", + "mnemonic": "i64.trunc_sat_f64_u", + "friendlyName": "trunc_sat_f64_u_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "Int64" + ], + "prefix": 252, + "feature": "sat-trunc", + "group": "sat-trunc", + "order": 192 + } +] diff --git a/generator/opcodes/sign-extend.json b/generator/opcodes/sign-extend.json new file mode 100644 index 0000000..1cd2697 --- /dev/null +++ b/generator/opcodes/sign-extend.json @@ -0,0 +1,92 @@ +[ + { + "value": 192, + "name": "i32_extend8_s", + "mnemonic": "i32.extend8_s", + "friendlyName": "extend8_s_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": "sign-extend", + "group": "sign-extend", + "order": 180 + }, + { + "value": 193, + "name": "i32_extend16_s", + "mnemonic": "i32.extend16_s", + "friendlyName": "extend16_s_i32", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": null, + "feature": "sign-extend", + "group": "sign-extend", + "order": 181 + }, + { + "value": 194, + "name": "i64_extend8_s", + "mnemonic": "i64.extend8_s", + "friendlyName": "extend8_s_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": "sign-extend", + "group": "sign-extend", + "order": 182 + }, + { + "value": 195, + "name": "i64_extend16_s", + "mnemonic": "i64.extend16_s", + "friendlyName": "extend16_s_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": "sign-extend", + "group": "sign-extend", + "order": 183 + }, + { + "value": 196, + "name": "i64_extend32_s", + "mnemonic": "i64.extend32_s", + "friendlyName": "extend32_s_i64", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": null, + "feature": "sign-extend", + "group": "sign-extend", + "order": 184 + } +] diff --git a/generator/opcodes/simd.json b/generator/opcodes/simd.json new file mode 100644 index 0000000..bfabaeb --- /dev/null +++ b/generator/opcodes/simd.json @@ -0,0 +1,4388 @@ +[ + { + "value": 0, + "name": "v128_load", + "mnemonic": "v128.load", + "friendlyName": "load_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 208 + }, + { + "value": 1, + "name": "v128_load8x8_s", + "mnemonic": "v128.load8x8_s", + "friendlyName": "load8x8_s_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 209 + }, + { + "value": 2, + "name": "v128_load8x8_u", + "mnemonic": "v128.load8x8_u", + "friendlyName": "load8x8_u_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 210 + }, + { + "value": 3, + "name": "v128_load16x4_s", + "mnemonic": "v128.load16x4_s", + "friendlyName": "load16x4_s_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 211 + }, + { + "value": 4, + "name": "v128_load16x4_u", + "mnemonic": "v128.load16x4_u", + "friendlyName": "load16x4_u_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 212 + }, + { + "value": 5, + "name": "v128_load32x2_s", + "mnemonic": "v128.load32x2_s", + "friendlyName": "load32x2_s_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 213 + }, + { + "value": 6, + "name": "v128_load32x2_u", + "mnemonic": "v128.load32x2_u", + "friendlyName": "load32x2_u_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 214 + }, + { + "value": 7, + "name": "v128_load8_splat", + "mnemonic": "v128.load8_splat", + "friendlyName": "load8_splat_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 215 + }, + { + "value": 8, + "name": "v128_load16_splat", + "mnemonic": "v128.load16_splat", + "friendlyName": "load16_splat_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 216 + }, + { + "value": 9, + "name": "v128_load32_splat", + "mnemonic": "v128.load32_splat", + "friendlyName": "load32_splat_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 217 + }, + { + "value": 10, + "name": "v128_load64_splat", + "mnemonic": "v128.load64_splat", + "friendlyName": "load64_splat_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 218 + }, + { + "value": 11, + "name": "v128_store", + "mnemonic": "v128.store", + "friendlyName": "store_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "V128" + ], + "push": null, + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 219 + }, + { + "value": 12, + "name": "v128_const", + "mnemonic": "v128.const", + "friendlyName": "const_v128", + "immediate": "V128Const", + "controlFlow": null, + "pop": null, + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 220 + }, + { + "value": 13, + "name": "i8x16_shuffle", + "mnemonic": "i8x16.shuffle", + "friendlyName": "shuffle_i8x16", + "immediate": "ShuffleMask", + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 221 + }, + { + "value": 14, + "name": "i8x16_swizzle", + "mnemonic": "i8x16.swizzle", + "friendlyName": "swizzle_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 222 + }, + { + "value": 15, + "name": "i8x16_splat", + "mnemonic": "i8x16.splat", + "friendlyName": "splat_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 223 + }, + { + "value": 16, + "name": "i16x8_splat", + "mnemonic": "i16x8.splat", + "friendlyName": "splat_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 224 + }, + { + "value": 17, + "name": "i32x4_splat", + "mnemonic": "i32x4.splat", + "friendlyName": "splat_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 225 + }, + { + "value": 18, + "name": "i64x2_splat", + "mnemonic": "i64x2.splat", + "friendlyName": "splat_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "Int64" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 226 + }, + { + "value": 19, + "name": "f32x4_splat", + "mnemonic": "f32x4.splat", + "friendlyName": "splat_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 227 + }, + { + "value": 20, + "name": "f64x2_splat", + "mnemonic": "f64x2.splat", + "friendlyName": "splat_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "Float64" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 228 + }, + { + "value": 21, + "name": "i8x16_extract_lane_s", + "mnemonic": "i8x16.extract_lane_s", + "friendlyName": "extract_lane_s_i8x16", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 229 + }, + { + "value": 22, + "name": "i8x16_extract_lane_u", + "mnemonic": "i8x16.extract_lane_u", + "friendlyName": "extract_lane_u_i8x16", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 230 + }, + { + "value": 23, + "name": "i8x16_replace_lane", + "mnemonic": "i8x16.replace_lane", + "friendlyName": "replace_lane_i8x16", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 231 + }, + { + "value": 24, + "name": "i16x8_extract_lane_s", + "mnemonic": "i16x8.extract_lane_s", + "friendlyName": "extract_lane_s_i16x8", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 232 + }, + { + "value": 25, + "name": "i16x8_extract_lane_u", + "mnemonic": "i16x8.extract_lane_u", + "friendlyName": "extract_lane_u_i16x8", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 233 + }, + { + "value": 26, + "name": "i16x8_replace_lane", + "mnemonic": "i16x8.replace_lane", + "friendlyName": "replace_lane_i16x8", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 234 + }, + { + "value": 27, + "name": "i32x4_extract_lane", + "mnemonic": "i32x4.extract_lane", + "friendlyName": "extract_lane_i32x4", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 235 + }, + { + "value": 28, + "name": "i32x4_replace_lane", + "mnemonic": "i32x4.replace_lane", + "friendlyName": "replace_lane_i32x4", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 236 + }, + { + "value": 29, + "name": "i64x2_extract_lane", + "mnemonic": "i64x2.extract_lane", + "friendlyName": "extract_lane_i64x2", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int64" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 237 + }, + { + "value": 30, + "name": "i64x2_replace_lane", + "mnemonic": "i64x2.replace_lane", + "friendlyName": "replace_lane_i64x2", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128", + "Int64" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 238 + }, + { + "value": 31, + "name": "f32x4_extract_lane", + "mnemonic": "f32x4.extract_lane", + "friendlyName": "extract_lane_f32x4", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Float32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 239 + }, + { + "value": 32, + "name": "f32x4_replace_lane", + "mnemonic": "f32x4.replace_lane", + "friendlyName": "replace_lane_f32x4", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128", + "Float32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 240 + }, + { + "value": 33, + "name": "f64x2_extract_lane", + "mnemonic": "f64x2.extract_lane", + "friendlyName": "extract_lane_f64x2", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Float64" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 241 + }, + { + "value": 34, + "name": "f64x2_replace_lane", + "mnemonic": "f64x2.replace_lane", + "friendlyName": "replace_lane_f64x2", + "immediate": "LaneIndex", + "controlFlow": null, + "pop": [ + "V128", + "Float64" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 242 + }, + { + "value": 35, + "name": "i8x16_eq", + "mnemonic": "i8x16.eq", + "friendlyName": "eq_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 243 + }, + { + "value": 36, + "name": "i8x16_ne", + "mnemonic": "i8x16.ne", + "friendlyName": "ne_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 244 + }, + { + "value": 37, + "name": "i8x16_lt_s", + "mnemonic": "i8x16.lt_s", + "friendlyName": "lt_s_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 245 + }, + { + "value": 38, + "name": "i8x16_lt_u", + "mnemonic": "i8x16.lt_u", + "friendlyName": "lt_u_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 246 + }, + { + "value": 39, + "name": "i8x16_gt_s", + "mnemonic": "i8x16.gt_s", + "friendlyName": "gt_s_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 247 + }, + { + "value": 40, + "name": "i8x16_gt_u", + "mnemonic": "i8x16.gt_u", + "friendlyName": "gt_u_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 248 + }, + { + "value": 41, + "name": "i8x16_le_s", + "mnemonic": "i8x16.le_s", + "friendlyName": "le_s_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 249 + }, + { + "value": 42, + "name": "i8x16_le_u", + "mnemonic": "i8x16.le_u", + "friendlyName": "le_u_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 250 + }, + { + "value": 43, + "name": "i8x16_ge_s", + "mnemonic": "i8x16.ge_s", + "friendlyName": "ge_s_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 251 + }, + { + "value": 44, + "name": "i8x16_ge_u", + "mnemonic": "i8x16.ge_u", + "friendlyName": "ge_u_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 252 + }, + { + "value": 45, + "name": "i16x8_eq", + "mnemonic": "i16x8.eq", + "friendlyName": "eq_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 253 + }, + { + "value": 46, + "name": "i16x8_ne", + "mnemonic": "i16x8.ne", + "friendlyName": "ne_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 254 + }, + { + "value": 47, + "name": "i16x8_lt_s", + "mnemonic": "i16x8.lt_s", + "friendlyName": "lt_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 255 + }, + { + "value": 48, + "name": "i16x8_lt_u", + "mnemonic": "i16x8.lt_u", + "friendlyName": "lt_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 256 + }, + { + "value": 49, + "name": "i16x8_gt_s", + "mnemonic": "i16x8.gt_s", + "friendlyName": "gt_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 257 + }, + { + "value": 50, + "name": "i16x8_gt_u", + "mnemonic": "i16x8.gt_u", + "friendlyName": "gt_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 258 + }, + { + "value": 51, + "name": "i16x8_le_s", + "mnemonic": "i16x8.le_s", + "friendlyName": "le_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 259 + }, + { + "value": 52, + "name": "i16x8_le_u", + "mnemonic": "i16x8.le_u", + "friendlyName": "le_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 260 + }, + { + "value": 53, + "name": "i16x8_ge_s", + "mnemonic": "i16x8.ge_s", + "friendlyName": "ge_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 261 + }, + { + "value": 54, + "name": "i16x8_ge_u", + "mnemonic": "i16x8.ge_u", + "friendlyName": "ge_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 262 + }, + { + "value": 55, + "name": "i32x4_eq", + "mnemonic": "i32x4.eq", + "friendlyName": "eq_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 263 + }, + { + "value": 56, + "name": "i32x4_ne", + "mnemonic": "i32x4.ne", + "friendlyName": "ne_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 264 + }, + { + "value": 57, + "name": "i32x4_lt_s", + "mnemonic": "i32x4.lt_s", + "friendlyName": "lt_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 265 + }, + { + "value": 58, + "name": "i32x4_lt_u", + "mnemonic": "i32x4.lt_u", + "friendlyName": "lt_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 266 + }, + { + "value": 59, + "name": "i32x4_gt_s", + "mnemonic": "i32x4.gt_s", + "friendlyName": "gt_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 267 + }, + { + "value": 60, + "name": "i32x4_gt_u", + "mnemonic": "i32x4.gt_u", + "friendlyName": "gt_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 268 + }, + { + "value": 61, + "name": "i32x4_le_s", + "mnemonic": "i32x4.le_s", + "friendlyName": "le_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 269 + }, + { + "value": 62, + "name": "i32x4_le_u", + "mnemonic": "i32x4.le_u", + "friendlyName": "le_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 270 + }, + { + "value": 63, + "name": "i32x4_ge_s", + "mnemonic": "i32x4.ge_s", + "friendlyName": "ge_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 271 + }, + { + "value": 64, + "name": "i32x4_ge_u", + "mnemonic": "i32x4.ge_u", + "friendlyName": "ge_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 272 + }, + { + "value": 65, + "name": "f32x4_eq", + "mnemonic": "f32x4.eq", + "friendlyName": "eq_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 273 + }, + { + "value": 66, + "name": "f32x4_ne", + "mnemonic": "f32x4.ne", + "friendlyName": "ne_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 274 + }, + { + "value": 67, + "name": "f32x4_lt", + "mnemonic": "f32x4.lt", + "friendlyName": "lt_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 275 + }, + { + "value": 68, + "name": "f32x4_gt", + "mnemonic": "f32x4.gt", + "friendlyName": "gt_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 276 + }, + { + "value": 69, + "name": "f32x4_le", + "mnemonic": "f32x4.le", + "friendlyName": "le_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 277 + }, + { + "value": 70, + "name": "f32x4_ge", + "mnemonic": "f32x4.ge", + "friendlyName": "ge_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 278 + }, + { + "value": 71, + "name": "f64x2_eq", + "mnemonic": "f64x2.eq", + "friendlyName": "eq_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 279 + }, + { + "value": 72, + "name": "f64x2_ne", + "mnemonic": "f64x2.ne", + "friendlyName": "ne_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 280 + }, + { + "value": 73, + "name": "f64x2_lt", + "mnemonic": "f64x2.lt", + "friendlyName": "lt_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 281 + }, + { + "value": 74, + "name": "f64x2_gt", + "mnemonic": "f64x2.gt", + "friendlyName": "gt_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 282 + }, + { + "value": 75, + "name": "f64x2_le", + "mnemonic": "f64x2.le", + "friendlyName": "le_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 283 + }, + { + "value": 76, + "name": "f64x2_ge", + "mnemonic": "f64x2.ge", + "friendlyName": "ge_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 284 + }, + { + "value": 77, + "name": "v128_not", + "mnemonic": "v128.not", + "friendlyName": "not_v128", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 285 + }, + { + "value": 78, + "name": "v128_and", + "mnemonic": "v128.and", + "friendlyName": "and_v128", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 286 + }, + { + "value": 79, + "name": "v128_andnot", + "mnemonic": "v128.andnot", + "friendlyName": "andnot_v128", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 287 + }, + { + "value": 80, + "name": "v128_or", + "mnemonic": "v128.or", + "friendlyName": "or_v128", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 288 + }, + { + "value": 81, + "name": "v128_xor", + "mnemonic": "v128.xor", + "friendlyName": "xor_v128", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 289 + }, + { + "value": 82, + "name": "v128_bitselect", + "mnemonic": "v128.bitselect", + "friendlyName": "bitselect_v128", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 290 + }, + { + "value": 83, + "name": "v128_any_true", + "mnemonic": "v128.any_true", + "friendlyName": "any_true_v128", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 291 + }, + { + "value": 84, + "name": "v128_load8_lane", + "mnemonic": "v128.load8_lane", + "friendlyName": "load8_lane_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 292 + }, + { + "value": 85, + "name": "v128_load16_lane", + "mnemonic": "v128.load16_lane", + "friendlyName": "load16_lane_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 293 + }, + { + "value": 86, + "name": "v128_load32_lane", + "mnemonic": "v128.load32_lane", + "friendlyName": "load32_lane_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 294 + }, + { + "value": 87, + "name": "v128_load64_lane", + "mnemonic": "v128.load64_lane", + "friendlyName": "load64_lane_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 295 + }, + { + "value": 88, + "name": "v128_store8_lane", + "mnemonic": "v128.store8_lane", + "friendlyName": "store8_lane_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "V128" + ], + "push": null, + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 296 + }, + { + "value": 89, + "name": "v128_store16_lane", + "mnemonic": "v128.store16_lane", + "friendlyName": "store16_lane_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "V128" + ], + "push": null, + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 297 + }, + { + "value": 90, + "name": "v128_store32_lane", + "mnemonic": "v128.store32_lane", + "friendlyName": "store32_lane_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "V128" + ], + "push": null, + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 298 + }, + { + "value": 91, + "name": "v128_store64_lane", + "mnemonic": "v128.store64_lane", + "friendlyName": "store64_lane_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "V128" + ], + "push": null, + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 299 + }, + { + "value": 92, + "name": "v128_load32_zero", + "mnemonic": "v128.load32_zero", + "friendlyName": "load32_zero_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 300 + }, + { + "value": 93, + "name": "v128_load64_zero", + "mnemonic": "v128.load64_zero", + "friendlyName": "load64_zero_v128", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 301 + }, + { + "value": 94, + "name": "i32x4_trunc_sat_f32x4_s", + "mnemonic": "i32x4.trunc_sat_f32x4_s", + "friendlyName": "trunc_sat_f32x4_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 302 + }, + { + "value": 95, + "name": "i32x4_trunc_sat_f32x4_u", + "mnemonic": "i32x4.trunc_sat_f32x4_u", + "friendlyName": "trunc_sat_f32x4_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 303 + }, + { + "value": 96, + "name": "i8x16_abs", + "mnemonic": "i8x16.abs", + "friendlyName": "abs_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 304 + }, + { + "value": 97, + "name": "i8x16_neg", + "mnemonic": "i8x16.neg", + "friendlyName": "neg_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 305 + }, + { + "value": 98, + "name": "i8x16_popcnt", + "mnemonic": "i8x16.popcnt", + "friendlyName": "popcnt_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 306 + }, + { + "value": 99, + "name": "i8x16_all_true", + "mnemonic": "i8x16.all_true", + "friendlyName": "all_true_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 307 + }, + { + "value": 100, + "name": "i8x16_bitmask", + "mnemonic": "i8x16.bitmask", + "friendlyName": "bitmask_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 308 + }, + { + "value": 101, + "name": "i8x16_narrow_i16x8_s", + "mnemonic": "i8x16.narrow_i16x8_s", + "friendlyName": "narrow_i16x8_s_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 309 + }, + { + "value": 102, + "name": "i8x16_narrow_i16x8_u", + "mnemonic": "i8x16.narrow_i16x8_u", + "friendlyName": "narrow_i16x8_u_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 310 + }, + { + "value": 103, + "name": "f32x4_ceil", + "mnemonic": "f32x4.ceil", + "friendlyName": "ceil_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 311 + }, + { + "value": 104, + "name": "f32x4_floor", + "mnemonic": "f32x4.floor", + "friendlyName": "floor_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 312 + }, + { + "value": 105, + "name": "f32x4_trunc", + "mnemonic": "f32x4.trunc", + "friendlyName": "trunc_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 313 + }, + { + "value": 106, + "name": "f32x4_nearest", + "mnemonic": "f32x4.nearest", + "friendlyName": "nearest_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 314 + }, + { + "value": 107, + "name": "i8x16_shl", + "mnemonic": "i8x16.shl", + "friendlyName": "shl_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 315 + }, + { + "value": 108, + "name": "i8x16_shr_s", + "mnemonic": "i8x16.shr_s", + "friendlyName": "shr_s_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 316 + }, + { + "value": 109, + "name": "i8x16_shr_u", + "mnemonic": "i8x16.shr_u", + "friendlyName": "shr_u_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 317 + }, + { + "value": 110, + "name": "i8x16_add", + "mnemonic": "i8x16.add", + "friendlyName": "add_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 318 + }, + { + "value": 111, + "name": "i8x16_add_sat_s", + "mnemonic": "i8x16.add_sat_s", + "friendlyName": "add_sat_s_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 319 + }, + { + "value": 112, + "name": "i8x16_add_sat_u", + "mnemonic": "i8x16.add_sat_u", + "friendlyName": "add_sat_u_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 320 + }, + { + "value": 113, + "name": "i8x16_sub", + "mnemonic": "i8x16.sub", + "friendlyName": "sub_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 321 + }, + { + "value": 114, + "name": "i8x16_sub_sat_s", + "mnemonic": "i8x16.sub_sat_s", + "friendlyName": "sub_sat_s_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 322 + }, + { + "value": 115, + "name": "i8x16_sub_sat_u", + "mnemonic": "i8x16.sub_sat_u", + "friendlyName": "sub_sat_u_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 323 + }, + { + "value": 116, + "name": "f64x2_ceil", + "mnemonic": "f64x2.ceil", + "friendlyName": "ceil_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 324 + }, + { + "value": 117, + "name": "f64x2_floor", + "mnemonic": "f64x2.floor", + "friendlyName": "floor_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 325 + }, + { + "value": 118, + "name": "i8x16_min_s", + "mnemonic": "i8x16.min_s", + "friendlyName": "min_s_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 326 + }, + { + "value": 119, + "name": "i8x16_min_u", + "mnemonic": "i8x16.min_u", + "friendlyName": "min_u_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 327 + }, + { + "value": 120, + "name": "i8x16_max_s", + "mnemonic": "i8x16.max_s", + "friendlyName": "max_s_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 328 + }, + { + "value": 121, + "name": "i8x16_max_u", + "mnemonic": "i8x16.max_u", + "friendlyName": "max_u_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 329 + }, + { + "value": 122, + "name": "f64x2_trunc", + "mnemonic": "f64x2.trunc", + "friendlyName": "trunc_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 330 + }, + { + "value": 123, + "name": "i8x16_avgr_u", + "mnemonic": "i8x16.avgr_u", + "friendlyName": "avgr_u_i8x16", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 331 + }, + { + "value": 124, + "name": "i16x8_extadd_pairwise_i8x16_s", + "mnemonic": "i16x8.extadd_pairwise_i8x16_s", + "friendlyName": "extadd_pairwise_i8x16_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 332 + }, + { + "value": 125, + "name": "i16x8_extadd_pairwise_i8x16_u", + "mnemonic": "i16x8.extadd_pairwise_i8x16_u", + "friendlyName": "extadd_pairwise_i8x16_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 333 + }, + { + "value": 126, + "name": "i32x4_extadd_pairwise_i16x8_s", + "mnemonic": "i32x4.extadd_pairwise_i16x8_s", + "friendlyName": "extadd_pairwise_i16x8_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 334 + }, + { + "value": 127, + "name": "i32x4_extadd_pairwise_i16x8_u", + "mnemonic": "i32x4.extadd_pairwise_i16x8_u", + "friendlyName": "extadd_pairwise_i16x8_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 335 + }, + { + "value": 128, + "name": "i16x8_abs", + "mnemonic": "i16x8.abs", + "friendlyName": "abs_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 336 + }, + { + "value": 129, + "name": "i16x8_neg", + "mnemonic": "i16x8.neg", + "friendlyName": "neg_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 337 + }, + { + "value": 130, + "name": "i16x8_q15mulr_sat_s", + "mnemonic": "i16x8.q15mulr_sat_s", + "friendlyName": "q15mulr_sat_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 338 + }, + { + "value": 131, + "name": "i16x8_all_true", + "mnemonic": "i16x8.all_true", + "friendlyName": "all_true_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 339 + }, + { + "value": 132, + "name": "i16x8_bitmask", + "mnemonic": "i16x8.bitmask", + "friendlyName": "bitmask_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 340 + }, + { + "value": 133, + "name": "i16x8_narrow_i32x4_s", + "mnemonic": "i16x8.narrow_i32x4_s", + "friendlyName": "narrow_i32x4_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 341 + }, + { + "value": 134, + "name": "i16x8_narrow_i32x4_u", + "mnemonic": "i16x8.narrow_i32x4_u", + "friendlyName": "narrow_i32x4_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 342 + }, + { + "value": 135, + "name": "i16x8_extend_low_i8x16_s", + "mnemonic": "i16x8.extend_low_i8x16_s", + "friendlyName": "extend_low_i8x16_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 343 + }, + { + "value": 136, + "name": "i16x8_extend_high_i8x16_s", + "mnemonic": "i16x8.extend_high_i8x16_s", + "friendlyName": "extend_high_i8x16_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 344 + }, + { + "value": 137, + "name": "i16x8_extend_low_i8x16_u", + "mnemonic": "i16x8.extend_low_i8x16_u", + "friendlyName": "extend_low_i8x16_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 345 + }, + { + "value": 138, + "name": "i16x8_extend_high_i8x16_u", + "mnemonic": "i16x8.extend_high_i8x16_u", + "friendlyName": "extend_high_i8x16_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 346 + }, + { + "value": 139, + "name": "i16x8_shl", + "mnemonic": "i16x8.shl", + "friendlyName": "shl_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 347 + }, + { + "value": 140, + "name": "i16x8_shr_s", + "mnemonic": "i16x8.shr_s", + "friendlyName": "shr_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 348 + }, + { + "value": 141, + "name": "i16x8_shr_u", + "mnemonic": "i16x8.shr_u", + "friendlyName": "shr_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 349 + }, + { + "value": 142, + "name": "i16x8_add", + "mnemonic": "i16x8.add", + "friendlyName": "add_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 350 + }, + { + "value": 143, + "name": "i16x8_add_sat_s", + "mnemonic": "i16x8.add_sat_s", + "friendlyName": "add_sat_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 351 + }, + { + "value": 144, + "name": "i16x8_add_sat_u", + "mnemonic": "i16x8.add_sat_u", + "friendlyName": "add_sat_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 352 + }, + { + "value": 145, + "name": "i16x8_sub", + "mnemonic": "i16x8.sub", + "friendlyName": "sub_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 353 + }, + { + "value": 146, + "name": "i16x8_sub_sat_s", + "mnemonic": "i16x8.sub_sat_s", + "friendlyName": "sub_sat_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 354 + }, + { + "value": 147, + "name": "i16x8_sub_sat_u", + "mnemonic": "i16x8.sub_sat_u", + "friendlyName": "sub_sat_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 355 + }, + { + "value": 148, + "name": "f64x2_nearest", + "mnemonic": "f64x2.nearest", + "friendlyName": "nearest_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 356 + }, + { + "value": 149, + "name": "i16x8_mul", + "mnemonic": "i16x8.mul", + "friendlyName": "mul_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 357 + }, + { + "value": 150, + "name": "i16x8_min_s", + "mnemonic": "i16x8.min_s", + "friendlyName": "min_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 358 + }, + { + "value": 151, + "name": "i16x8_min_u", + "mnemonic": "i16x8.min_u", + "friendlyName": "min_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 359 + }, + { + "value": 152, + "name": "i16x8_max_s", + "mnemonic": "i16x8.max_s", + "friendlyName": "max_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 360 + }, + { + "value": 153, + "name": "i16x8_max_u", + "mnemonic": "i16x8.max_u", + "friendlyName": "max_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 361 + }, + { + "value": 155, + "name": "i16x8_avgr_u", + "mnemonic": "i16x8.avgr_u", + "friendlyName": "avgr_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 362 + }, + { + "value": 156, + "name": "i16x8_extmul_low_i8x16_s", + "mnemonic": "i16x8.extmul_low_i8x16_s", + "friendlyName": "extmul_low_i8x16_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 363 + }, + { + "value": 157, + "name": "i16x8_extmul_high_i8x16_s", + "mnemonic": "i16x8.extmul_high_i8x16_s", + "friendlyName": "extmul_high_i8x16_s_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 364 + }, + { + "value": 158, + "name": "i16x8_extmul_low_i8x16_u", + "mnemonic": "i16x8.extmul_low_i8x16_u", + "friendlyName": "extmul_low_i8x16_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 365 + }, + { + "value": 159, + "name": "i16x8_extmul_high_i8x16_u", + "mnemonic": "i16x8.extmul_high_i8x16_u", + "friendlyName": "extmul_high_i8x16_u_i16x8", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 366 + }, + { + "value": 160, + "name": "i32x4_abs", + "mnemonic": "i32x4.abs", + "friendlyName": "abs_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 367 + }, + { + "value": 161, + "name": "i32x4_neg", + "mnemonic": "i32x4.neg", + "friendlyName": "neg_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 368 + }, + { + "value": 163, + "name": "i32x4_all_true", + "mnemonic": "i32x4.all_true", + "friendlyName": "all_true_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 369 + }, + { + "value": 164, + "name": "i32x4_bitmask", + "mnemonic": "i32x4.bitmask", + "friendlyName": "bitmask_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 370 + }, + { + "value": 167, + "name": "i32x4_extend_low_i16x8_s", + "mnemonic": "i32x4.extend_low_i16x8_s", + "friendlyName": "extend_low_i16x8_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 371 + }, + { + "value": 168, + "name": "i32x4_extend_high_i16x8_s", + "mnemonic": "i32x4.extend_high_i16x8_s", + "friendlyName": "extend_high_i16x8_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 372 + }, + { + "value": 169, + "name": "i32x4_extend_low_i16x8_u", + "mnemonic": "i32x4.extend_low_i16x8_u", + "friendlyName": "extend_low_i16x8_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 373 + }, + { + "value": 170, + "name": "i32x4_extend_high_i16x8_u", + "mnemonic": "i32x4.extend_high_i16x8_u", + "friendlyName": "extend_high_i16x8_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 374 + }, + { + "value": 171, + "name": "i32x4_shl", + "mnemonic": "i32x4.shl", + "friendlyName": "shl_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 375 + }, + { + "value": 172, + "name": "i32x4_shr_s", + "mnemonic": "i32x4.shr_s", + "friendlyName": "shr_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 376 + }, + { + "value": 173, + "name": "i32x4_shr_u", + "mnemonic": "i32x4.shr_u", + "friendlyName": "shr_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 377 + }, + { + "value": 174, + "name": "i32x4_add", + "mnemonic": "i32x4.add", + "friendlyName": "add_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 378 + }, + { + "value": 175, + "name": "f32x4_convert_i32x4_s", + "mnemonic": "f32x4.convert_i32x4_s", + "friendlyName": "convert_i32x4_s_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 379 + }, + { + "value": 176, + "name": "f32x4_convert_i32x4_u", + "mnemonic": "f32x4.convert_i32x4_u", + "friendlyName": "convert_i32x4_u_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 380 + }, + { + "value": 177, + "name": "i32x4_sub", + "mnemonic": "i32x4.sub", + "friendlyName": "sub_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 381 + }, + { + "value": 181, + "name": "i32x4_mul", + "mnemonic": "i32x4.mul", + "friendlyName": "mul_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 382 + }, + { + "value": 182, + "name": "i32x4_min_s", + "mnemonic": "i32x4.min_s", + "friendlyName": "min_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 383 + }, + { + "value": 183, + "name": "i32x4_min_u", + "mnemonic": "i32x4.min_u", + "friendlyName": "min_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 384 + }, + { + "value": 184, + "name": "i32x4_max_s", + "mnemonic": "i32x4.max_s", + "friendlyName": "max_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 385 + }, + { + "value": 185, + "name": "i32x4_max_u", + "mnemonic": "i32x4.max_u", + "friendlyName": "max_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 386 + }, + { + "value": 186, + "name": "i32x4_dot_i16x8_s", + "mnemonic": "i32x4.dot_i16x8_s", + "friendlyName": "dot_i16x8_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 387 + }, + { + "value": 188, + "name": "i32x4_extmul_low_i16x8_s", + "mnemonic": "i32x4.extmul_low_i16x8_s", + "friendlyName": "extmul_low_i16x8_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 388 + }, + { + "value": 189, + "name": "i32x4_extmul_high_i16x8_s", + "mnemonic": "i32x4.extmul_high_i16x8_s", + "friendlyName": "extmul_high_i16x8_s_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 389 + }, + { + "value": 190, + "name": "i32x4_extmul_low_i16x8_u", + "mnemonic": "i32x4.extmul_low_i16x8_u", + "friendlyName": "extmul_low_i16x8_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 390 + }, + { + "value": 191, + "name": "i32x4_extmul_high_i16x8_u", + "mnemonic": "i32x4.extmul_high_i16x8_u", + "friendlyName": "extmul_high_i16x8_u_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 391 + }, + { + "value": 192, + "name": "i64x2_abs", + "mnemonic": "i64x2.abs", + "friendlyName": "abs_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 392 + }, + { + "value": 193, + "name": "i64x2_neg", + "mnemonic": "i64x2.neg", + "friendlyName": "neg_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 393 + }, + { + "value": 195, + "name": "i64x2_all_true", + "mnemonic": "i64x2.all_true", + "friendlyName": "all_true_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 394 + }, + { + "value": 196, + "name": "i64x2_bitmask", + "mnemonic": "i64x2.bitmask", + "friendlyName": "bitmask_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "Int32" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 395 + }, + { + "value": 199, + "name": "i64x2_extend_low_i32x4_s", + "mnemonic": "i64x2.extend_low_i32x4_s", + "friendlyName": "extend_low_i32x4_s_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 396 + }, + { + "value": 200, + "name": "i64x2_extend_high_i32x4_s", + "mnemonic": "i64x2.extend_high_i32x4_s", + "friendlyName": "extend_high_i32x4_s_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 397 + }, + { + "value": 201, + "name": "i64x2_extend_low_i32x4_u", + "mnemonic": "i64x2.extend_low_i32x4_u", + "friendlyName": "extend_low_i32x4_u_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 398 + }, + { + "value": 202, + "name": "i64x2_extend_high_i32x4_u", + "mnemonic": "i64x2.extend_high_i32x4_u", + "friendlyName": "extend_high_i32x4_u_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 399 + }, + { + "value": 203, + "name": "i64x2_shl", + "mnemonic": "i64x2.shl", + "friendlyName": "shl_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 400 + }, + { + "value": 204, + "name": "i64x2_shr_s", + "mnemonic": "i64x2.shr_s", + "friendlyName": "shr_s_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 401 + }, + { + "value": 205, + "name": "i64x2_shr_u", + "mnemonic": "i64x2.shr_u", + "friendlyName": "shr_u_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "Int32" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 402 + }, + { + "value": 206, + "name": "i64x2_add", + "mnemonic": "i64x2.add", + "friendlyName": "add_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 403 + }, + { + "value": 209, + "name": "i64x2_sub", + "mnemonic": "i64x2.sub", + "friendlyName": "sub_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 404 + }, + { + "value": 213, + "name": "i64x2_mul", + "mnemonic": "i64x2.mul", + "friendlyName": "mul_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 405 + }, + { + "value": 214, + "name": "i64x2_eq", + "mnemonic": "i64x2.eq", + "friendlyName": "eq_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 406 + }, + { + "value": 215, + "name": "i64x2_ne", + "mnemonic": "i64x2.ne", + "friendlyName": "ne_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 407 + }, + { + "value": 216, + "name": "i64x2_lt_s", + "mnemonic": "i64x2.lt_s", + "friendlyName": "lt_s_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 408 + }, + { + "value": 217, + "name": "i64x2_gt_s", + "mnemonic": "i64x2.gt_s", + "friendlyName": "gt_s_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 409 + }, + { + "value": 218, + "name": "i64x2_le_s", + "mnemonic": "i64x2.le_s", + "friendlyName": "le_s_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 410 + }, + { + "value": 219, + "name": "i64x2_ge_s", + "mnemonic": "i64x2.ge_s", + "friendlyName": "ge_s_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 411 + }, + { + "value": 220, + "name": "i64x2_extmul_low_i32x4_s", + "mnemonic": "i64x2.extmul_low_i32x4_s", + "friendlyName": "extmul_low_i32x4_s_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 412 + }, + { + "value": 221, + "name": "i64x2_extmul_high_i32x4_s", + "mnemonic": "i64x2.extmul_high_i32x4_s", + "friendlyName": "extmul_high_i32x4_s_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 413 + }, + { + "value": 222, + "name": "i64x2_extmul_low_i32x4_u", + "mnemonic": "i64x2.extmul_low_i32x4_u", + "friendlyName": "extmul_low_i32x4_u_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 414 + }, + { + "value": 223, + "name": "i64x2_extmul_high_i32x4_u", + "mnemonic": "i64x2.extmul_high_i32x4_u", + "friendlyName": "extmul_high_i32x4_u_i64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 415 + }, + { + "value": 224, + "name": "f32x4_abs", + "mnemonic": "f32x4.abs", + "friendlyName": "abs_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 416 + }, + { + "value": 225, + "name": "f32x4_neg", + "mnemonic": "f32x4.neg", + "friendlyName": "neg_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 417 + }, + { + "value": 227, + "name": "f32x4_sqrt", + "mnemonic": "f32x4.sqrt", + "friendlyName": "sqrt_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 418 + }, + { + "value": 228, + "name": "f32x4_add", + "mnemonic": "f32x4.add", + "friendlyName": "add_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 419 + }, + { + "value": 229, + "name": "f32x4_sub", + "mnemonic": "f32x4.sub", + "friendlyName": "sub_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 420 + }, + { + "value": 230, + "name": "f32x4_mul", + "mnemonic": "f32x4.mul", + "friendlyName": "mul_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 421 + }, + { + "value": 231, + "name": "f32x4_div", + "mnemonic": "f32x4.div", + "friendlyName": "div_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 422 + }, + { + "value": 232, + "name": "f32x4_min", + "mnemonic": "f32x4.min", + "friendlyName": "min_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 423 + }, + { + "value": 233, + "name": "f32x4_max", + "mnemonic": "f32x4.max", + "friendlyName": "max_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 424 + }, + { + "value": 234, + "name": "f32x4_pmin", + "mnemonic": "f32x4.pmin", + "friendlyName": "pmin_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 425 + }, + { + "value": 235, + "name": "f32x4_pmax", + "mnemonic": "f32x4.pmax", + "friendlyName": "pmax_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 426 + }, + { + "value": 236, + "name": "f64x2_abs", + "mnemonic": "f64x2.abs", + "friendlyName": "abs_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 427 + }, + { + "value": 237, + "name": "f64x2_neg", + "mnemonic": "f64x2.neg", + "friendlyName": "neg_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 428 + }, + { + "value": 239, + "name": "f64x2_sqrt", + "mnemonic": "f64x2.sqrt", + "friendlyName": "sqrt_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 429 + }, + { + "value": 240, + "name": "f64x2_add", + "mnemonic": "f64x2.add", + "friendlyName": "add_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 430 + }, + { + "value": 241, + "name": "f64x2_sub", + "mnemonic": "f64x2.sub", + "friendlyName": "sub_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 431 + }, + { + "value": 242, + "name": "f64x2_mul", + "mnemonic": "f64x2.mul", + "friendlyName": "mul_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 432 + }, + { + "value": 243, + "name": "f64x2_div", + "mnemonic": "f64x2.div", + "friendlyName": "div_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 433 + }, + { + "value": 244, + "name": "f64x2_min", + "mnemonic": "f64x2.min", + "friendlyName": "min_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 434 + }, + { + "value": 245, + "name": "f64x2_max", + "mnemonic": "f64x2.max", + "friendlyName": "max_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 435 + }, + { + "value": 246, + "name": "f64x2_pmin", + "mnemonic": "f64x2.pmin", + "friendlyName": "pmin_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 436 + }, + { + "value": 247, + "name": "f64x2_pmax", + "mnemonic": "f64x2.pmax", + "friendlyName": "pmax_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128", + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 437 + }, + { + "value": 248, + "name": "i32x4_trunc_sat_f64x2_s_zero", + "mnemonic": "i32x4.trunc_sat_f64x2_s_zero", + "friendlyName": "trunc_sat_f64x2_s_zero_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 438 + }, + { + "value": 249, + "name": "i32x4_trunc_sat_f64x2_u_zero", + "mnemonic": "i32x4.trunc_sat_f64x2_u_zero", + "friendlyName": "trunc_sat_f64x2_u_zero_i32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 439 + }, + { + "value": 250, + "name": "f64x2_convert_low_i32x4_s", + "mnemonic": "f64x2.convert_low_i32x4_s", + "friendlyName": "convert_low_i32x4_s_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 440 + }, + { + "value": 251, + "name": "f64x2_convert_low_i32x4_u", + "mnemonic": "f64x2.convert_low_i32x4_u", + "friendlyName": "convert_low_i32x4_u_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 441 + }, + { + "value": 252, + "name": "f32x4_demote_f64x2_zero", + "mnemonic": "f32x4.demote_f64x2_zero", + "friendlyName": "demote_f64x2_zero_f32x4", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 442 + }, + { + "value": 253, + "name": "f64x2_promote_low_f32x4", + "mnemonic": "f64x2.promote_low_f32x4", + "friendlyName": "promote_low_f32x4_f64x2", + "immediate": null, + "controlFlow": null, + "pop": [ + "V128" + ], + "push": [ + "V128" + ], + "prefix": 253, + "feature": "simd", + "group": "simd", + "order": 443 + } +] diff --git a/generator/opcodes/tail-call.json b/generator/opcodes/tail-call.json new file mode 100644 index 0000000..1627906 --- /dev/null +++ b/generator/opcodes/tail-call.json @@ -0,0 +1,32 @@ +[ + { + "value": 18, + "name": "return_call", + "mnemonic": "return_call", + "friendlyName": "return_call", + "immediate": "Function", + "controlFlow": null, + "pop": null, + "push": null, + "prefix": null, + "feature": "tail-call", + "group": "call", + "order": 17 + }, + { + "value": 19, + "name": "return_call_indirect", + "mnemonic": "return_call_indirect", + "friendlyName": "return_call_indirect", + "immediate": "IndirectFunction", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": null, + "prefix": null, + "feature": "tail-call", + "group": "call", + "order": 18 + } +] diff --git a/generator/opcodes/threads.json b/generator/opcodes/threads.json new file mode 100644 index 0000000..49177cc --- /dev/null +++ b/generator/opcodes/threads.json @@ -0,0 +1,1258 @@ +[ + { + "value": 0, + "name": "memory_atomic_notify", + "mnemonic": "memory.atomic.notify", + "friendlyName": "atomic_notify", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 444 + }, + { + "value": 1, + "name": "memory_atomic_wait32", + "mnemonic": "memory.atomic.wait32", + "friendlyName": "atomic_wait32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 445 + }, + { + "value": 2, + "name": "memory_atomic_wait64", + "mnemonic": "memory.atomic.wait64", + "friendlyName": "atomic_wait64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64", + "Int64" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 446 + }, + { + "value": 3, + "name": "atomic_fence", + "mnemonic": "atomic.fence", + "friendlyName": "atomic_fence", + "immediate": "VarUInt1", + "controlFlow": null, + "pop": null, + "push": null, + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 447 + }, + { + "value": 16, + "name": "i32_atomic_load", + "mnemonic": "i32.atomic.load", + "friendlyName": "atomic_load_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 448 + }, + { + "value": 17, + "name": "i64_atomic_load", + "mnemonic": "i64.atomic.load", + "friendlyName": "atomic_load_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 449 + }, + { + "value": 18, + "name": "i32_atomic_load8_u", + "mnemonic": "i32.atomic.load8_u", + "friendlyName": "atomic_load8_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 450 + }, + { + "value": 19, + "name": "i32_atomic_load16_u", + "mnemonic": "i32.atomic.load16_u", + "friendlyName": "atomic_load16_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 451 + }, + { + "value": 20, + "name": "i64_atomic_load8_u", + "mnemonic": "i64.atomic.load8_u", + "friendlyName": "atomic_load8_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 452 + }, + { + "value": 21, + "name": "i64_atomic_load16_u", + "mnemonic": "i64.atomic.load16_u", + "friendlyName": "atomic_load16_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 453 + }, + { + "value": 22, + "name": "i64_atomic_load32_u", + "mnemonic": "i64.atomic.load32_u", + "friendlyName": "atomic_load32_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 454 + }, + { + "value": 23, + "name": "i32_atomic_store", + "mnemonic": "i32.atomic.store", + "friendlyName": "atomic_store_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": null, + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 455 + }, + { + "value": 24, + "name": "i64_atomic_store", + "mnemonic": "i64.atomic.store", + "friendlyName": "atomic_store_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": null, + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 456 + }, + { + "value": 25, + "name": "i32_atomic_store8", + "mnemonic": "i32.atomic.store8", + "friendlyName": "atomic_store8_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": null, + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 457 + }, + { + "value": 26, + "name": "i32_atomic_store16", + "mnemonic": "i32.atomic.store16", + "friendlyName": "atomic_store16_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": null, + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 458 + }, + { + "value": 27, + "name": "i64_atomic_store8", + "mnemonic": "i64.atomic.store8", + "friendlyName": "atomic_store8_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": null, + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 459 + }, + { + "value": 28, + "name": "i64_atomic_store16", + "mnemonic": "i64.atomic.store16", + "friendlyName": "atomic_store16_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": null, + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 460 + }, + { + "value": 29, + "name": "i64_atomic_store32", + "mnemonic": "i64.atomic.store32", + "friendlyName": "atomic_store32_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": null, + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 461 + }, + { + "value": 30, + "name": "i32_atomic_rmw_add", + "mnemonic": "i32.atomic.rmw.add", + "friendlyName": "atomic_rmw_add_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 462 + }, + { + "value": 31, + "name": "i64_atomic_rmw_add", + "mnemonic": "i64.atomic.rmw.add", + "friendlyName": "atomic_rmw_add_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 463 + }, + { + "value": 32, + "name": "i32_atomic_rmw8_add_u", + "mnemonic": "i32.atomic.rmw8.add_u", + "friendlyName": "atomic_rmw8_add_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 464 + }, + { + "value": 33, + "name": "i32_atomic_rmw16_add_u", + "mnemonic": "i32.atomic.rmw16.add_u", + "friendlyName": "atomic_rmw16_add_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 465 + }, + { + "value": 34, + "name": "i64_atomic_rmw8_add_u", + "mnemonic": "i64.atomic.rmw8.add_u", + "friendlyName": "atomic_rmw8_add_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 466 + }, + { + "value": 35, + "name": "i64_atomic_rmw16_add_u", + "mnemonic": "i64.atomic.rmw16.add_u", + "friendlyName": "atomic_rmw16_add_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 467 + }, + { + "value": 36, + "name": "i64_atomic_rmw32_add_u", + "mnemonic": "i64.atomic.rmw32.add_u", + "friendlyName": "atomic_rmw32_add_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 468 + }, + { + "value": 37, + "name": "i32_atomic_rmw_sub", + "mnemonic": "i32.atomic.rmw.sub", + "friendlyName": "atomic_rmw_sub_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 469 + }, + { + "value": 38, + "name": "i64_atomic_rmw_sub", + "mnemonic": "i64.atomic.rmw.sub", + "friendlyName": "atomic_rmw_sub_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 470 + }, + { + "value": 39, + "name": "i32_atomic_rmw8_sub_u", + "mnemonic": "i32.atomic.rmw8.sub_u", + "friendlyName": "atomic_rmw8_sub_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 471 + }, + { + "value": 40, + "name": "i32_atomic_rmw16_sub_u", + "mnemonic": "i32.atomic.rmw16.sub_u", + "friendlyName": "atomic_rmw16_sub_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 472 + }, + { + "value": 41, + "name": "i64_atomic_rmw8_sub_u", + "mnemonic": "i64.atomic.rmw8.sub_u", + "friendlyName": "atomic_rmw8_sub_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 473 + }, + { + "value": 42, + "name": "i64_atomic_rmw16_sub_u", + "mnemonic": "i64.atomic.rmw16.sub_u", + "friendlyName": "atomic_rmw16_sub_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 474 + }, + { + "value": 43, + "name": "i64_atomic_rmw32_sub_u", + "mnemonic": "i64.atomic.rmw32.sub_u", + "friendlyName": "atomic_rmw32_sub_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 475 + }, + { + "value": 44, + "name": "i32_atomic_rmw_and", + "mnemonic": "i32.atomic.rmw.and", + "friendlyName": "atomic_rmw_and_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 476 + }, + { + "value": 45, + "name": "i64_atomic_rmw_and", + "mnemonic": "i64.atomic.rmw.and", + "friendlyName": "atomic_rmw_and_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 477 + }, + { + "value": 46, + "name": "i32_atomic_rmw8_and_u", + "mnemonic": "i32.atomic.rmw8.and_u", + "friendlyName": "atomic_rmw8_and_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 478 + }, + { + "value": 47, + "name": "i32_atomic_rmw16_and_u", + "mnemonic": "i32.atomic.rmw16.and_u", + "friendlyName": "atomic_rmw16_and_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 479 + }, + { + "value": 48, + "name": "i64_atomic_rmw8_and_u", + "mnemonic": "i64.atomic.rmw8.and_u", + "friendlyName": "atomic_rmw8_and_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 480 + }, + { + "value": 49, + "name": "i64_atomic_rmw16_and_u", + "mnemonic": "i64.atomic.rmw16.and_u", + "friendlyName": "atomic_rmw16_and_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 481 + }, + { + "value": 50, + "name": "i64_atomic_rmw32_and_u", + "mnemonic": "i64.atomic.rmw32.and_u", + "friendlyName": "atomic_rmw32_and_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 482 + }, + { + "value": 51, + "name": "i32_atomic_rmw_or", + "mnemonic": "i32.atomic.rmw.or", + "friendlyName": "atomic_rmw_or_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 483 + }, + { + "value": 52, + "name": "i64_atomic_rmw_or", + "mnemonic": "i64.atomic.rmw.or", + "friendlyName": "atomic_rmw_or_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 484 + }, + { + "value": 53, + "name": "i32_atomic_rmw8_or_u", + "mnemonic": "i32.atomic.rmw8.or_u", + "friendlyName": "atomic_rmw8_or_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 485 + }, + { + "value": 54, + "name": "i32_atomic_rmw16_or_u", + "mnemonic": "i32.atomic.rmw16.or_u", + "friendlyName": "atomic_rmw16_or_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 486 + }, + { + "value": 55, + "name": "i64_atomic_rmw8_or_u", + "mnemonic": "i64.atomic.rmw8.or_u", + "friendlyName": "atomic_rmw8_or_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 487 + }, + { + "value": 56, + "name": "i64_atomic_rmw16_or_u", + "mnemonic": "i64.atomic.rmw16.or_u", + "friendlyName": "atomic_rmw16_or_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 488 + }, + { + "value": 57, + "name": "i64_atomic_rmw32_or_u", + "mnemonic": "i64.atomic.rmw32.or_u", + "friendlyName": "atomic_rmw32_or_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 489 + }, + { + "value": 58, + "name": "i32_atomic_rmw_xor", + "mnemonic": "i32.atomic.rmw.xor", + "friendlyName": "atomic_rmw_xor_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 490 + }, + { + "value": 59, + "name": "i64_atomic_rmw_xor", + "mnemonic": "i64.atomic.rmw.xor", + "friendlyName": "atomic_rmw_xor_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 491 + }, + { + "value": 60, + "name": "i32_atomic_rmw8_xor_u", + "mnemonic": "i32.atomic.rmw8.xor_u", + "friendlyName": "atomic_rmw8_xor_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 492 + }, + { + "value": 61, + "name": "i32_atomic_rmw16_xor_u", + "mnemonic": "i32.atomic.rmw16.xor_u", + "friendlyName": "atomic_rmw16_xor_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 493 + }, + { + "value": 62, + "name": "i64_atomic_rmw8_xor_u", + "mnemonic": "i64.atomic.rmw8.xor_u", + "friendlyName": "atomic_rmw8_xor_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 494 + }, + { + "value": 63, + "name": "i64_atomic_rmw16_xor_u", + "mnemonic": "i64.atomic.rmw16.xor_u", + "friendlyName": "atomic_rmw16_xor_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 495 + }, + { + "value": 64, + "name": "i64_atomic_rmw32_xor_u", + "mnemonic": "i64.atomic.rmw32.xor_u", + "friendlyName": "atomic_rmw32_xor_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 496 + }, + { + "value": 65, + "name": "i32_atomic_rmw_xchg", + "mnemonic": "i32.atomic.rmw.xchg", + "friendlyName": "atomic_rmw_xchg_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 497 + }, + { + "value": 66, + "name": "i64_atomic_rmw_xchg", + "mnemonic": "i64.atomic.rmw.xchg", + "friendlyName": "atomic_rmw_xchg_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 498 + }, + { + "value": 67, + "name": "i32_atomic_rmw8_xchg_u", + "mnemonic": "i32.atomic.rmw8.xchg_u", + "friendlyName": "atomic_rmw8_xchg_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 499 + }, + { + "value": 68, + "name": "i32_atomic_rmw16_xchg_u", + "mnemonic": "i32.atomic.rmw16.xchg_u", + "friendlyName": "atomic_rmw16_xchg_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 500 + }, + { + "value": 69, + "name": "i64_atomic_rmw8_xchg_u", + "mnemonic": "i64.atomic.rmw8.xchg_u", + "friendlyName": "atomic_rmw8_xchg_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 501 + }, + { + "value": 70, + "name": "i64_atomic_rmw16_xchg_u", + "mnemonic": "i64.atomic.rmw16.xchg_u", + "friendlyName": "atomic_rmw16_xchg_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 502 + }, + { + "value": 71, + "name": "i64_atomic_rmw32_xchg_u", + "mnemonic": "i64.atomic.rmw32.xchg_u", + "friendlyName": "atomic_rmw32_xchg_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 503 + }, + { + "value": 72, + "name": "i32_atomic_rmw_cmpxchg", + "mnemonic": "i32.atomic.rmw.cmpxchg", + "friendlyName": "atomic_rmw_cmpxchg_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 504 + }, + { + "value": 73, + "name": "i64_atomic_rmw_cmpxchg", + "mnemonic": "i64.atomic.rmw.cmpxchg", + "friendlyName": "atomic_rmw_cmpxchg_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 505 + }, + { + "value": 74, + "name": "i32_atomic_rmw8_cmpxchg_u", + "mnemonic": "i32.atomic.rmw8.cmpxchg_u", + "friendlyName": "atomic_rmw8_cmpxchg_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 506 + }, + { + "value": 75, + "name": "i32_atomic_rmw16_cmpxchg_u", + "mnemonic": "i32.atomic.rmw16.cmpxchg_u", + "friendlyName": "atomic_rmw16_cmpxchg_u_i32", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int32", + "Int32" + ], + "push": [ + "Int32" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 507 + }, + { + "value": 76, + "name": "i64_atomic_rmw8_cmpxchg_u", + "mnemonic": "i64.atomic.rmw8.cmpxchg_u", + "friendlyName": "atomic_rmw8_cmpxchg_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 508 + }, + { + "value": 77, + "name": "i64_atomic_rmw16_cmpxchg_u", + "mnemonic": "i64.atomic.rmw16.cmpxchg_u", + "friendlyName": "atomic_rmw16_cmpxchg_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 509 + }, + { + "value": 78, + "name": "i64_atomic_rmw32_cmpxchg_u", + "mnemonic": "i64.atomic.rmw32.cmpxchg_u", + "friendlyName": "atomic_rmw32_cmpxchg_u_i64", + "immediate": "MemoryImmediate", + "controlFlow": null, + "pop": [ + "Int32", + "Int64", + "Int64" + ], + "push": [ + "Int64" + ], + "prefix": 254, + "feature": "threads", + "group": "atomics", + "order": 510 + } +] diff --git a/generator/split-opcodes.ts b/generator/split-opcodes.ts new file mode 100644 index 0000000..67b24ab --- /dev/null +++ b/generator/split-opcodes.ts @@ -0,0 +1,68 @@ +/** + * One-time script to split the monolithic opcodes.json into feature-based sub-files. + * + * Usage: npx tsx generator/split-opcodes.ts + * + * This reads generator/opcodes.json (the flat array), groups entries by their + * `feature` field, adds an `order` field to preserve the original array ordering, + * and writes: + * - generator/opcodes/.json (one per feature group) + * - generator/opcodes.json (replaced with a manifest) + */ + +import * as fs from 'fs'; +import * as path from 'path'; + +interface OpCodeEntry { + value: number; + name: string; + mnemonic: string; + friendlyName: string; + immediate: string | null; + controlFlow: string | null; + pop: string[] | null; + push: string[] | null; + prefix: number | null; + feature: string | null; + group: string; +} + +const generatorDir = path.dirname(__filename); +const jsonPath = path.join(generatorDir, 'opcodes.json'); +const outDir = path.join(generatorDir, 'opcodes'); + +// Read the monolithic file +const raw: OpCodeEntry[] = JSON.parse(fs.readFileSync(jsonPath, 'utf8')); +console.log(`Read ${raw.length} opcodes from opcodes.json`); + +// Group by feature, preserving original order via `order` field +const groups = new Map(); +raw.forEach((entry, index) => { + const key = entry.feature || 'core'; + if (!groups.has(key)) groups.set(key, []); + groups.get(key)!.push({ ...entry, order: index }); +}); + +// Create output directory +if (!fs.existsSync(outDir)) { + fs.mkdirSync(outDir, { recursive: true }); +} + +// Write each feature file +const featureFiles: string[] = []; +for (const [feature, entries] of groups) { + const filename = `${feature}.json`; + const filePath = path.join(outDir, filename); + fs.writeFileSync(filePath, JSON.stringify(entries, null, 2) + '\n'); + featureFiles.push(`opcodes/${filename}`); + console.log(` ${filename}: ${entries.length} opcodes`); +} + +// Write manifest (replaces the monolithic file) +const manifest = { + description: 'WebAssembly opcode definitions, split by feature/proposal.', + includes: featureFiles, +}; +fs.writeFileSync(jsonPath, JSON.stringify(manifest, null, 2) + '\n'); +console.log(`\nWrote manifest to opcodes.json with ${featureFiles.length} includes.`); +console.log('Done.'); diff --git a/package.json b/package.json index 332075b..ddf8d27 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "lib" ], "scripts": { + "generate": "npx tsx generator/index.ts", "build": "tsc --build", "clean": "tsc --build --clean", "clean:build": "rm -rf build", @@ -18,7 +19,7 @@ "examples": "npx tsx examples/showcase/run-examples.ts", "examples:cdk": "npx tsx examples/aws-cdk-comparison/run-examples.ts", "examples:all": "npm run examples && npm run examples:cdk", - "playground": "npm run dev --prefix playground", + "playground": "npx tsx playground/build.ts --serve", "prepare": "husky" }, "jest-junit": { diff --git a/playground/build.ts b/playground/build.ts index aac39ec..56f448f 100644 --- a/playground/build.ts +++ b/playground/build.ts @@ -1,6 +1,6 @@ import * as esbuild from 'esbuild'; -esbuild.buildSync({ +const buildOptions: esbuild.BuildOptions = { entryPoints: ['playground/playground.ts'], bundle: true, outfile: 'playground/playground.bundle.js', @@ -9,6 +9,19 @@ esbuild.buildSync({ platform: 'browser', target: 'es2020', sourcemap: true, -}); +}; -console.log('Playground bundle built successfully.'); +const serve = process.argv.includes('--serve'); + +if (serve) { + (async () => { + const ctx = await esbuild.context(buildOptions); + await ctx.watch(); + const { host, port } = await ctx.serve({ servedir: 'playground', port: 3000 }); + console.log(`Playground dev server running at http://localhost:${port}`); + console.log('Watching for changes...'); + })(); +} else { + esbuild.buildSync(buildOptions); + console.log('Playground bundle built successfully.'); +} diff --git a/playground/index.html b/playground/index.html index 1a8978f..789a77e 100644 --- a/playground/index.html +++ b/playground/index.html @@ -91,23 +91,22 @@ margin-left: auto; } - .panels { + /* ─── Main split view ─── */ + + .main { display: flex; flex: 1; overflow: hidden; } - .panel { + .editor-pane { flex: 1; display: flex; flex-direction: column; - border-right: 1px solid #313244; - min-width: 0; + min-width: 200px; } - .panel:last-child { border-right: none; } - - .panel-header { + .pane-header { padding: 8px 16px; font-size: 11px; font-weight: 600; @@ -134,6 +133,65 @@ outline: none; } + /* ─── Resize handle ─── */ + + .resize-handle { + width: 4px; + cursor: col-resize; + background: #313244; + flex-shrink: 0; + transition: background 0.15s; + } + + .resize-handle:hover, + .resize-handle.active { + background: #89b4fa; + } + + /* ─── Output pane with tabs ─── */ + + .output-pane { + flex: 1; + display: flex; + flex-direction: column; + min-width: 200px; + } + + .tab-bar { + display: flex; + background: #181825; + border-bottom: 1px solid #313244; + flex-shrink: 0; + } + + .tab { + padding: 8px 16px; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.8px; + color: #6c7086; + background: transparent; + border: none; + border-bottom: 2px solid transparent; + cursor: pointer; + transition: all 0.15s; + font-family: inherit; + } + + .tab:hover { color: #a6adc8; } + .tab.active { + color: #cdd6f4; + border-bottom-color: #89b4fa; + } + + .tab-content { + flex: 1; + overflow: hidden; + display: flex; + flex-direction: column; + } + .output { flex: 1; overflow: auto; @@ -147,9 +205,102 @@ .output .error { color: #f38ba8; } + .tab-panel { display: none; } + .tab-panel.active { display: flex; flex-direction: column; flex: 1; } + #watOutput { color: #a6e3a1; } #runOutput { color: #f9e2af; } + /* ─── Console drawer ─── */ + + .console-drawer { + flex-shrink: 0; + background: #181825; + border-top: 1px solid #313244; + display: flex; + flex-direction: column; + } + + .console-header { + display: flex; + align-items: center; + gap: 8px; + padding: 6px 16px; + cursor: pointer; + user-select: none; + flex-shrink: 0; + } + + .console-header:hover { background: #1e1e2e; } + + .console-chevron { + font-size: 10px; + color: #6c7086; + transition: transform 0.2s; + display: inline-block; + } + + .console-drawer.open .console-chevron { + transform: rotate(180deg); + } + + .console-label { + font-size: 11px; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.8px; + color: #a6adc8; + } + + .console-badge { + font-size: 10px; + padding: 0 6px; + border-radius: 8px; + background: #45475a; + color: #a6adc8; + display: none; + } + + .console-drawer:not(.open) .console-badge.has-messages { + display: inline; + } + + .console-clear { + margin-left: auto; + padding: 2px 8px; + border-radius: 4px; + border: 1px solid #45475a; + background: transparent; + color: #6c7086; + font-size: 11px; + cursor: pointer; + font-family: inherit; + } + + .console-clear:hover { + background: #313244; + color: #a6adc8; + } + + .console-body { + display: none; + overflow: auto; + padding: 8px 16px; + font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace; + font-size: 13px; + line-height: 1.6; + white-space: pre-wrap; + word-break: break-all; + color: #f9e2af; + height: 180px; + } + + .console-drawer.open .console-body { + display: block; + } + + .console-body .error { color: #f38ba8; } + /* ─── Example Picker Dialog ─── */ .dialog-overlay { @@ -167,7 +318,7 @@ background: #1e1e2e; border: 1px solid #45475a; border-radius: 12px; - width: 720px; + width: 840px; max-width: 90vw; max-height: 80vh; display: flex; @@ -203,6 +354,30 @@ .dialog-search::placeholder { color: #6c7086; } .dialog-search:focus { border-color: #89b4fa; } + .dialog-search-row { + display: flex; + gap: 8px; + } + + .filter-select { + padding: 8px 12px; + border-radius: 6px; + border: 1px solid #45475a; + background: #313244; + color: #cdd6f4; + font-size: 13px; + outline: none; + cursor: pointer; + font-family: inherit; + min-width: 140px; + transition: border-color 0.15s; + } + + .filter-select:focus { border-color: #89b4fa; } + + .filter-select option { background: #313244; color: #cdd6f4; } + .filter-select optgroup { color: #6c7086; font-style: normal; } + .dialog-body { overflow-y: auto; padding: 16px 24px 24px; @@ -274,6 +449,29 @@ white-space: nowrap; width: 100%; } + + .dialog-card-meta { + display: flex; + gap: 4px; + margin-top: 4px; + flex-wrap: wrap; + } + + .card-target { + font-size: 9px; + padding: 1px 5px; + border-radius: 4px; + background: #313244; + color: #6c7086; + } + + .card-feature { + font-size: 9px; + padding: 1px 5px; + border-radius: 4px; + background: #1e3a5f; + color: #89b4fa; + } @@ -287,19 +485,31 @@

webasmjs

Ctrl+Enter to run -
-
-
JavaScript
+
+
+
JavaScript
-
-
WAT Output
-
+
+
+
+ + +
+
+
+
+
-
-
Run Output
-
+
+
+
+ + Console + 0 +
+
diff --git a/playground/playground.bundle.js b/playground/playground.bundle.js index c882157..efe4425 100644 --- a/playground/playground.bundle.js +++ b/playground/playground.bundle.js @@ -46,6 +46,8 @@ var webasmPlayground = (() => { Element: { name: "Element", value: 9 }, Code: { name: "Code", value: 10 }, Data: { name: "Data", value: 11 }, + DataCount: { name: "DataCount", value: 12 }, + Tag: { name: "Tag", value: 13 }, createCustom(name) { return { name, value: 0 }; } @@ -297,6 +299,9 @@ var webasmPlayground = (() => { writeExportSection(writer) { _BinaryModuleWriter.writeSection(writer, SectionType.Export, this.moduleBuilder._exports); } + writeTagSection(writer) { + _BinaryModuleWriter.writeSection(writer, SectionType.Tag, this.moduleBuilder._tags); + } writeStartSection(writer) { if (!this.moduleBuilder._startFunction) { return; @@ -426,6 +431,7 @@ var webasmPlayground = (() => { this.writeTableSection(writer); this.writeMemorySection(writer); this.writeGlobalSection(writer); + this.writeTagSection(writer); this.writeExportSection(writer); this.writeStartSection(writer); this.writeElementSection(writer); @@ -436,893 +442,6 @@ var webasmPlayground = (() => { } }; - // src/BinaryReader.ts - var MagicHeader2 = 1836278016; - var BinaryReader = class { - constructor(buffer) { - this.buffer = buffer; - this.offset = 0; - } - read() { - const magic = this.readUInt32(); - if (magic !== MagicHeader2) { - throw new Error(`Invalid WASM magic header: 0x${magic.toString(16)}`); - } - const version = this.readUInt32(); - if (version !== 1) { - throw new Error(`Unsupported WASM version: ${version}`); - } - const module = { - version, - types: [], - imports: [], - functions: [], - tables: [], - memories: [], - globals: [], - exports: [], - start: null, - elements: [], - data: [], - customSections: [] - }; - const functionTypeIndices = []; - while (this.offset < this.buffer.length) { - const sectionId = this.readVarUInt7(); - const sectionSize = this.readVarUInt32(); - const sectionEnd = this.offset + sectionSize; - switch (sectionId) { - case 0: - this.readCustomSection(module, sectionEnd); - break; - case 1: - this.readTypeSection(module); - break; - case 2: - this.readImportSection(module); - break; - case 3: - this.readFunctionSection(functionTypeIndices); - break; - case 4: - this.readTableSection(module); - break; - case 5: - this.readMemorySection(module); - break; - case 6: - this.readGlobalSection(module); - break; - case 7: - this.readExportSection(module); - break; - case 8: - module.start = this.readVarUInt32(); - break; - case 9: - this.readElementSection(module); - break; - case 10: - this.readCodeSection(module, functionTypeIndices); - break; - case 11: - this.readDataSection(module); - break; - default: - this.offset = sectionEnd; - break; - } - this.offset = sectionEnd; - } - return module; - } - readCustomSection(module, sectionEnd) { - const nameLen = this.readVarUInt32(); - const name = this.readString(nameLen); - if (name === "name") { - module.nameSection = this.readNameSection(sectionEnd); - return; - } - const remaining = sectionEnd - this.offset; - const data = this.readBytes(remaining); - module.customSections.push({ name, data }); - } - readNameSection(sectionEnd) { - const info = {}; - while (this.offset < sectionEnd) { - const subsectionId = this.readVarUInt7(); - const subsectionSize = this.readVarUInt32(); - const subsectionEnd = this.offset + subsectionSize; - switch (subsectionId) { - case 0: { - const len = this.readVarUInt32(); - info.moduleName = this.readString(len); - break; - } - case 1: { - const count = this.readVarUInt32(); - info.functionNames = /* @__PURE__ */ new Map(); - for (let i = 0; i < count; i++) { - const index = this.readVarUInt32(); - const len = this.readVarUInt32(); - info.functionNames.set(index, this.readString(len)); - } - break; - } - case 2: { - const funcCount = this.readVarUInt32(); - info.localNames = /* @__PURE__ */ new Map(); - for (let i = 0; i < funcCount; i++) { - const funcIndex = this.readVarUInt32(); - const localCount = this.readVarUInt32(); - const locals = /* @__PURE__ */ new Map(); - for (let j = 0; j < localCount; j++) { - const localIndex = this.readVarUInt32(); - const len = this.readVarUInt32(); - locals.set(localIndex, this.readString(len)); - } - info.localNames.set(funcIndex, locals); - } - break; - } - case 7: { - const count = this.readVarUInt32(); - info.globalNames = /* @__PURE__ */ new Map(); - for (let i = 0; i < count; i++) { - const index = this.readVarUInt32(); - const len = this.readVarUInt32(); - info.globalNames.set(index, this.readString(len)); - } - break; - } - default: - this.offset = subsectionEnd; - break; - } - this.offset = subsectionEnd; - } - return info; - } - readTypeSection(module) { - const count = this.readVarUInt32(); - for (let i = 0; i < count; i++) { - const form = this.readVarInt7(); - const paramCount = this.readVarUInt32(); - const parameterTypes = []; - for (let j = 0; j < paramCount; j++) { - parameterTypes.push(this.readValueType()); - } - const returnCount = this.readVarUInt32(); - const returnTypes = []; - for (let j = 0; j < returnCount; j++) { - returnTypes.push(this.readValueType()); - } - module.types.push({ parameterTypes, returnTypes }); - } - } - readImportSection(module) { - const count = this.readVarUInt32(); - for (let i = 0; i < count; i++) { - const moduleNameLen = this.readVarUInt32(); - const moduleName = this.readString(moduleNameLen); - const fieldNameLen = this.readVarUInt32(); - const fieldName = this.readString(fieldNameLen); - const kind = this.readUInt8(); - const imp = { moduleName, fieldName, kind }; - switch (kind) { - case 0: - imp.typeIndex = this.readVarUInt32(); - break; - case 1: { - const elementType = this.readVarInt7(); - const { initial, maximum } = this.readResizableLimits(); - imp.tableType = { elementType, initial, maximum }; - break; - } - case 2: { - const { initial, maximum } = this.readResizableLimits(); - imp.memoryType = { initial, maximum }; - break; - } - case 3: { - const valueType = this.readVarInt7(); - const mutable = this.readVarUInt1() === 1; - imp.globalType = { valueType, mutable }; - break; - } - } - module.imports.push(imp); - } - } - readFunctionSection(functionTypeIndices) { - const count = this.readVarUInt32(); - for (let i = 0; i < count; i++) { - functionTypeIndices.push(this.readVarUInt32()); - } - } - readTableSection(module) { - const count = this.readVarUInt32(); - for (let i = 0; i < count; i++) { - const elementType = this.readVarInt7(); - const { initial, maximum } = this.readResizableLimits(); - module.tables.push({ elementType, initial, maximum }); - } - } - readMemorySection(module) { - const count = this.readVarUInt32(); - for (let i = 0; i < count; i++) { - const { initial, maximum } = this.readResizableLimits(); - module.memories.push({ initial, maximum }); - } - } - readGlobalSection(module) { - const count = this.readVarUInt32(); - for (let i = 0; i < count; i++) { - const valueType = this.readVarInt7(); - const mutable = this.readVarUInt1() === 1; - const initExpr = this.readInitExpr(); - module.globals.push({ valueType, mutable, initExpr }); - } - } - readExportSection(module) { - const count = this.readVarUInt32(); - for (let i = 0; i < count; i++) { - const nameLen = this.readVarUInt32(); - const name = this.readString(nameLen); - const kind = this.readUInt8(); - const index = this.readVarUInt32(); - module.exports.push({ name, kind, index }); - } - } - readElementSection(module) { - const count = this.readVarUInt32(); - for (let i = 0; i < count; i++) { - const tableIndex = this.readVarUInt32(); - const offsetExpr = this.readInitExpr(); - const numElems = this.readVarUInt32(); - const functionIndices = []; - for (let j = 0; j < numElems; j++) { - functionIndices.push(this.readVarUInt32()); - } - module.elements.push({ tableIndex, offsetExpr, functionIndices }); - } - } - readCodeSection(module, functionTypeIndices) { - const count = this.readVarUInt32(); - for (let i = 0; i < count; i++) { - const bodySize = this.readVarUInt32(); - const bodyEnd = this.offset + bodySize; - const localCount = this.readVarUInt32(); - const locals = []; - for (let j = 0; j < localCount; j++) { - const lCount = this.readVarUInt32(); - const type = this.readVarInt7(); - locals.push({ count: lCount, type }); - } - const bodyLength = bodyEnd - this.offset; - const body = this.readBytes(bodyLength); - module.functions.push({ - typeIndex: functionTypeIndices[i], - locals, - body - }); - this.offset = bodyEnd; - } - } - readDataSection(module) { - const count = this.readVarUInt32(); - for (let i = 0; i < count; i++) { - const memoryIndex = this.readVarUInt32(); - const offsetExpr = this.readInitExpr(); - const dataSize = this.readVarUInt32(); - const data = this.readBytes(dataSize); - module.data.push({ memoryIndex, offsetExpr, data }); - } - } - readInitExpr() { - const start = this.offset; - while (this.offset < this.buffer.length) { - const byte = this.buffer[this.offset++]; - if (byte === 11) { - break; - } - switch (byte) { - case 65: - this.readVarInt32(); - break; - case 66: - this.readVarInt64(); - break; - case 67: - this.offset += 4; - break; - case 68: - this.offset += 8; - break; - case 35: - this.readVarUInt32(); - break; - } - } - return this.buffer.slice(start, this.offset); - } - readResizableLimits() { - const flags = this.readVarUInt1(); - const initial = this.readVarUInt32(); - const maximum = flags === 1 ? this.readVarUInt32() : null; - return { initial, maximum }; - } - readValueType() { - const value = this.readVarInt7(); - switch (value) { - case -1: - return ValueType.Int32; - case -2: - return ValueType.Int64; - case -3: - return ValueType.Float32; - case -4: - return ValueType.Float64; - default: - throw new Error(`Unknown value type: 0x${(value & 255).toString(16)}`); - } - } - // --- Primitive readers --- - readUInt8() { - return this.buffer[this.offset++]; - } - readUInt32() { - const value = this.buffer[this.offset] | this.buffer[this.offset + 1] << 8 | this.buffer[this.offset + 2] << 16 | this.buffer[this.offset + 3] << 24; - this.offset += 4; - return value >>> 0; - } - readVarUInt1() { - return this.buffer[this.offset++] & 1; - } - readVarUInt7() { - return this.buffer[this.offset++] & 127; - } - readVarUInt32() { - let result = 0; - let shift = 0; - let byte; - do { - byte = this.buffer[this.offset++]; - result |= (byte & 127) << shift; - shift += 7; - } while (byte & 128); - return result >>> 0; - } - readVarInt7() { - const byte = this.buffer[this.offset++]; - return byte & 64 ? byte | 4294967168 : byte & 127; - } - readVarInt32() { - let result = 0; - let shift = 0; - let byte; - do { - byte = this.buffer[this.offset++]; - result |= (byte & 127) << shift; - shift += 7; - } while (byte & 128); - if (shift < 32 && byte & 64) { - result |= -(1 << shift); - } - return result; - } - readVarInt64() { - let result = 0n; - let shift = 0n; - let byte; - do { - byte = this.buffer[this.offset++]; - result |= BigInt(byte & 127) << shift; - shift += 7n; - } while (byte & 128); - if (shift < 64n && byte & 64) { - result |= -(1n << shift); - } - return result; - } - readString(length) { - const bytes = this.buffer.slice(this.offset, this.offset + length); - this.offset += length; - return new TextDecoder().decode(bytes); - } - readBytes(length) { - const bytes = this.buffer.slice(this.offset, this.offset + length); - this.offset += length; - return bytes; - } - }; - - // src/CustomSectionBuilder.ts - var CustomSectionBuilder = class { - constructor(name, data) { - this.name = name; - this.type = SectionType.createCustom(name); - this._data = data || new Uint8Array(0); - } - write(writer) { - const sectionWriter = new BinaryWriter(); - sectionWriter.writeVarUInt32(this.name.length); - sectionWriter.writeString(this.name); - if (this._data.length > 0) { - sectionWriter.writeBytes(this._data); - } - writer.writeVarUInt7(0); - writer.writeVarUInt32(sectionWriter.length); - writer.writeBytes(sectionWriter); - } - toBytes() { - const buffer = new BinaryWriter(); - this.write(buffer); - return buffer.toArray(); - } - }; - - // src/FunctionParameterBuilder.ts - var FunctionParameterBuilder = class { - constructor(valueType, index) { - this.name = null; - this.valueType = valueType; - this.index = index; - } - withName(name) { - this.name = name; - return this; - } - }; - - // src/LocalBuilder.ts - var LocalBuilder = class { - constructor(valueType, name, index, count) { - this.index = index; - this.valueType = valueType; - this.name = name; - this.count = count; - } - write(writer) { - writer.writeVarUInt32(this.count); - writer.writeVarInt7(this.valueType.value); - } - toBytes() { - const buffer = new BinaryWriter(); - this.write(buffer); - return buffer.toArray(); - } - }; - - // src/GlobalType.ts - var GlobalType = class { - constructor(valueType, mutable) { - this._valueType = valueType; - this._mutable = mutable; - } - get valueType() { - return this._valueType; - } - get mutable() { - return this._mutable; - } - write(writer) { - writer.writeVarInt7(this._valueType.value); - writer.writeVarUInt1(this._mutable ? 1 : 0); - } - toBytes() { - const buffer = new BinaryWriter(); - this.write(buffer); - return buffer.toArray(); - } - }; - - // src/GlobalBuilder.ts - var GlobalBuilder = class _GlobalBuilder { - constructor(moduleBuilder, valueType, mutable, index) { - this._initExpressionEmitter = null; - this.name = null; - this._moduleBuilder = moduleBuilder; - this._globalType = new GlobalType(valueType, mutable); - this._index = index; - } - withName(name) { - this.name = name; - return this; - } - get globalType() { - return this._globalType; - } - get valueType() { - return this._globalType.valueType; - } - createInitEmitter(callback) { - if (this._initExpressionEmitter) { - throw new Error("Initialization expression emitter has already been created."); - } - this._initExpressionEmitter = new InitExpressionEmitter( - "Global" /* Global */, - this.valueType - ); - if (callback) { - callback(this._initExpressionEmitter); - this._initExpressionEmitter.end(); - } - return this._initExpressionEmitter; - } - value(value) { - if (typeof value === "function") { - this.createInitEmitter(value); - } else if (value instanceof _GlobalBuilder) { - this.createInitEmitter((asm) => { - asm.get_global(value); - }); - } else if (typeof value === "number" || typeof value === "bigint") { - this.createInitEmitter((asm) => { - const vt = this.valueType; - if (vt === ValueType.Int32) { - asm.const_i32(Number(value)); - } else if (vt === ValueType.Int64) { - asm.const_i64(BigInt(value)); - } else if (vt === ValueType.Float32) { - asm.const_f32(Number(value)); - } else if (vt === ValueType.Float64) { - asm.const_f64(Number(value)); - } else { - throw new Error(`Unsupported global value type: ${vt.name}`); - } - }); - } else { - throw new Error("Unsupported global value."); - } - } - withExport(name) { - this._moduleBuilder.exportGlobal(this, name); - return this; - } - write(writer) { - if (!this._initExpressionEmitter) { - throw new Error("The initialization expression was not defined."); - } - this._globalType.write(writer); - this._initExpressionEmitter.write(writer); - } - toBytes() { - const buffer = new BinaryWriter(); - this.write(buffer); - return buffer.toArray(); - } - }; - - // src/ImportBuilder.ts - var ImportBuilder = class { - constructor(moduleName, fieldName, externalKind, data, index) { - this.moduleName = moduleName; - this.fieldName = fieldName; - this.externalKind = externalKind; - this.data = data; - this.index = index; - } - write(writer) { - writer.writeVarUInt32(this.moduleName.length); - writer.writeString(this.moduleName); - writer.writeVarUInt32(this.fieldName.length); - writer.writeString(this.fieldName); - writer.writeUInt8(this.externalKind.value); - switch (this.externalKind) { - case ExternalKind.Function: - writer.writeVarUInt32(this.data.index); - break; - case ExternalKind.Global: - case ExternalKind.Memory: - case ExternalKind.Table: - this.data.write(writer); - break; - default: - throw new Error("Unknown external kind."); - } - } - toBytes() { - const buffer = new BinaryWriter(); - this.write(buffer); - return buffer.toArray(); - } - }; - - // src/ImmediateEncoder.ts - var ImmediateEncoder = class { - static encodeBlockSignature(writer, blockType) { - writer.writeVarInt7(blockType.value); - } - static encodeRelativeDepth(writer, label, depth) { - const relativeDepth = depth - label.block.depth; - writer.writeVarInt7(relativeDepth); - } - static encodeBranchTable(writer, defaultLabel, labels) { - writer.writeVarUInt32(labels.length); - labels.forEach((x) => { - writer.writeVarUInt32(x); - }); - writer.writeVarUInt32(defaultLabel); - } - static encodeFunction(writer, func) { - let functionIndex = 0; - if (func instanceof ImportBuilder) { - functionIndex = func.index; - } else if (typeof func === "object" && func !== null && "_index" in func) { - functionIndex = func._index; - } else if (typeof func === "number") { - functionIndex = func; - } else { - throw new Error( - "Function argument must either be the index of the function or a FunctionBuilder." - ); - } - writer.writeVarUInt32(functionIndex); - } - static encodeIndirectFunction(writer, funcType) { - writer.writeVarUInt32(funcType.index); - writer.writeVarUInt1(0); - } - static encodeLocal(writer, local) { - Arg.notNull("local", local); - let localIndex = 0; - if (local instanceof LocalBuilder) { - localIndex = local.index; - } else if (local instanceof FunctionParameterBuilder) { - localIndex = local.index; - } else if (typeof local === "number") { - localIndex = local; - } else { - throw new Error( - "Local argument must either be the index of the local variable or a LocalBuilder." - ); - } - writer.writeVarUInt32(localIndex); - } - static encodeGlobal(writer, global) { - Arg.notNull("global", global); - let globalIndex = 0; - if (global instanceof GlobalBuilder) { - globalIndex = global._index; - } else if (global instanceof ImportBuilder) { - if (global.externalKind !== ExternalKind.Global) { - throw new Error("Import external kind must be global."); - } - globalIndex = global.index; - } else if (typeof global === "number") { - globalIndex = global; - } else { - throw new Error( - "Global argument must either be the index of the global variable, GlobalBuilder, or an ImportBuilder." - ); - } - writer.writeVarUInt32(globalIndex); - } - static encodeFloat32(writer, value) { - writer.writeFloat32(value); - } - static encodeFloat64(writer, value) { - writer.writeFloat64(value); - } - static encodeVarInt32(writer, value) { - writer.writeVarInt32(value); - } - static encodeVarInt64(writer, value) { - writer.writeVarInt64(value); - } - static encodeVarUInt32(writer, value) { - writer.writeVarUInt32(value); - } - static encodeVarUInt1(writer, value) { - writer.writeVarUInt1(value); - } - static encodeMemoryImmediate(writer, alignment, offset) { - writer.writeVarUInt32(alignment); - writer.writeVarUInt32(offset); - } - static encodeV128Const(writer, bytes) { - for (let i = 0; i < 16; i++) { - writer.writeByte(bytes[i]); - } - } - static encodeLaneIndex(writer, index) { - writer.writeByte(index); - } - static encodeShuffleMask(writer, mask) { - for (let i = 0; i < 16; i++) { - writer.writeByte(mask[i]); - } - } - }; - - // src/Immediate.ts - var Immediate = class _Immediate { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - constructor(type, values) { - Arg.notNull("type", type); - Arg.notNull("values", values); - this.type = type; - this.values = values; - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static createBlockSignature(blockType) { - return new _Immediate("BlockSignature" /* BlockSignature */, [blockType]); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static createBranchTable(defaultLabel, labels, depth) { - const relativeDepths = labels.map((x) => { - return depth - x.block.depth; - }); - const defaultLabelDepth = depth - defaultLabel.block.depth; - return new _Immediate("BranchTable" /* BranchTable */, [defaultLabelDepth, relativeDepths]); - } - static createFloat32(value) { - return new _Immediate("Float32" /* Float32 */, [value]); - } - static createFloat64(value) { - return new _Immediate("Float64" /* Float64 */, [value]); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static createFunction(functionBuilder) { - return new _Immediate("Function" /* Function */, [functionBuilder]); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static createGlobal(globalBuilder) { - return new _Immediate("Global" /* Global */, [globalBuilder]); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static createIndirectFunction(functionTypeBuilder) { - return new _Immediate("IndirectFunction" /* IndirectFunction */, [functionTypeBuilder]); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static createLocal(local) { - return new _Immediate("Local" /* Local */, [local]); - } - static createMemoryImmediate(alignment, offset) { - return new _Immediate("MemoryImmediate" /* MemoryImmediate */, [alignment, offset]); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static createRelativeDepth(label, depth) { - return new _Immediate("RelativeDepth" /* RelativeDepth */, [label, depth]); - } - static createVarUInt1(value) { - return new _Immediate("VarUInt1" /* VarUInt1 */, [value]); - } - static createVarInt32(value) { - return new _Immediate("VarInt32" /* VarInt32 */, [value]); - } - static createVarInt64(value) { - return new _Immediate("VarInt64" /* VarInt64 */, [value]); - } - static createVarUInt32(value) { - return new _Immediate("VarUInt32" /* VarUInt32 */, [value]); - } - static createV128Const(bytes) { - if (bytes.length !== 16) { - throw new Error("V128 constant must be exactly 16 bytes."); - } - return new _Immediate("V128Const" /* V128Const */, [bytes]); - } - static createLaneIndex(index) { - return new _Immediate("LaneIndex" /* LaneIndex */, [index]); - } - static createShuffleMask(mask) { - if (mask.length !== 16) { - throw new Error("Shuffle mask must be exactly 16 bytes."); - } - return new _Immediate("ShuffleMask" /* ShuffleMask */, [mask]); - } - writeBytes(writer) { - switch (this.type) { - case "BlockSignature" /* BlockSignature */: - ImmediateEncoder.encodeBlockSignature(writer, this.values[0]); - break; - case "BranchTable" /* BranchTable */: - ImmediateEncoder.encodeBranchTable(writer, this.values[0], this.values[1]); - break; - case "Float32" /* Float32 */: - ImmediateEncoder.encodeFloat32(writer, this.values[0]); - break; - case "Float64" /* Float64 */: - ImmediateEncoder.encodeFloat64(writer, this.values[0]); - break; - case "Function" /* Function */: - ImmediateEncoder.encodeFunction(writer, this.values[0]); - break; - case "Global" /* Global */: - ImmediateEncoder.encodeGlobal(writer, this.values[0]); - break; - case "IndirectFunction" /* IndirectFunction */: - ImmediateEncoder.encodeIndirectFunction(writer, this.values[0]); - break; - case "Local" /* Local */: - ImmediateEncoder.encodeLocal(writer, this.values[0]); - break; - case "MemoryImmediate" /* MemoryImmediate */: - ImmediateEncoder.encodeMemoryImmediate(writer, this.values[0], this.values[1]); - break; - case "RelativeDepth" /* RelativeDepth */: - ImmediateEncoder.encodeRelativeDepth(writer, this.values[0], this.values[1]); - break; - case "VarInt32" /* VarInt32 */: - ImmediateEncoder.encodeVarInt32(writer, this.values[0]); - break; - case "VarInt64" /* VarInt64 */: - ImmediateEncoder.encodeVarInt64(writer, this.values[0]); - break; - case "VarUInt1" /* VarUInt1 */: - ImmediateEncoder.encodeVarUInt1(writer, this.values[0]); - break; - case "VarUInt32" /* VarUInt32 */: - ImmediateEncoder.encodeVarUInt32(writer, this.values[0]); - break; - case "V128Const" /* V128Const */: - ImmediateEncoder.encodeV128Const(writer, this.values[0]); - break; - case "LaneIndex" /* LaneIndex */: - ImmediateEncoder.encodeLaneIndex(writer, this.values[0]); - break; - case "ShuffleMask" /* ShuffleMask */: - ImmediateEncoder.encodeShuffleMask(writer, this.values[0]); - break; - default: - throw new Error("Cannot encode unknown operand type."); - } - } - toBytes() { - const buffer = new BinaryWriter(); - this.writeBytes(buffer); - return buffer.toArray(); - } - }; - - // src/Instruction.ts - var Instruction = class { - constructor(opCode, immediate) { - Arg.notNull("opCode", opCode); - this.opCode = opCode; - this.immediate = immediate; - } - write(writer) { - if (this.opCode.prefix !== void 0) { - writer.writeByte(this.opCode.prefix); - writer.writeVarUInt32(this.opCode.value); - } else { - writer.writeByte(this.opCode.value); - } - if (this.immediate) { - this.immediate.writeBytes(writer); - } - } - toBytes() { - const buffer = new BinaryWriter(); - this.write(buffer); - return buffer.toArray(); - } - }; - - // src/LabelBuilder.ts - var LabelBuilder = class { - constructor() { - this.resolved = false; - this.block = null; - } - get isResolved() { - return this.resolved; - } - resolve(block) { - this.block = block; - this.resolved = true; - } - reference(block) { - if (this.isResolved) { - throw new Error("Cannot add a reference to a label that has been resolved."); - } - this.block = block; - } - }; - // src/OpCodes.ts var OpCodes = { "unreachable": { @@ -1330,3613 +449,5396 @@ var webasmPlayground = (() => { mnemonic: "unreachable", stackBehavior: "None" }, - "nop": { - value: 1, - mnemonic: "nop", - stackBehavior: "None" + "nop": { + value: 1, + mnemonic: "nop", + stackBehavior: "None" + }, + "block": { + value: 2, + mnemonic: "block", + immediate: "BlockSignature", + controlFlow: "Push", + stackBehavior: "None" + }, + "loop": { + value: 3, + mnemonic: "loop", + immediate: "BlockSignature", + controlFlow: "Push", + stackBehavior: "None" + }, + "if": { + value: 4, + mnemonic: "if", + immediate: "BlockSignature", + controlFlow: "Push", + stackBehavior: "Pop", + popOperands: ["Int32"] + }, + "else": { + value: 5, + mnemonic: "else", + stackBehavior: "None" + }, + "try": { + value: 6, + mnemonic: "try", + immediate: "BlockSignature", + controlFlow: "Push", + stackBehavior: "None", + feature: "exception-handling" + }, + "catch": { + value: 7, + mnemonic: "catch", + immediate: "VarUInt32", + stackBehavior: "None", + feature: "exception-handling" + }, + "throw": { + value: 8, + mnemonic: "throw", + immediate: "VarUInt32", + stackBehavior: "None", + feature: "exception-handling" + }, + "rethrow": { + value: 9, + mnemonic: "rethrow", + immediate: "VarUInt32", + stackBehavior: "None", + feature: "exception-handling" + }, + "end": { + value: 11, + mnemonic: "end", + controlFlow: "Pop", + stackBehavior: "None" + }, + "br": { + value: 12, + mnemonic: "br", + immediate: "RelativeDepth", + stackBehavior: "None" + }, + "br_if": { + value: 13, + mnemonic: "br_if", + immediate: "RelativeDepth", + stackBehavior: "Pop", + popOperands: ["Int32"] + }, + "br_table": { + value: 14, + mnemonic: "br_table", + immediate: "BranchTable", + stackBehavior: "Pop", + popOperands: ["Int32"] + }, + "return": { + value: 15, + mnemonic: "return", + stackBehavior: "None" + }, + "call": { + value: 16, + mnemonic: "call", + immediate: "Function", + stackBehavior: "PopPush" + }, + "call_indirect": { + value: 17, + mnemonic: "call_indirect", + immediate: "IndirectFunction", + stackBehavior: "PopPush", + popOperands: ["Int32"] + }, + "return_call": { + value: 18, + mnemonic: "return_call", + immediate: "Function", + stackBehavior: "PopPush", + feature: "tail-call" + }, + "return_call_indirect": { + value: 19, + mnemonic: "return_call_indirect", + immediate: "IndirectFunction", + stackBehavior: "PopPush", + popOperands: ["Int32"], + feature: "tail-call" + }, + "delegate": { + value: 24, + mnemonic: "delegate", + immediate: "VarUInt32", + stackBehavior: "None", + feature: "exception-handling" + }, + "catch_all": { + value: 25, + mnemonic: "catch_all", + stackBehavior: "None", + feature: "exception-handling" + }, + "drop": { + value: 26, + mnemonic: "drop", + stackBehavior: "Pop", + popOperands: ["Any"] + }, + "select": { + value: 27, + mnemonic: "select", + stackBehavior: "PopPush", + popOperands: ["Any", "Any", "Int32"], + pushOperands: ["Any"] + }, + "get_local": { + value: 32, + mnemonic: "local.get", + immediate: "Local", + stackBehavior: "Push", + pushOperands: ["Any"] + }, + "set_local": { + value: 33, + mnemonic: "local.set", + immediate: "Local", + stackBehavior: "Pop", + popOperands: ["Any"] + }, + "tee_local": { + value: 34, + mnemonic: "local.tee", + immediate: "Local", + stackBehavior: "PopPush", + popOperands: ["Any"], + pushOperands: ["Any"] + }, + "get_global": { + value: 35, + mnemonic: "global.get", + immediate: "Global", + stackBehavior: "Push", + pushOperands: ["Any"] + }, + "set_global": { + value: 36, + mnemonic: "global.set", + immediate: "Global", + stackBehavior: "Pop", + popOperands: ["Any"] + }, + "i32_load": { + value: 40, + mnemonic: "i32.load", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int32"] + }, + "i64_load": { + value: 41, + mnemonic: "i64.load", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int64"] + }, + "f32_load": { + value: 42, + mnemonic: "f32.load", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Float32"] + }, + "f64_load": { + value: 43, + mnemonic: "f64.load", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Float64"] + }, + "i32_load8_s": { + value: 44, + mnemonic: "i32.load8_s", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int32"] + }, + "i32_load8_u": { + value: 45, + mnemonic: "i32.load8_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int32"] + }, + "i32_load16_s": { + value: 46, + mnemonic: "i32.load16_s", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int32"] + }, + "i32_load16_u": { + value: 47, + mnemonic: "i32.load16_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int32"] + }, + "i64_load8_s": { + value: 48, + mnemonic: "i64.load8_s", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int64"] + }, + "i64_load8_u": { + value: 49, + mnemonic: "i64.load8_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int64"] + }, + "i64_load16_s": { + value: 50, + mnemonic: "i64.load16_s", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int64"] + }, + "i64_load16_u": { + value: 51, + mnemonic: "i64.load16_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int64"] + }, + "i64_load32_s": { + value: 52, + mnemonic: "i64.load32_s", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int64"] + }, + "i64_load32_u": { + value: 53, + mnemonic: "i64.load32_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int64"] + }, + "i32_store": { + value: 54, + mnemonic: "i32.store", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32"] + }, + "i64_store": { + value: 55, + mnemonic: "i64.store", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int64"] + }, + "f32_store": { + value: 56, + mnemonic: "f32.store", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Float32"] + }, + "f64_store": { + value: 57, + mnemonic: "f64.store", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Float64"] + }, + "i32_store8": { + value: 58, + mnemonic: "i32.store8", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32"] + }, + "i32_store16": { + value: 59, + mnemonic: "i32.store16", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32"] + }, + "i64_store8": { + value: 60, + mnemonic: "i64.store8", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int64"] + }, + "i64_store16": { + value: 61, + mnemonic: "i64.store16", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int64"] + }, + "i64_store32": { + value: 62, + mnemonic: "i64.store32", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int64"] + }, + "mem_size": { + value: 63, + mnemonic: "memory.size", + immediate: "VarUInt1", + stackBehavior: "Push", + pushOperands: ["Int32"] + }, + "mem_grow": { + value: 64, + mnemonic: "memory.grow", + immediate: "VarUInt1", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int32"] + }, + "i32_const": { + value: 65, + mnemonic: "i32.const", + immediate: "VarInt32", + stackBehavior: "Push", + pushOperands: ["Int32"] + }, + "i64_const": { + value: 66, + mnemonic: "i64.const", + immediate: "VarInt64", + stackBehavior: "Push", + pushOperands: ["Int64"] + }, + "f32_const": { + value: 67, + mnemonic: "f32.const", + immediate: "Float32", + stackBehavior: "Push", + pushOperands: ["Float32"] + }, + "f64_const": { + value: 68, + mnemonic: "f64.const", + immediate: "Float64", + stackBehavior: "Push", + pushOperands: ["Float64"] + }, + "i32_eqz": { + value: 69, + mnemonic: "i32.eqz", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int32"] + }, + "i32_eq": { + value: 70, + mnemonic: "i32.eq", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] + }, + "i32_ne": { + value: 71, + mnemonic: "i32.ne", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] + }, + "i32_lt_s": { + value: 72, + mnemonic: "i32.lt_s", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] }, - "block": { - value: 2, - mnemonic: "block", - immediate: "BlockSignature", - controlFlow: "Push", - stackBehavior: "None" + "i32_lt_u": { + value: 73, + mnemonic: "i32.lt_u", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] }, - "loop": { - value: 3, - mnemonic: "loop", - immediate: "BlockSignature", - controlFlow: "Push", - stackBehavior: "None" + "i32_gt_s": { + value: 74, + mnemonic: "i32.gt_s", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] }, - "if": { - value: 4, - mnemonic: "if", - immediate: "BlockSignature", - controlFlow: "Push", - stackBehavior: "Pop", - popOperands: ["Int32"] + "i32_gt_u": { + value: 75, + mnemonic: "i32.gt_u", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] }, - "else": { - value: 5, - mnemonic: "else", - stackBehavior: "None" + "i32_le_s": { + value: 76, + mnemonic: "i32.le_s", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] }, - "end": { - value: 11, - mnemonic: "end", - controlFlow: "Pop", - stackBehavior: "None" + "i32_le_u": { + value: 77, + mnemonic: "i32.le_u", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] }, - "br": { - value: 12, - mnemonic: "br", - immediate: "RelativeDepth", - stackBehavior: "None" + "i32_ge_s": { + value: 78, + mnemonic: "i32.ge_s", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] }, - "br_if": { - value: 13, - mnemonic: "br_if", - immediate: "RelativeDepth", - stackBehavior: "Pop", - popOperands: ["Int32"] + "i32_ge_u": { + value: 79, + mnemonic: "i32.ge_u", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] }, - "br_table": { - value: 14, - mnemonic: "br_table", - immediate: "BranchTable", - stackBehavior: "Pop", - popOperands: ["Int32"] + "i64_eqz": { + value: 80, + mnemonic: "i64.eqz", + stackBehavior: "PopPush", + popOperands: ["Int64"], + pushOperands: ["Int32"] }, - "return": { - value: 15, - mnemonic: "return", - stackBehavior: "None" + "i64_eq": { + value: 81, + mnemonic: "i64.eq", + stackBehavior: "PopPush", + popOperands: ["Int64", "Int64"], + pushOperands: ["Int32"] }, - "call": { - value: 16, - mnemonic: "call", - immediate: "Function", + "i64_ne": { + value: 82, + mnemonic: "i64.ne", stackBehavior: "PopPush", - popOperands: [], - pushOperands: [] + popOperands: ["Int64", "Int64"], + pushOperands: ["Int32"] }, - "call_indirect": { - value: 17, - mnemonic: "call_indirect", - immediate: "IndirectFunction", + "i64_lt_s": { + value: 83, + mnemonic: "i64.lt_s", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: [] + popOperands: ["Int64", "Int64"], + pushOperands: ["Int32"] }, - "drop": { - value: 26, - mnemonic: "drop", - stackBehavior: "Pop", - popOperands: ["Any"] + "i64_lt_u": { + value: 84, + mnemonic: "i64.lt_u", + stackBehavior: "PopPush", + popOperands: ["Int64", "Int64"], + pushOperands: ["Int32"] }, - "select": { - value: 27, - mnemonic: "select", + "i64_gt_s": { + value: 85, + mnemonic: "i64.gt_s", stackBehavior: "PopPush", - popOperands: ["Int32", "Any", "Any"], - pushOperands: ["Any"] + popOperands: ["Int64", "Int64"], + pushOperands: ["Int32"] }, - "get_local": { - value: 32, - mnemonic: "local.get", - immediate: "Local", - stackBehavior: "Push", - pushOperands: ["Any"] + "i64_gt_u": { + value: 86, + mnemonic: "i64.gt_u", + stackBehavior: "PopPush", + popOperands: ["Int64", "Int64"], + pushOperands: ["Int32"] }, - "set_local": { - value: 33, - mnemonic: "local.set", - immediate: "Local", - stackBehavior: "Pop", - popOperands: ["Any"] + "i64_le_s": { + value: 87, + mnemonic: "i64.le_s", + stackBehavior: "PopPush", + popOperands: ["Int64", "Int64"], + pushOperands: ["Int32"] }, - "tee_local": { - value: 34, - mnemonic: "local.tee", - immediate: "Local", + "i64_le_u": { + value: 88, + mnemonic: "i64.le_u", stackBehavior: "PopPush", - popOperands: ["Any"], - pushOperands: ["Any"] + popOperands: ["Int64", "Int64"], + pushOperands: ["Int32"] }, - "get_global": { - value: 35, - mnemonic: "global.get", - immediate: "Global", - stackBehavior: "Push", - pushOperands: ["Any"] + "i64_ge_s": { + value: 89, + mnemonic: "i64.ge_s", + stackBehavior: "PopPush", + popOperands: ["Int64", "Int64"], + pushOperands: ["Int32"] }, - "set_global": { - value: 36, - mnemonic: "global.set", - immediate: "Global", - stackBehavior: "Pop", - popOperands: ["Any"] + "i64_ge_u": { + value: 90, + mnemonic: "i64.ge_u", + stackBehavior: "PopPush", + popOperands: ["Int64", "Int64"], + pushOperands: ["Int32"] }, - "i32_load": { - value: 40, - mnemonic: "i32.load", - immediate: "MemoryImmediate", + "f32_eq": { + value: 91, + mnemonic: "f32.eq", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["Float32", "Float32"], pushOperands: ["Int32"] }, - "i64_load": { - value: 41, - mnemonic: "i64.load", - immediate: "MemoryImmediate", + "f32_ne": { + value: 92, + mnemonic: "f32.ne", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Int64"] + popOperands: ["Float32", "Float32"], + pushOperands: ["Int32"] }, - "f32_load": { - value: 42, - mnemonic: "f32.load", - immediate: "MemoryImmediate", + "f32_lt": { + value: 93, + mnemonic: "f32.lt", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Float32"] + popOperands: ["Float32", "Float32"], + pushOperands: ["Int32"] }, - "f64_load": { - value: 43, - mnemonic: "f64.load", - immediate: "MemoryImmediate", + "f32_gt": { + value: 94, + mnemonic: "f32.gt", + stackBehavior: "PopPush", + popOperands: ["Float32", "Float32"], + pushOperands: ["Int32"] + }, + "f32_le": { + value: 95, + mnemonic: "f32.le", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Float64"] + popOperands: ["Float32", "Float32"], + pushOperands: ["Int32"] }, - "i32_load8_s": { - value: 44, - mnemonic: "i32.load8_s", - immediate: "MemoryImmediate", + "f32_ge": { + value: 96, + mnemonic: "f32.ge", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["Float32", "Float32"], pushOperands: ["Int32"] }, - "i32_load8_u": { - value: 45, - mnemonic: "i32.load8_u", - immediate: "MemoryImmediate", + "f64_eq": { + value: 97, + mnemonic: "f64.eq", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["Float64", "Float64"], pushOperands: ["Int32"] }, - "i32_load16_s": { - value: 46, - mnemonic: "i32.load16_s", - immediate: "MemoryImmediate", + "f64_ne": { + value: 98, + mnemonic: "f64.ne", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["Float64", "Float64"], pushOperands: ["Int32"] }, - "i32_load16_u": { - value: 47, - mnemonic: "i32.load16_u", - immediate: "MemoryImmediate", + "f64_lt": { + value: 99, + mnemonic: "f64.lt", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["Float64", "Float64"], pushOperands: ["Int32"] }, - "i64_load8_s": { - value: 48, - mnemonic: "i64.load8_s", - immediate: "MemoryImmediate", + "f64_gt": { + value: 100, + mnemonic: "f64.gt", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Int64"] + popOperands: ["Float64", "Float64"], + pushOperands: ["Int32"] }, - "i64_load8_u": { - value: 49, - mnemonic: "i64.load8_u", - immediate: "MemoryImmediate", + "f64_le": { + value: 101, + mnemonic: "f64.le", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Int64"] + popOperands: ["Float64", "Float64"], + pushOperands: ["Int32"] }, - "i64_load16_s": { - value: 50, - mnemonic: "i64.load16_s", - immediate: "MemoryImmediate", + "f64_ge": { + value: 102, + mnemonic: "f64.ge", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Int64"] + popOperands: ["Float64", "Float64"], + pushOperands: ["Int32"] }, - "i64_load16_u": { - value: 51, - mnemonic: "i64.load16_u", - immediate: "MemoryImmediate", + "i32_clz": { + value: 103, + mnemonic: "i32.clz", stackBehavior: "PopPush", popOperands: ["Int32"], - pushOperands: ["Int64"] + pushOperands: ["Int32"] }, - "i64_load32_s": { - value: 52, - mnemonic: "i64.load32_s", - immediate: "MemoryImmediate", + "i32_ctz": { + value: 104, + mnemonic: "i32.ctz", stackBehavior: "PopPush", popOperands: ["Int32"], - pushOperands: ["Int64"] + pushOperands: ["Int32"] }, - "i64_load32_u": { - value: 53, - mnemonic: "i64.load32_u", - immediate: "MemoryImmediate", + "i32_popcnt": { + value: 105, + mnemonic: "i32.popcnt", stackBehavior: "PopPush", popOperands: ["Int32"], - pushOperands: ["Int64"] - }, - "i32_store": { - value: 54, - mnemonic: "i32.store", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Int32"] - }, - "i64_store": { - value: 55, - mnemonic: "i64.store", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Int64"] - }, - "f32_store": { - value: 56, - mnemonic: "f32.store", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Float32"] - }, - "f64_store": { - value: 57, - mnemonic: "f64.store", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Float64"] - }, - "i32_store8": { - value: 58, - mnemonic: "i32.store8", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Int32"] - }, - "i32_store16": { - value: 59, - mnemonic: "i32.store16", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Int32"] - }, - "i64_store8": { - value: 60, - mnemonic: "i64.store8", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Int64"] - }, - "i64_store16": { - value: 61, - mnemonic: "i64.store16", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Int64"] - }, - "i64_store32": { - value: 62, - mnemonic: "i64.store32", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Int64"] - }, - "mem_size": { - value: 63, - mnemonic: "memory.size", - immediate: "VarUInt1", - stackBehavior: "Push", pushOperands: ["Int32"] }, - "mem_grow": { - value: 64, - mnemonic: "memory.grow", - immediate: "VarUInt1", + "i32_add": { + value: 106, + mnemonic: "i32.add", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i32_const": { - value: 65, - mnemonic: "i32.const", - immediate: "VarInt32", - stackBehavior: "Push", + "i32_sub": { + value: 107, + mnemonic: "i32.sub", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i64_const": { - value: 66, - mnemonic: "i64.const", - immediate: "VarInt64", - stackBehavior: "Push", - pushOperands: ["Int64"] - }, - "f32_const": { - value: 67, - mnemonic: "f32.const", - immediate: "Float32", - stackBehavior: "Push", - pushOperands: ["Float32"] + "i32_mul": { + value: 108, + mnemonic: "i32.mul", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] }, - "f64_const": { - value: 68, - mnemonic: "f64.const", - immediate: "Float64", - stackBehavior: "Push", - pushOperands: ["Float64"] + "i32_div_s": { + value: 109, + mnemonic: "i32.div_s", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"] }, - "i32_eqz": { - value: 69, - mnemonic: "i32.eqz", + "i32_div_u": { + value: 110, + mnemonic: "i32.div_u", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i32_eq": { - value: 70, - mnemonic: "i32.eq", + "i32_rem_s": { + value: 111, + mnemonic: "i32.rem_s", stackBehavior: "PopPush", popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i32_ne": { - value: 71, - mnemonic: "i32.ne", + "i32_rem_u": { + value: 112, + mnemonic: "i32.rem_u", stackBehavior: "PopPush", popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i32_lt_s": { - value: 72, - mnemonic: "i32.lt_s", + "i32_and": { + value: 113, + mnemonic: "i32.and", stackBehavior: "PopPush", popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i32_lt_u": { - value: 73, - mnemonic: "i32.lt_u", + "i32_or": { + value: 114, + mnemonic: "i32.or", stackBehavior: "PopPush", popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i32_gt_s": { - value: 74, - mnemonic: "i32.gt_s", + "i32_xor": { + value: 115, + mnemonic: "i32.xor", stackBehavior: "PopPush", popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i32_gt_u": { - value: 75, - mnemonic: "i32.gt_u", + "i32_shl": { + value: 116, + mnemonic: "i32.shl", stackBehavior: "PopPush", popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i32_le_s": { - value: 76, - mnemonic: "i32.le_s", + "i32_shr_s": { + value: 117, + mnemonic: "i32.shr_s", stackBehavior: "PopPush", popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i32_le_u": { - value: 77, - mnemonic: "i32.le_u", + "i32_shr_u": { + value: 118, + mnemonic: "i32.shr_u", stackBehavior: "PopPush", popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i32_ge_s": { - value: 78, - mnemonic: "i32.ge_s", + "i32_rotl": { + value: 119, + mnemonic: "i32.rotl", stackBehavior: "PopPush", popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i32_ge_u": { - value: 79, - mnemonic: "i32.ge_u", + "i32_rotr": { + value: 120, + mnemonic: "i32.rotr", stackBehavior: "PopPush", popOperands: ["Int32", "Int32"], pushOperands: ["Int32"] }, - "i64_eqz": { - value: 80, - mnemonic: "i64.eqz", + "i64_clz": { + value: 121, + mnemonic: "i64.clz", stackBehavior: "PopPush", popOperands: ["Int64"], - pushOperands: ["Int32"] + pushOperands: ["Int64"] }, - "i64_eq": { - value: 81, - mnemonic: "i64.eq", + "i64_ctz": { + value: 122, + mnemonic: "i64.ctz", + stackBehavior: "PopPush", + popOperands: ["Int64"], + pushOperands: ["Int64"] + }, + "i64_popcnt": { + value: 123, + mnemonic: "i64.popcnt", + stackBehavior: "PopPush", + popOperands: ["Int64"], + pushOperands: ["Int64"] + }, + "i64_add": { + value: 124, + mnemonic: "i64.add", stackBehavior: "PopPush", popOperands: ["Int64", "Int64"], - pushOperands: ["Int32"] + pushOperands: ["Int64"] }, - "i64_ne": { - value: 82, - mnemonic: "i64.ne", + "i64_sub": { + value: 125, + mnemonic: "i64.sub", stackBehavior: "PopPush", popOperands: ["Int64", "Int64"], - pushOperands: ["Int32"] + pushOperands: ["Int64"] }, - "i64_lt_s": { - value: 83, - mnemonic: "i64.lt_s", + "i64_mul": { + value: 126, + mnemonic: "i64.mul", stackBehavior: "PopPush", popOperands: ["Int64", "Int64"], - pushOperands: ["Int32"] + pushOperands: ["Int64"] }, - "i64_lt_u": { - value: 84, - mnemonic: "i64.lt_u", + "i64_div_s": { + value: 127, + mnemonic: "i64.div_s", stackBehavior: "PopPush", popOperands: ["Int64", "Int64"], - pushOperands: ["Int32"] + pushOperands: ["Int64"] }, - "i64_gt_s": { - value: 85, - mnemonic: "i64.gt_s", + "i64_div_u": { + value: 128, + mnemonic: "i64.div_u", stackBehavior: "PopPush", popOperands: ["Int64", "Int64"], - pushOperands: ["Int32"] + pushOperands: ["Int64"] }, - "i64_gt_u": { - value: 86, - mnemonic: "i64.gt_u", + "i64_rem_s": { + value: 129, + mnemonic: "i64.rem_s", stackBehavior: "PopPush", popOperands: ["Int64", "Int64"], - pushOperands: ["Int32"] + pushOperands: ["Int64"] }, - "i64_le_s": { - value: 87, - mnemonic: "i64.le_s", + "i64_rem_u": { + value: 130, + mnemonic: "i64.rem_u", stackBehavior: "PopPush", popOperands: ["Int64", "Int64"], - pushOperands: ["Int32"] + pushOperands: ["Int64"] }, - "i64_le_u": { - value: 88, - mnemonic: "i64.le_u", + "i64_and": { + value: 131, + mnemonic: "i64.and", stackBehavior: "PopPush", popOperands: ["Int64", "Int64"], - pushOperands: ["Int32"] + pushOperands: ["Int64"] }, - "i64_ge_s": { - value: 89, - mnemonic: "i64.ge_s", + "i64_or": { + value: 132, + mnemonic: "i64.or", stackBehavior: "PopPush", popOperands: ["Int64", "Int64"], - pushOperands: ["Int32"] + pushOperands: ["Int64"] }, - "i64_ge_u": { - value: 90, - mnemonic: "i64.ge_u", + "i64_xor": { + value: 133, + mnemonic: "i64.xor", stackBehavior: "PopPush", popOperands: ["Int64", "Int64"], - pushOperands: ["Int32"] + pushOperands: ["Int64"] }, - "f32_eq": { - value: 91, - mnemonic: "f32.eq", + "i64_shl": { + value: 134, + mnemonic: "i64.shl", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Int32"] + popOperands: ["Int64", "Int64"], + pushOperands: ["Int64"] }, - "f32_ne": { - value: 92, - mnemonic: "f32.ne", + "i64_shr_s": { + value: 135, + mnemonic: "i64.shr_s", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Int32"] + popOperands: ["Int64", "Int64"], + pushOperands: ["Int64"] }, - "f32_lt": { - value: 93, - mnemonic: "f32.lt", + "i64_shr_u": { + value: 136, + mnemonic: "i64.shr_u", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Int32"] + popOperands: ["Int64", "Int64"], + pushOperands: ["Int64"] }, - "f32_gt": { - value: 94, - mnemonic: "f32.gt", + "i64_rotl": { + value: 137, + mnemonic: "i64.rotl", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Int32"] + popOperands: ["Int64", "Int64"], + pushOperands: ["Int64"] }, - "f32_le": { - value: 95, - mnemonic: "f32.le", + "i64_rotr": { + value: 138, + mnemonic: "i64.rotr", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Int32"] + popOperands: ["Int64", "Int64"], + pushOperands: ["Int64"] }, - "f32_ge": { - value: 96, - mnemonic: "f32.ge", + "f32_abs": { + value: 139, + mnemonic: "f32.abs", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Int32"] + popOperands: ["Float32"], + pushOperands: ["Float32"] }, - "f64_eq": { - value: 97, - mnemonic: "f64.eq", + "f32_neg": { + value: 140, + mnemonic: "f32.neg", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Int32"] + popOperands: ["Float32"], + pushOperands: ["Float32"] }, - "f64_ne": { - value: 98, - mnemonic: "f64.ne", + "f32_ceil": { + value: 141, + mnemonic: "f32.ceil", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Int32"] + popOperands: ["Float32"], + pushOperands: ["Float32"] }, - "f64_lt": { - value: 99, - mnemonic: "f64.lt", + "f32_floor": { + value: 142, + mnemonic: "f32.floor", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Int32"] + popOperands: ["Float32"], + pushOperands: ["Float32"] }, - "f64_gt": { - value: 100, - mnemonic: "f64.gt", + "f32_trunc": { + value: 143, + mnemonic: "f32.trunc", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Int32"] + popOperands: ["Float32"], + pushOperands: ["Float32"] }, - "f64_le": { - value: 101, - mnemonic: "f64.le", + "f32_nearest": { + value: 144, + mnemonic: "f32.nearest", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Int32"] + popOperands: ["Float32"], + pushOperands: ["Float32"] + }, + "f32_sqrt": { + value: 145, + mnemonic: "f32.sqrt", + stackBehavior: "PopPush", + popOperands: ["Float32"], + pushOperands: ["Float32"] + }, + "f32_add": { + value: 146, + mnemonic: "f32.add", + stackBehavior: "PopPush", + popOperands: ["Float32", "Float32"], + pushOperands: ["Float32"] }, - "f64_ge": { - value: 102, - mnemonic: "f64.ge", + "f32_sub": { + value: 147, + mnemonic: "f32.sub", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Int32"] + popOperands: ["Float32", "Float32"], + pushOperands: ["Float32"] }, - "i32_clz": { - value: 103, - mnemonic: "i32.clz", + "f32_mul": { + value: 148, + mnemonic: "f32.mul", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Int32"] + popOperands: ["Float32", "Float32"], + pushOperands: ["Float32"] }, - "i32_ctz": { - value: 104, - mnemonic: "i32.ctz", + "f32_div": { + value: 149, + mnemonic: "f32.div", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Int32"] + popOperands: ["Float32", "Float32"], + pushOperands: ["Float32"] }, - "i32_popcnt": { - value: 105, - mnemonic: "i32.popcnt", + "f32_min": { + value: 150, + mnemonic: "f32.min", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Int32"] + popOperands: ["Float32", "Float32"], + pushOperands: ["Float32"] }, - "i32_add": { - value: 106, - mnemonic: "i32.add", + "f32_max": { + value: 151, + mnemonic: "f32.max", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float32", "Float32"], + pushOperands: ["Float32"] }, - "i32_sub": { - value: 107, - mnemonic: "i32.sub", + "f32_copysign": { + value: 152, + mnemonic: "f32.copysign", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float32", "Float32"], + pushOperands: ["Float32"] }, - "i32_mul": { - value: 108, - mnemonic: "i32.mul", + "f64_abs": { + value: 153, + mnemonic: "f64.abs", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64"], + pushOperands: ["Float64"] }, - "i32_div_s": { - value: 109, - mnemonic: "i32.div_s", + "f64_neg": { + value: 154, + mnemonic: "f64.neg", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64"], + pushOperands: ["Float64"] }, - "i32_div_u": { - value: 110, - mnemonic: "i32.div_u", + "f64_ceil": { + value: 155, + mnemonic: "f64.ceil", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64"], + pushOperands: ["Float64"] }, - "i32_rem_s": { - value: 111, - mnemonic: "i32.rem_s", + "f64_floor": { + value: 156, + mnemonic: "f64.floor", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64"], + pushOperands: ["Float64"] }, - "i32_rem_u": { - value: 112, - mnemonic: "i32.rem_u", + "f64_trunc": { + value: 157, + mnemonic: "f64.trunc", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64"], + pushOperands: ["Float64"] }, - "i32_and": { - value: 113, - mnemonic: "i32.and", + "f64_nearest": { + value: 158, + mnemonic: "f64.nearest", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64"], + pushOperands: ["Float64"] }, - "i32_or": { - value: 114, - mnemonic: "i32.or", + "f64_sqrt": { + value: 159, + mnemonic: "f64.sqrt", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64"], + pushOperands: ["Float64"] }, - "i32_xor": { - value: 115, - mnemonic: "i32.xor", + "f64_add": { + value: 160, + mnemonic: "f64.add", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64", "Float64"], + pushOperands: ["Float64"] }, - "i32_shl": { - value: 116, - mnemonic: "i32.shl", + "f64_sub": { + value: 161, + mnemonic: "f64.sub", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64", "Float64"], + pushOperands: ["Float64"] }, - "i32_shr_s": { - value: 117, - mnemonic: "i32.shr_s", + "f64_mul": { + value: 162, + mnemonic: "f64.mul", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64", "Float64"], + pushOperands: ["Float64"] }, - "i32_shr_u": { - value: 118, - mnemonic: "i32.shr_u", + "f64_div": { + value: 163, + mnemonic: "f64.div", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64", "Float64"], + pushOperands: ["Float64"] }, - "i32_rotl": { - value: 119, - mnemonic: "i32.rotl", + "f64_min": { + value: 164, + mnemonic: "f64.min", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64", "Float64"], + pushOperands: ["Float64"] }, - "i32_rotr": { - value: 120, - mnemonic: "i32.rotr", + "f64_max": { + value: 165, + mnemonic: "f64.max", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"] + popOperands: ["Float64", "Float64"], + pushOperands: ["Float64"] }, - "i64_clz": { - value: 121, - mnemonic: "i64.clz", + "f64_copysign": { + value: 166, + mnemonic: "f64.copysign", stackBehavior: "PopPush", - popOperands: ["Int64"], - pushOperands: ["Int64"] + popOperands: ["Float64", "Float64"], + pushOperands: ["Float64"] }, - "i64_ctz": { - value: 122, - mnemonic: "i64.ctz", + "i32_wrap_i64": { + value: 167, + mnemonic: "i32.wrap_i64", stackBehavior: "PopPush", popOperands: ["Int64"], - pushOperands: ["Int64"] + pushOperands: ["Int32"] }, - "i64_popcnt": { - value: 123, - mnemonic: "i64.popcnt", + "i32_trunc_f32_s": { + value: 168, + mnemonic: "i32.trunc_f32_s", stackBehavior: "PopPush", - popOperands: ["Int64"], - pushOperands: ["Int64"] + popOperands: ["Float32"], + pushOperands: ["Int32"] }, - "i64_add": { - value: 124, - mnemonic: "i64.add", + "i32_trunc_f32_u": { + value: 169, + mnemonic: "i32.trunc_f32_u", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], - pushOperands: ["Int64"] + popOperands: ["Float32"], + pushOperands: ["Int32"] }, - "i64_sub": { - value: 125, - mnemonic: "i64.sub", + "i32_trunc_f64_s": { + value: 170, + mnemonic: "i32.trunc_f64_s", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], - pushOperands: ["Int64"] + popOperands: ["Float64"], + pushOperands: ["Int32"] }, - "i64_mul": { - value: 126, - mnemonic: "i64.mul", + "i32_trunc_f64_u": { + value: 171, + mnemonic: "i32.trunc_f64_u", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], - pushOperands: ["Int64"] + popOperands: ["Float64"], + pushOperands: ["Int32"] }, - "i64_div_s": { - value: 127, - mnemonic: "i64.div_s", + "i64_extend_i32_s": { + value: 172, + mnemonic: "i64.extend_i32_s", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], + popOperands: ["Int32"], pushOperands: ["Int64"] }, - "i64_div_u": { - value: 128, - mnemonic: "i64.div_u", + "i64_extend_i32_u": { + value: 173, + mnemonic: "i64.extend_i32_u", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], + popOperands: ["Int32"], pushOperands: ["Int64"] }, - "i64_rem_s": { - value: 129, - mnemonic: "i64.rem_s", + "i64_trunc_f32_s": { + value: 174, + mnemonic: "i64.trunc_f32_s", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], + popOperands: ["Float32"], pushOperands: ["Int64"] }, - "i64_rem_u": { - value: 130, - mnemonic: "i64.rem_u", + "i64_trunc_f32_u": { + value: 175, + mnemonic: "i64.trunc_f32_u", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], + popOperands: ["Float32"], pushOperands: ["Int64"] }, - "i64_and": { - value: 131, - mnemonic: "i64.and", + "i64_trunc_f64_s": { + value: 176, + mnemonic: "i64.trunc_f64_s", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], + popOperands: ["Float64"], pushOperands: ["Int64"] }, - "i64_or": { - value: 132, - mnemonic: "i64.or", + "i64_trunc_f64_u": { + value: 177, + mnemonic: "i64.trunc_f64_u", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], + popOperands: ["Float64"], pushOperands: ["Int64"] }, - "i64_xor": { - value: 133, - mnemonic: "i64.xor", + "f32_convert_i32_s": { + value: 178, + mnemonic: "f32.convert_i32_s", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], - pushOperands: ["Int64"] + popOperands: ["Int32"], + pushOperands: ["Float32"] }, - "i64_shl": { - value: 134, - mnemonic: "i64.shl", + "f32_convert_i32_u": { + value: 179, + mnemonic: "f32.convert_i32_u", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], - pushOperands: ["Int64"] + popOperands: ["Int32"], + pushOperands: ["Float32"] }, - "i64_shr_s": { - value: 135, - mnemonic: "i64.shr_s", + "f32_convert_i64_s": { + value: 180, + mnemonic: "f32.convert_i64_s", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], - pushOperands: ["Int64"] + popOperands: ["Int64"], + pushOperands: ["Float32"] }, - "i64_shr_u": { - value: 136, - mnemonic: "i64.shr_u", + "f32_convert_i64_u": { + value: 181, + mnemonic: "f32.convert_i64_u", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], - pushOperands: ["Int64"] + popOperands: ["Int64"], + pushOperands: ["Float32"] }, - "i64_rotl": { - value: 137, - mnemonic: "i64.rotl", + "f32_demote_f64": { + value: 182, + mnemonic: "f32.demote_f64", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], - pushOperands: ["Int64"] + popOperands: ["Float64"], + pushOperands: ["Float32"] }, - "i64_rotr": { - value: 138, - mnemonic: "i64.rotr", + "f64_convert_i32_s": { + value: 183, + mnemonic: "f64.convert_i32_s", stackBehavior: "PopPush", - popOperands: ["Int64", "Int64"], - pushOperands: ["Int64"] + popOperands: ["Int32"], + pushOperands: ["Float64"] }, - "f32_abs": { - value: 139, - mnemonic: "f32.abs", + "f64_convert_i32_u": { + value: 184, + mnemonic: "f64.convert_i32_u", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Float32"] + popOperands: ["Int32"], + pushOperands: ["Float64"] }, - "f32_neg": { - value: 140, - mnemonic: "f32.neg", + "f64_convert_i64_s": { + value: 185, + mnemonic: "f64.convert_i64_s", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Float32"] + popOperands: ["Int64"], + pushOperands: ["Float64"] }, - "f32_ceil": { - value: 141, - mnemonic: "f32.ceil", + "f64_convert_i64_u": { + value: 186, + mnemonic: "f64.convert_i64_u", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Float32"] + popOperands: ["Int64"], + pushOperands: ["Float64"] }, - "f32_floor": { - value: 142, - mnemonic: "f32.floor", + "f64_promote_f32": { + value: 187, + mnemonic: "f64.promote_f32", stackBehavior: "PopPush", popOperands: ["Float32"], - pushOperands: ["Float32"] + pushOperands: ["Float64"] }, - "f32_trunc": { - value: 143, - mnemonic: "f32.trunc", + "i32_reinterpret_f32": { + value: 188, + mnemonic: "i32.reinterpret_f32", stackBehavior: "PopPush", popOperands: ["Float32"], - pushOperands: ["Float32"] + pushOperands: ["Int32"] }, - "f32_nearest": { - value: 144, - mnemonic: "f32.nearest", + "i64_reinterpret_f64": { + value: 189, + mnemonic: "i64.reinterpret_f64", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Float32"] + popOperands: ["Float64"], + pushOperands: ["Int64"] }, - "f32_sqrt": { - value: 145, - mnemonic: "f32.sqrt", + "f32_reinterpret_i32": { + value: 190, + mnemonic: "f32.reinterpret_i32", stackBehavior: "PopPush", - popOperands: ["Float32"], + popOperands: ["Int32"], pushOperands: ["Float32"] }, - "f32_add": { - value: 146, - mnemonic: "f32.add", + "f64_reinterpret_i64": { + value: 191, + mnemonic: "f64.reinterpret_i64", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Float32"] + popOperands: ["Int64"], + pushOperands: ["Float64"] }, - "f32_sub": { - value: 147, - mnemonic: "f32.sub", + "i32_extend8_s": { + value: 192, + mnemonic: "i32.extend8_s", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Float32"] + popOperands: ["Int32"], + pushOperands: ["Int32"], + feature: "sign-extend" }, - "f32_mul": { - value: 148, - mnemonic: "f32.mul", + "i32_extend16_s": { + value: 193, + mnemonic: "i32.extend16_s", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Float32"] + popOperands: ["Int32"], + pushOperands: ["Int32"], + feature: "sign-extend" }, - "f32_div": { - value: 149, - mnemonic: "f32.div", + "i64_extend8_s": { + value: 194, + mnemonic: "i64.extend8_s", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Float32"] + popOperands: ["Int64"], + pushOperands: ["Int64"], + feature: "sign-extend" }, - "f32_min": { - value: 150, - mnemonic: "f32.min", + "i64_extend16_s": { + value: 195, + mnemonic: "i64.extend16_s", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Float32"] + popOperands: ["Int64"], + pushOperands: ["Int64"], + feature: "sign-extend" }, - "f32_max": { - value: 151, - mnemonic: "f32.max", + "i64_extend32_s": { + value: 196, + mnemonic: "i64.extend32_s", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Float32"] + popOperands: ["Int64"], + pushOperands: ["Int64"], + feature: "sign-extend" }, - "f32_copysign": { - value: 152, - mnemonic: "f32.copysign", + "i32_trunc_sat_f32_s": { + value: 0, + mnemonic: "i32.trunc_sat_f32_s", stackBehavior: "PopPush", - popOperands: ["Float32", "Float32"], - pushOperands: ["Float32"] + popOperands: ["Float32"], + pushOperands: ["Int32"], + prefix: 252, + feature: "sat-trunc" }, - "f64_abs": { - value: 153, - mnemonic: "f64.abs", + "i32_trunc_sat_f32_u": { + value: 1, + mnemonic: "i32.trunc_sat_f32_u", + stackBehavior: "PopPush", + popOperands: ["Float32"], + pushOperands: ["Int32"], + prefix: 252, + feature: "sat-trunc" + }, + "i32_trunc_sat_f64_s": { + value: 2, + mnemonic: "i32.trunc_sat_f64_s", stackBehavior: "PopPush", popOperands: ["Float64"], - pushOperands: ["Float64"] + pushOperands: ["Int32"], + prefix: 252, + feature: "sat-trunc" }, - "f64_neg": { - value: 154, - mnemonic: "f64.neg", + "i32_trunc_sat_f64_u": { + value: 3, + mnemonic: "i32.trunc_sat_f64_u", stackBehavior: "PopPush", popOperands: ["Float64"], - pushOperands: ["Float64"] + pushOperands: ["Int32"], + prefix: 252, + feature: "sat-trunc" }, - "f64_ceil": { - value: 155, - mnemonic: "f64.ceil", + "i64_trunc_sat_f32_s": { + value: 4, + mnemonic: "i64.trunc_sat_f32_s", stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Float64"] + popOperands: ["Float32"], + pushOperands: ["Int64"], + prefix: 252, + feature: "sat-trunc" }, - "f64_floor": { - value: 156, - mnemonic: "f64.floor", + "i64_trunc_sat_f32_u": { + value: 5, + mnemonic: "i64.trunc_sat_f32_u", stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Float64"] + popOperands: ["Float32"], + pushOperands: ["Int64"], + prefix: 252, + feature: "sat-trunc" }, - "f64_trunc": { - value: 157, - mnemonic: "f64.trunc", + "i64_trunc_sat_f64_s": { + value: 6, + mnemonic: "i64.trunc_sat_f64_s", stackBehavior: "PopPush", popOperands: ["Float64"], - pushOperands: ["Float64"] + pushOperands: ["Int64"], + prefix: 252, + feature: "sat-trunc" }, - "f64_nearest": { - value: 158, - mnemonic: "f64.nearest", + "i64_trunc_sat_f64_u": { + value: 7, + mnemonic: "i64.trunc_sat_f64_u", stackBehavior: "PopPush", popOperands: ["Float64"], - pushOperands: ["Float64"] + pushOperands: ["Int64"], + prefix: 252, + feature: "sat-trunc" }, - "f64_sqrt": { - value: 159, - mnemonic: "f64.sqrt", - stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Float64"] + "memory_init": { + value: 8, + mnemonic: "memory.init", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32", "Int32"], + prefix: 252, + feature: "bulk-memory" }, - "f64_add": { - value: 160, - mnemonic: "f64.add", - stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Float64"] + "data_drop": { + value: 9, + mnemonic: "data.drop", + immediate: "VarUInt32", + stackBehavior: "None", + prefix: 252, + feature: "bulk-memory" }, - "f64_sub": { - value: 161, - mnemonic: "f64.sub", + "memory_copy": { + value: 10, + mnemonic: "memory.copy", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32", "Int32"], + prefix: 252, + feature: "bulk-memory" + }, + "memory_fill": { + value: 11, + mnemonic: "memory.fill", + immediate: "VarUInt1", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32", "Int32"], + prefix: 252, + feature: "bulk-memory" + }, + "table_init": { + value: 12, + mnemonic: "table.init", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32", "Int32"], + prefix: 252, + feature: "bulk-memory" + }, + "elem_drop": { + value: 13, + mnemonic: "elem.drop", + immediate: "VarUInt32", + stackBehavior: "None", + prefix: 252, + feature: "bulk-memory" + }, + "table_copy": { + value: 14, + mnemonic: "table.copy", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32", "Int32"], + prefix: 252, + feature: "bulk-memory" + }, + "table_grow": { + value: 15, + mnemonic: "table.grow", + immediate: "VarUInt32", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Float64"] + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 252, + feature: "reference-types" }, - "f64_mul": { - value: 162, - mnemonic: "f64.mul", + "table_size": { + value: 16, + mnemonic: "table.size", + immediate: "VarUInt32", + stackBehavior: "Push", + pushOperands: ["Int32"], + prefix: 252, + feature: "reference-types" + }, + "table_fill": { + value: 17, + mnemonic: "table.fill", + immediate: "VarUInt32", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32", "Int32"], + prefix: 252, + feature: "reference-types" + }, + "ref_null": { + value: 208, + mnemonic: "ref.null", + immediate: "VarUInt32", + stackBehavior: "Push", + pushOperands: ["Int32"], + feature: "reference-types" + }, + "ref_is_null": { + value: 209, + mnemonic: "ref.is_null", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Float64"] + popOperands: ["Int32"], + pushOperands: ["Int32"], + feature: "reference-types" }, - "f64_div": { - value: 163, - mnemonic: "f64.div", + "ref_func": { + value: 210, + mnemonic: "ref.func", + immediate: "Function", + stackBehavior: "Push", + pushOperands: ["Int32"], + feature: "reference-types" + }, + "table_get": { + value: 37, + mnemonic: "table.get", + immediate: "VarUInt32", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Float64"] + popOperands: ["Int32"], + pushOperands: ["Int32"], + feature: "reference-types" }, - "f64_min": { - value: 164, - mnemonic: "f64.min", + "table_set": { + value: 38, + mnemonic: "table.set", + immediate: "VarUInt32", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32"], + feature: "reference-types" + }, + "v128_load": { + value: 0, + mnemonic: "v128.load", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Float64"] + popOperands: ["Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "f64_max": { - value: 165, - mnemonic: "f64.max", + "v128_load8x8_s": { + value: 1, + mnemonic: "v128.load8x8_s", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Float64"] + popOperands: ["Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "f64_copysign": { - value: 166, - mnemonic: "f64.copysign", + "v128_load8x8_u": { + value: 2, + mnemonic: "v128.load8x8_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["Float64", "Float64"], - pushOperands: ["Float64"] + popOperands: ["Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i32_wrap_i64": { - value: 167, - mnemonic: "i32.wrap_i64", + "v128_load16x4_s": { + value: 3, + mnemonic: "v128.load16x4_s", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["Int64"], - pushOperands: ["Int32"] + popOperands: ["Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i32_trunc_f32_s": { - value: 168, - mnemonic: "i32.trunc_f32_s", + "v128_load16x4_u": { + value: 4, + mnemonic: "v128.load16x4_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Int32"] + popOperands: ["Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i32_trunc_f32_u": { - value: 169, - mnemonic: "i32.trunc_f32_u", + "v128_load32x2_s": { + value: 5, + mnemonic: "v128.load32x2_s", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Int32"] + popOperands: ["Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i32_trunc_f64_s": { - value: 170, - mnemonic: "i32.trunc_f64_s", + "v128_load32x2_u": { + value: 6, + mnemonic: "v128.load32x2_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Int32"] + popOperands: ["Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i32_trunc_f64_u": { - value: 171, - mnemonic: "i32.trunc_f64_u", + "v128_load8_splat": { + value: 7, + mnemonic: "v128.load8_splat", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Int32"] + popOperands: ["Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_extend_i32_s": { - value: 172, - mnemonic: "i64.extend_i32_s", + "v128_load16_splat": { + value: 8, + mnemonic: "v128.load16_splat", + immediate: "MemoryImmediate", stackBehavior: "PopPush", popOperands: ["Int32"], - pushOperands: ["Int64"] + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_extend_i32_u": { - value: 173, - mnemonic: "i64.extend_i32_u", + "v128_load32_splat": { + value: 9, + mnemonic: "v128.load32_splat", + immediate: "MemoryImmediate", stackBehavior: "PopPush", popOperands: ["Int32"], - pushOperands: ["Int64"] + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_trunc_f32_s": { - value: 174, - mnemonic: "i64.trunc_f32_s", + "v128_load64_splat": { + value: 10, + mnemonic: "v128.load64_splat", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Int64"] + popOperands: ["Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_trunc_f32_u": { - value: 175, - mnemonic: "i64.trunc_f32_u", + "v128_store": { + value: 11, + mnemonic: "v128.store", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "V128"], + prefix: 253, + feature: "simd" + }, + "v128_const": { + value: 12, + mnemonic: "v128.const", + immediate: "V128Const", + stackBehavior: "Push", + pushOperands: ["V128"], + prefix: 253, + feature: "simd" + }, + "i8x16_shuffle": { + value: 13, + mnemonic: "i8x16.shuffle", + immediate: "ShuffleMask", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Int64"] + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_trunc_f64_s": { - value: 176, - mnemonic: "i64.trunc_f64_s", + "i8x16_swizzle": { + value: 14, + mnemonic: "i8x16.swizzle", stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Int64"] + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_trunc_f64_u": { - value: 177, - mnemonic: "i64.trunc_f64_u", + "i8x16_splat": { + value: 15, + mnemonic: "i8x16.splat", stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Int64"] + popOperands: ["Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "f32_convert_i32_s": { - value: 178, - mnemonic: "f32.convert_i32_s", + "i16x8_splat": { + value: 16, + mnemonic: "i16x8.splat", stackBehavior: "PopPush", popOperands: ["Int32"], - pushOperands: ["Float32"] + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "f32_convert_i32_u": { - value: 179, - mnemonic: "f32.convert_i32_u", + "i32x4_splat": { + value: 17, + mnemonic: "i32x4.splat", stackBehavior: "PopPush", popOperands: ["Int32"], - pushOperands: ["Float32"] + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "f32_convert_i64_s": { - value: 180, - mnemonic: "f32.convert_i64_s", + "i64x2_splat": { + value: 18, + mnemonic: "i64x2.splat", stackBehavior: "PopPush", popOperands: ["Int64"], - pushOperands: ["Float32"] + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "f32_convert_i64_u": { - value: 181, - mnemonic: "f32.convert_i64_u", + "f32x4_splat": { + value: 19, + mnemonic: "f32x4.splat", stackBehavior: "PopPush", - popOperands: ["Int64"], - pushOperands: ["Float32"] + popOperands: ["Float32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "f32_demote_f64": { - value: 182, - mnemonic: "f32.demote_f64", + "f64x2_splat": { + value: 20, + mnemonic: "f64x2.splat", stackBehavior: "PopPush", popOperands: ["Float64"], - pushOperands: ["Float32"] + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "f64_convert_i32_s": { - value: 183, - mnemonic: "f64.convert_i32_s", + "i8x16_extract_lane_s": { + value: 21, + mnemonic: "i8x16.extract_lane_s", + immediate: "LaneIndex", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Float64"] + popOperands: ["V128"], + pushOperands: ["Int32"], + prefix: 253, + feature: "simd" }, - "f64_convert_i32_u": { - value: 184, - mnemonic: "f64.convert_i32_u", + "i8x16_extract_lane_u": { + value: 22, + mnemonic: "i8x16.extract_lane_u", + immediate: "LaneIndex", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Float64"] + popOperands: ["V128"], + pushOperands: ["Int32"], + prefix: 253, + feature: "simd" }, - "f64_convert_i64_s": { - value: 185, - mnemonic: "f64.convert_i64_s", + "i8x16_replace_lane": { + value: 23, + mnemonic: "i8x16.replace_lane", + immediate: "LaneIndex", + stackBehavior: "PopPush", + popOperands: ["V128", "Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" + }, + "i16x8_extract_lane_s": { + value: 24, + mnemonic: "i16x8.extract_lane_s", + immediate: "LaneIndex", + stackBehavior: "PopPush", + popOperands: ["V128"], + pushOperands: ["Int32"], + prefix: 253, + feature: "simd" + }, + "i16x8_extract_lane_u": { + value: 25, + mnemonic: "i16x8.extract_lane_u", + immediate: "LaneIndex", + stackBehavior: "PopPush", + popOperands: ["V128"], + pushOperands: ["Int32"], + prefix: 253, + feature: "simd" + }, + "i16x8_replace_lane": { + value: 26, + mnemonic: "i16x8.replace_lane", + immediate: "LaneIndex", stackBehavior: "PopPush", - popOperands: ["Int64"], - pushOperands: ["Float64"] + popOperands: ["V128", "Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "f64_convert_i64_u": { - value: 186, - mnemonic: "f64.convert_i64_u", + "i32x4_extract_lane": { + value: 27, + mnemonic: "i32x4.extract_lane", + immediate: "LaneIndex", stackBehavior: "PopPush", - popOperands: ["Int64"], - pushOperands: ["Float64"] + popOperands: ["V128"], + pushOperands: ["Int32"], + prefix: 253, + feature: "simd" }, - "f64_promote_f32": { - value: 187, - mnemonic: "f64.promote_f32", + "i32x4_replace_lane": { + value: 28, + mnemonic: "i32x4.replace_lane", + immediate: "LaneIndex", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Float64"] + popOperands: ["V128", "Int32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i32_reinterpret_f32": { - value: 188, - mnemonic: "i32.reinterpret_f32", + "i64x2_extract_lane": { + value: 29, + mnemonic: "i64x2.extract_lane", + immediate: "LaneIndex", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Int32"] + popOperands: ["V128"], + pushOperands: ["Int64"], + prefix: 253, + feature: "simd" }, - "i64_reinterpret_f64": { - value: 189, - mnemonic: "i64.reinterpret_f64", + "i64x2_replace_lane": { + value: 30, + mnemonic: "i64x2.replace_lane", + immediate: "LaneIndex", stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Int64"] + popOperands: ["V128", "Int64"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "f32_reinterpret_i32": { - value: 190, - mnemonic: "f32.reinterpret_i32", + "f32x4_extract_lane": { + value: 31, + mnemonic: "f32x4.extract_lane", + immediate: "LaneIndex", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Float32"] + popOperands: ["V128"], + pushOperands: ["Float32"], + prefix: 253, + feature: "simd" }, - "f64_reinterpret_i64": { - value: 191, - mnemonic: "f64.reinterpret_i64", + "f32x4_replace_lane": { + value: 32, + mnemonic: "f32x4.replace_lane", + immediate: "LaneIndex", stackBehavior: "PopPush", - popOperands: ["Int64"], - pushOperands: ["Float64"] + popOperands: ["V128", "Float32"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i32_extend8_s": { - value: 192, - mnemonic: "i32.extend8_s", + "f64x2_extract_lane": { + value: 33, + mnemonic: "f64x2.extract_lane", + immediate: "LaneIndex", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Int32"], - feature: "sign-extend" + popOperands: ["V128"], + pushOperands: ["Float64"], + prefix: 253, + feature: "simd" }, - "i32_extend16_s": { - value: 193, - mnemonic: "i32.extend16_s", + "f64x2_replace_lane": { + value: 34, + mnemonic: "f64x2.replace_lane", + immediate: "LaneIndex", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Int32"], - feature: "sign-extend" + popOperands: ["V128", "Float64"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_extend8_s": { - value: 194, - mnemonic: "i64.extend8_s", + "i8x16_eq": { + value: 35, + mnemonic: "i8x16.eq", stackBehavior: "PopPush", - popOperands: ["Int64"], - pushOperands: ["Int64"], - feature: "sign-extend" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_extend16_s": { - value: 195, - mnemonic: "i64.extend16_s", + "i8x16_ne": { + value: 36, + mnemonic: "i8x16.ne", stackBehavior: "PopPush", - popOperands: ["Int64"], - pushOperands: ["Int64"], - feature: "sign-extend" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_extend32_s": { - value: 196, - mnemonic: "i64.extend32_s", + "i8x16_lt_s": { + value: 37, + mnemonic: "i8x16.lt_s", stackBehavior: "PopPush", - popOperands: ["Int64"], - pushOperands: ["Int64"], - feature: "sign-extend" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i32_trunc_sat_f32_s": { - value: 0, - mnemonic: "i32.trunc_sat_f32_s", + "i8x16_lt_u": { + value: 38, + mnemonic: "i8x16.lt_u", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Int32"], - prefix: 252, - feature: "sat-trunc" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i32_trunc_sat_f32_u": { - value: 1, - mnemonic: "i32.trunc_sat_f32_u", + "i8x16_gt_s": { + value: 39, + mnemonic: "i8x16.gt_s", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Int32"], - prefix: 252, - feature: "sat-trunc" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i32_trunc_sat_f64_s": { - value: 2, - mnemonic: "i32.trunc_sat_f64_s", + "i8x16_gt_u": { + value: 40, + mnemonic: "i8x16.gt_u", stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Int32"], - prefix: 252, - feature: "sat-trunc" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i32_trunc_sat_f64_u": { - value: 3, - mnemonic: "i32.trunc_sat_f64_u", + "i8x16_le_s": { + value: 41, + mnemonic: "i8x16.le_s", stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Int32"], - prefix: 252, - feature: "sat-trunc" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_trunc_sat_f32_s": { - value: 4, - mnemonic: "i64.trunc_sat_f32_s", + "i8x16_le_u": { + value: 42, + mnemonic: "i8x16.le_u", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Int64"], - prefix: 252, - feature: "sat-trunc" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_trunc_sat_f32_u": { - value: 5, - mnemonic: "i64.trunc_sat_f32_u", + "i8x16_ge_s": { + value: 43, + mnemonic: "i8x16.ge_s", stackBehavior: "PopPush", - popOperands: ["Float32"], - pushOperands: ["Int64"], - prefix: 252, - feature: "sat-trunc" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_trunc_sat_f64_s": { - value: 6, - mnemonic: "i64.trunc_sat_f64_s", + "i8x16_ge_u": { + value: 44, + mnemonic: "i8x16.ge_u", stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Int64"], - prefix: 252, - feature: "sat-trunc" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" + }, + "i16x8_eq": { + value: 45, + mnemonic: "i16x8.eq", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "i64_trunc_sat_f64_u": { - value: 7, - mnemonic: "i64.trunc_sat_f64_u", + "i16x8_ne": { + value: 46, + mnemonic: "i16x8.ne", stackBehavior: "PopPush", - popOperands: ["Float64"], - pushOperands: ["Int64"], - prefix: 252, - feature: "sat-trunc" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "memory_init": { - value: 8, - mnemonic: "memory.init", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Int32", "Int32"], - prefix: 252, - feature: "bulk-memory" + "i16x8_lt_s": { + value: 47, + mnemonic: "i16x8.lt_s", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "data_drop": { - value: 9, - mnemonic: "data.drop", - immediate: "VarUInt32", - stackBehavior: "None", - prefix: 252, - feature: "bulk-memory" + "i16x8_lt_u": { + value: 48, + mnemonic: "i16x8.lt_u", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "memory_copy": { - value: 10, - mnemonic: "memory.copy", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Int32", "Int32"], - prefix: 252, - feature: "bulk-memory" + "i16x8_gt_s": { + value: 49, + mnemonic: "i16x8.gt_s", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "memory_fill": { - value: 11, - mnemonic: "memory.fill", - immediate: "VarUInt1", - stackBehavior: "Pop", - popOperands: ["Int32", "Int32", "Int32"], - prefix: 252, - feature: "bulk-memory" + "i16x8_gt_u": { + value: 50, + mnemonic: "i16x8.gt_u", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "table_init": { - value: 12, - mnemonic: "table.init", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Int32", "Int32"], - prefix: 252, - feature: "bulk-memory" + "i16x8_le_s": { + value: 51, + mnemonic: "i16x8.le_s", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "elem_drop": { - value: 13, - mnemonic: "elem.drop", - immediate: "VarUInt32", - stackBehavior: "None", - prefix: 252, - feature: "bulk-memory" + "i16x8_le_u": { + value: 52, + mnemonic: "i16x8.le_u", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "table_copy": { - value: 14, - mnemonic: "table.copy", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "Int32", "Int32"], - prefix: 252, - feature: "bulk-memory" + "i16x8_ge_s": { + value: 53, + mnemonic: "i16x8.ge_s", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "table_grow": { - value: 15, - mnemonic: "table.grow", - immediate: "VarUInt32", + "i16x8_ge_u": { + value: 54, + mnemonic: "i16x8.ge_u", stackBehavior: "PopPush", - popOperands: ["Int32", "Int32"], - pushOperands: ["Int32"], - prefix: 252, - feature: "reference-types" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "table_size": { - value: 16, - mnemonic: "table.size", - immediate: "VarUInt32", - stackBehavior: "Push", - pushOperands: ["Int32"], - prefix: 252, - feature: "reference-types" + "i32x4_eq": { + value: 55, + mnemonic: "i32x4.eq", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "table_fill": { - value: 17, - mnemonic: "table.fill", - immediate: "VarUInt32", - stackBehavior: "Pop", - popOperands: ["Int32", "Int32", "Int32"], - prefix: 252, - feature: "reference-types" + "i32x4_ne": { + value: 56, + mnemonic: "i32x4.ne", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "ref_null": { - value: 208, - mnemonic: "ref.null", - immediate: "VarUInt32", - stackBehavior: "Push", - pushOperands: ["Int32"], - feature: "reference-types" + "i32x4_lt_s": { + value: 57, + mnemonic: "i32x4.lt_s", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "ref_is_null": { - value: 209, - mnemonic: "ref.is_null", + "i32x4_lt_u": { + value: 58, + mnemonic: "i32x4.lt_u", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Int32"], - feature: "reference-types" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "ref_func": { - value: 210, - mnemonic: "ref.func", - immediate: "Function", - stackBehavior: "Push", - pushOperands: ["Int32"], - feature: "reference-types" + "i32x4_gt_s": { + value: 59, + mnemonic: "i32x4.gt_s", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "table_get": { - value: 37, - mnemonic: "table.get", - immediate: "VarUInt32", + "i32x4_gt_u": { + value: 60, + mnemonic: "i32x4.gt_u", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["Int32"], - feature: "reference-types" + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "table_set": { - value: 38, - mnemonic: "table.set", - immediate: "VarUInt32", - stackBehavior: "Pop", - popOperands: ["Int32", "Int32"], - feature: "reference-types" + "i32x4_le_s": { + value: 61, + mnemonic: "i32x4.le_s", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" }, - "v128_load": { - value: 0, - mnemonic: "v128.load", - immediate: "MemoryImmediate", + "i32x4_le_u": { + value: 62, + mnemonic: "i32x4.le_u", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load8x8_s": { - value: 1, - mnemonic: "v128.load8x8_s", - immediate: "MemoryImmediate", + "i32x4_ge_s": { + value: 63, + mnemonic: "i32x4.ge_s", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load8x8_u": { - value: 2, - mnemonic: "v128.load8x8_u", - immediate: "MemoryImmediate", + "i32x4_ge_u": { + value: 64, + mnemonic: "i32x4.ge_u", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load16x4_s": { - value: 3, - mnemonic: "v128.load16x4_s", - immediate: "MemoryImmediate", + "f32x4_eq": { + value: 65, + mnemonic: "f32x4.eq", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load16x4_u": { - value: 4, - mnemonic: "v128.load16x4_u", - immediate: "MemoryImmediate", + "f32x4_ne": { + value: 66, + mnemonic: "f32x4.ne", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load32x2_s": { - value: 5, - mnemonic: "v128.load32x2_s", - immediate: "MemoryImmediate", + "f32x4_lt": { + value: 67, + mnemonic: "f32x4.lt", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load32x2_u": { - value: 6, - mnemonic: "v128.load32x2_u", - immediate: "MemoryImmediate", + "f32x4_gt": { + value: 68, + mnemonic: "f32x4.gt", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load8_splat": { - value: 7, - mnemonic: "v128.load8_splat", - immediate: "MemoryImmediate", + "f32x4_le": { + value: 69, + mnemonic: "f32x4.le", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load16_splat": { - value: 8, - mnemonic: "v128.load16_splat", - immediate: "MemoryImmediate", + "f32x4_ge": { + value: 70, + mnemonic: "f32x4.ge", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load32_splat": { - value: 9, - mnemonic: "v128.load32_splat", - immediate: "MemoryImmediate", + "f64x2_eq": { + value: 71, + mnemonic: "f64x2.eq", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load64_splat": { - value: 10, - mnemonic: "v128.load64_splat", - immediate: "MemoryImmediate", + "f64x2_ne": { + value: 72, + mnemonic: "f64x2.ne", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_store": { - value: 11, - mnemonic: "v128.store", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "V128"], + "f64x2_lt": { + value: 73, + mnemonic: "f64x2.lt", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_const": { - value: 12, - mnemonic: "v128.const", - immediate: "V128Const", - stackBehavior: "Push", + "f64x2_gt": { + value: 74, + mnemonic: "f64x2.gt", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_shuffle": { - value: 13, - mnemonic: "i8x16.shuffle", - immediate: "ShuffleMask", + "f64x2_le": { + value: 75, + mnemonic: "f64x2.le", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_swizzle": { - value: 14, - mnemonic: "i8x16.swizzle", + "f64x2_ge": { + value: 76, + mnemonic: "f64x2.ge", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_splat": { - value: 15, - mnemonic: "i8x16.splat", + "v128_not": { + value: 77, + mnemonic: "v128.not", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_splat": { - value: 16, - mnemonic: "i16x8.splat", + "v128_and": { + value: 78, + mnemonic: "v128.and", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_splat": { - value: 17, - mnemonic: "i32x4.splat", + "v128_andnot": { + value: 79, + mnemonic: "v128.andnot", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i64x2_splat": { - value: 18, - mnemonic: "i64x2.splat", + "v128_or": { + value: 80, + mnemonic: "v128.or", stackBehavior: "PopPush", - popOperands: ["Int64"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f32x4_splat": { - value: 19, - mnemonic: "f32x4.splat", + "v128_xor": { + value: 81, + mnemonic: "v128.xor", stackBehavior: "PopPush", - popOperands: ["Float32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_splat": { - value: 20, - mnemonic: "f64x2.splat", + "v128_bitselect": { + value: 82, + mnemonic: "v128.bitselect", stackBehavior: "PopPush", - popOperands: ["Float64"], + popOperands: ["V128", "V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_extract_lane_s": { - value: 21, - mnemonic: "i8x16.extract_lane_s", - immediate: "LaneIndex", + "v128_any_true": { + value: 83, + mnemonic: "v128.any_true", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["Int32"], prefix: 253, feature: "simd" }, - "i8x16_extract_lane_u": { - value: 22, - mnemonic: "i8x16.extract_lane_u", - immediate: "LaneIndex", + "v128_load8_lane": { + value: 84, + mnemonic: "v128.load8_lane", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["Int32"], + popOperands: ["Int32", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" + }, + "v128_load16_lane": { + value: 85, + mnemonic: "v128.load16_lane", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" + }, + "v128_load32_lane": { + value: 86, + mnemonic: "v128.load32_lane", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" + }, + "v128_load64_lane": { + value: 87, + mnemonic: "v128.load64_lane", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "V128"], + pushOperands: ["V128"], + prefix: 253, + feature: "simd" + }, + "v128_store8_lane": { + value: 88, + mnemonic: "v128.store8_lane", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "V128"], + prefix: 253, + feature: "simd" + }, + "v128_store16_lane": { + value: 89, + mnemonic: "v128.store16_lane", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "V128"], + prefix: 253, + feature: "simd" + }, + "v128_store32_lane": { + value: 90, + mnemonic: "v128.store32_lane", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "V128"], + prefix: 253, + feature: "simd" + }, + "v128_store64_lane": { + value: 91, + mnemonic: "v128.store64_lane", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "V128"], prefix: 253, feature: "simd" }, - "i8x16_replace_lane": { - value: 23, - mnemonic: "i8x16.replace_lane", - immediate: "LaneIndex", + "v128_load32_zero": { + value: 92, + mnemonic: "v128.load32_zero", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], + popOperands: ["Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extract_lane_s": { - value: 24, - mnemonic: "i16x8.extract_lane_s", - immediate: "LaneIndex", + "v128_load64_zero": { + value: 93, + mnemonic: "v128.load64_zero", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["Int32"], + popOperands: ["Int32"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extract_lane_u": { - value: 25, - mnemonic: "i16x8.extract_lane_u", - immediate: "LaneIndex", + "i32x4_trunc_sat_f32x4_s": { + value: 94, + mnemonic: "i32x4.trunc_sat_f32x4_s", stackBehavior: "PopPush", popOperands: ["V128"], - pushOperands: ["Int32"], - prefix: 253, - feature: "simd" - }, - "i16x8_replace_lane": { - value: 26, - mnemonic: "i16x8.replace_lane", - immediate: "LaneIndex", - stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_extract_lane": { - value: 27, - mnemonic: "i32x4.extract_lane", - immediate: "LaneIndex", + "i32x4_trunc_sat_f32x4_u": { + value: 95, + mnemonic: "i32x4.trunc_sat_f32x4_u", stackBehavior: "PopPush", popOperands: ["V128"], - pushOperands: ["Int32"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_replace_lane": { - value: 28, - mnemonic: "i32x4.replace_lane", - immediate: "LaneIndex", + "i8x16_abs": { + value: 96, + mnemonic: "i8x16.abs", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i64x2_extract_lane": { - value: 29, - mnemonic: "i64x2.extract_lane", - immediate: "LaneIndex", + "i8x16_neg": { + value: 97, + mnemonic: "i8x16.neg", stackBehavior: "PopPush", popOperands: ["V128"], - pushOperands: ["Int64"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i64x2_replace_lane": { - value: 30, - mnemonic: "i64x2.replace_lane", - immediate: "LaneIndex", + "i8x16_popcnt": { + value: 98, + mnemonic: "i8x16.popcnt", stackBehavior: "PopPush", - popOperands: ["V128", "Int64"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f32x4_extract_lane": { - value: 31, - mnemonic: "f32x4.extract_lane", - immediate: "LaneIndex", + "i8x16_all_true": { + value: 99, + mnemonic: "i8x16.all_true", stackBehavior: "PopPush", popOperands: ["V128"], - pushOperands: ["Float32"], + pushOperands: ["Int32"], prefix: 253, feature: "simd" }, - "f32x4_replace_lane": { - value: 32, - mnemonic: "f32x4.replace_lane", - immediate: "LaneIndex", + "i8x16_bitmask": { + value: 100, + mnemonic: "i8x16.bitmask", stackBehavior: "PopPush", - popOperands: ["V128", "Float32"], - pushOperands: ["V128"], + popOperands: ["V128"], + pushOperands: ["Int32"], prefix: 253, feature: "simd" }, - "f64x2_extract_lane": { - value: 33, - mnemonic: "f64x2.extract_lane", - immediate: "LaneIndex", + "i8x16_narrow_i16x8_s": { + value: 101, + mnemonic: "i8x16.narrow_i16x8_s", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["Float64"], + popOperands: ["V128", "V128"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_replace_lane": { - value: 34, - mnemonic: "f64x2.replace_lane", - immediate: "LaneIndex", + "i8x16_narrow_i16x8_u": { + value: 102, + mnemonic: "i8x16.narrow_i16x8_u", stackBehavior: "PopPush", - popOperands: ["V128", "Float64"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_eq": { - value: 35, - mnemonic: "i8x16.eq", + "f32x4_ceil": { + value: 103, + mnemonic: "f32x4.ceil", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_ne": { - value: 36, - mnemonic: "i8x16.ne", + "f32x4_floor": { + value: 104, + mnemonic: "f32x4.floor", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_lt_s": { - value: 37, - mnemonic: "i8x16.lt_s", + "f32x4_trunc": { + value: 105, + mnemonic: "f32x4.trunc", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_lt_u": { - value: 38, - mnemonic: "i8x16.lt_u", + "f32x4_nearest": { + value: 106, + mnemonic: "f32x4.nearest", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_gt_s": { - value: 39, - mnemonic: "i8x16.gt_s", + "i8x16_shl": { + value: 107, + mnemonic: "i8x16.shl", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_gt_u": { - value: 40, - mnemonic: "i8x16.gt_u", + "i8x16_shr_s": { + value: 108, + mnemonic: "i8x16.shr_s", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_le_s": { - value: 41, - mnemonic: "i8x16.le_s", + "i8x16_shr_u": { + value: 109, + mnemonic: "i8x16.shr_u", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_le_u": { - value: 42, - mnemonic: "i8x16.le_u", + "i8x16_add": { + value: 110, + mnemonic: "i8x16.add", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_ge_s": { - value: 43, - mnemonic: "i8x16.ge_s", + "i8x16_add_sat_s": { + value: 111, + mnemonic: "i8x16.add_sat_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_ge_u": { - value: 44, - mnemonic: "i8x16.ge_u", + "i8x16_add_sat_u": { + value: 112, + mnemonic: "i8x16.add_sat_u", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_eq": { - value: 45, - mnemonic: "i16x8.eq", + "i8x16_sub": { + value: 113, + mnemonic: "i8x16.sub", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_ne": { - value: 46, - mnemonic: "i16x8.ne", + "i8x16_sub_sat_s": { + value: 114, + mnemonic: "i8x16.sub_sat_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_lt_s": { - value: 47, - mnemonic: "i16x8.lt_s", + "i8x16_sub_sat_u": { + value: 115, + mnemonic: "i8x16.sub_sat_u", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_lt_u": { - value: 48, - mnemonic: "i16x8.lt_u", + "f64x2_ceil": { + value: 116, + mnemonic: "f64x2.ceil", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_gt_s": { - value: 49, - mnemonic: "i16x8.gt_s", + "f64x2_floor": { + value: 117, + mnemonic: "f64x2.floor", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_gt_u": { - value: 50, - mnemonic: "i16x8.gt_u", + "i8x16_min_s": { + value: 118, + mnemonic: "i8x16.min_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_le_s": { - value: 51, - mnemonic: "i16x8.le_s", + "i8x16_min_u": { + value: 119, + mnemonic: "i8x16.min_u", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_le_u": { - value: 52, - mnemonic: "i16x8.le_u", + "i8x16_max_s": { + value: 120, + mnemonic: "i8x16.max_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_ge_s": { - value: 53, - mnemonic: "i16x8.ge_s", + "i8x16_max_u": { + value: 121, + mnemonic: "i8x16.max_u", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_ge_u": { - value: 54, - mnemonic: "i16x8.ge_u", + "f64x2_trunc": { + value: 122, + mnemonic: "f64x2.trunc", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_eq": { - value: 55, - mnemonic: "i32x4.eq", + "i8x16_avgr_u": { + value: 123, + mnemonic: "i8x16.avgr_u", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_ne": { - value: 56, - mnemonic: "i32x4.ne", + "i16x8_extadd_pairwise_i8x16_s": { + value: 124, + mnemonic: "i16x8.extadd_pairwise_i8x16_s", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_lt_s": { - value: 57, - mnemonic: "i32x4.lt_s", + "i16x8_extadd_pairwise_i8x16_u": { + value: 125, + mnemonic: "i16x8.extadd_pairwise_i8x16_u", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_lt_u": { - value: 58, - mnemonic: "i32x4.lt_u", + "i32x4_extadd_pairwise_i16x8_s": { + value: 126, + mnemonic: "i32x4.extadd_pairwise_i16x8_s", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_gt_s": { - value: 59, - mnemonic: "i32x4.gt_s", + "i32x4_extadd_pairwise_i16x8_u": { + value: 127, + mnemonic: "i32x4.extadd_pairwise_i16x8_u", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_gt_u": { - value: 60, - mnemonic: "i32x4.gt_u", + "i16x8_abs": { + value: 128, + mnemonic: "i16x8.abs", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_le_s": { - value: 61, - mnemonic: "i32x4.le_s", + "i16x8_neg": { + value: 129, + mnemonic: "i16x8.neg", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_le_u": { - value: 62, - mnemonic: "i32x4.le_u", + "i16x8_q15mulr_sat_s": { + value: 130, + mnemonic: "i16x8.q15mulr_sat_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_ge_s": { - value: 63, - mnemonic: "i32x4.ge_s", + "i16x8_all_true": { + value: 131, + mnemonic: "i16x8.all_true", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], + popOperands: ["V128"], + pushOperands: ["Int32"], prefix: 253, feature: "simd" }, - "i32x4_ge_u": { - value: 64, - mnemonic: "i32x4.ge_u", + "i16x8_bitmask": { + value: 132, + mnemonic: "i16x8.bitmask", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], + popOperands: ["V128"], + pushOperands: ["Int32"], prefix: 253, feature: "simd" }, - "f32x4_eq": { - value: 65, - mnemonic: "f32x4.eq", + "i16x8_narrow_i32x4_s": { + value: 133, + mnemonic: "i16x8.narrow_i32x4_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f32x4_ne": { - value: 66, - mnemonic: "f32x4.ne", + "i16x8_narrow_i32x4_u": { + value: 134, + mnemonic: "i16x8.narrow_i32x4_u", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f32x4_lt": { - value: 67, - mnemonic: "f32x4.lt", + "i16x8_extend_low_i8x16_s": { + value: 135, + mnemonic: "i16x8.extend_low_i8x16_s", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f32x4_gt": { - value: 68, - mnemonic: "f32x4.gt", + "i16x8_extend_high_i8x16_s": { + value: 136, + mnemonic: "i16x8.extend_high_i8x16_s", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f32x4_le": { - value: 69, - mnemonic: "f32x4.le", + "i16x8_extend_low_i8x16_u": { + value: 137, + mnemonic: "i16x8.extend_low_i8x16_u", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f32x4_ge": { - value: 70, - mnemonic: "f32x4.ge", + "i16x8_extend_high_i8x16_u": { + value: 138, + mnemonic: "i16x8.extend_high_i8x16_u", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_eq": { - value: 71, - mnemonic: "f64x2.eq", + "i16x8_shl": { + value: 139, + mnemonic: "i16x8.shl", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_ne": { - value: 72, - mnemonic: "f64x2.ne", + "i16x8_shr_s": { + value: 140, + mnemonic: "i16x8.shr_s", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_lt": { - value: 73, - mnemonic: "f64x2.lt", + "i16x8_shr_u": { + value: 141, + mnemonic: "i16x8.shr_u", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_gt": { - value: 74, - mnemonic: "f64x2.gt", + "i16x8_add": { + value: 142, + mnemonic: "i16x8.add", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_le": { - value: 75, - mnemonic: "f64x2.le", + "i16x8_add_sat_s": { + value: 143, + mnemonic: "i16x8.add_sat_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_ge": { - value: 76, - mnemonic: "f64x2.ge", + "i16x8_add_sat_u": { + value: 144, + mnemonic: "i16x8.add_sat_u", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_not": { - value: 77, - mnemonic: "v128.not", + "i16x8_sub": { + value: 145, + mnemonic: "i16x8.sub", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_and": { - value: 78, - mnemonic: "v128.and", + "i16x8_sub_sat_s": { + value: 146, + mnemonic: "i16x8.sub_sat_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_andnot": { - value: 79, - mnemonic: "v128.andnot", + "i16x8_sub_sat_u": { + value: 147, + mnemonic: "i16x8.sub_sat_u", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_or": { - value: 80, - mnemonic: "v128.or", + "f64x2_nearest": { + value: 148, + mnemonic: "f64x2.nearest", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_xor": { - value: 81, - mnemonic: "v128.xor", + "i16x8_mul": { + value: 149, + mnemonic: "i16x8.mul", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_bitselect": { - value: 82, - mnemonic: "v128.bitselect", + "i16x8_min_s": { + value: 150, + mnemonic: "i16x8.min_s", stackBehavior: "PopPush", - popOperands: ["V128", "V128", "V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_any_true": { - value: 83, - mnemonic: "v128.any_true", + "i16x8_min_u": { + value: 151, + mnemonic: "i16x8.min_u", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["Int32"], + popOperands: ["V128", "V128"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load8_lane": { - value: 84, - mnemonic: "v128.load8_lane", - immediate: "MemoryImmediate", + "i16x8_max_s": { + value: 152, + mnemonic: "i16x8.max_s", stackBehavior: "PopPush", - popOperands: ["Int32", "V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load16_lane": { - value: 85, - mnemonic: "v128.load16_lane", - immediate: "MemoryImmediate", + "i16x8_max_u": { + value: 153, + mnemonic: "i16x8.max_u", stackBehavior: "PopPush", - popOperands: ["Int32", "V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load32_lane": { - value: 86, - mnemonic: "v128.load32_lane", - immediate: "MemoryImmediate", + "i16x8_avgr_u": { + value: 155, + mnemonic: "i16x8.avgr_u", stackBehavior: "PopPush", - popOperands: ["Int32", "V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load64_lane": { - value: 87, - mnemonic: "v128.load64_lane", - immediate: "MemoryImmediate", + "i16x8_extmul_low_i8x16_s": { + value: 156, + mnemonic: "i16x8.extmul_low_i8x16_s", stackBehavior: "PopPush", - popOperands: ["Int32", "V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_store8_lane": { - value: 88, - mnemonic: "v128.store8_lane", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "V128"], + "i16x8_extmul_high_i8x16_s": { + value: 157, + mnemonic: "i16x8.extmul_high_i8x16_s", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_store16_lane": { - value: 89, - mnemonic: "v128.store16_lane", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "V128"], + "i16x8_extmul_low_i8x16_u": { + value: 158, + mnemonic: "i16x8.extmul_low_i8x16_u", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_store32_lane": { - value: 90, - mnemonic: "v128.store32_lane", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "V128"], + "i16x8_extmul_high_i8x16_u": { + value: 159, + mnemonic: "i16x8.extmul_high_i8x16_u", + stackBehavior: "PopPush", + popOperands: ["V128", "V128"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_store64_lane": { - value: 91, - mnemonic: "v128.store64_lane", - immediate: "MemoryImmediate", - stackBehavior: "Pop", - popOperands: ["Int32", "V128"], + "i32x4_abs": { + value: 160, + mnemonic: "i32x4.abs", + stackBehavior: "PopPush", + popOperands: ["V128"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load32_zero": { - value: 92, - mnemonic: "v128.load32_zero", - immediate: "MemoryImmediate", + "i32x4_neg": { + value: 161, + mnemonic: "i32x4.neg", stackBehavior: "PopPush", - popOperands: ["Int32"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "v128_load64_zero": { - value: 93, - mnemonic: "v128.load64_zero", - immediate: "MemoryImmediate", + "i32x4_all_true": { + value: 163, + mnemonic: "i32x4.all_true", stackBehavior: "PopPush", - popOperands: ["Int32"], - pushOperands: ["V128"], + popOperands: ["V128"], + pushOperands: ["Int32"], prefix: 253, feature: "simd" }, - "i32x4_trunc_sat_f32x4_s": { - value: 94, - mnemonic: "i32x4.trunc_sat_f32x4_s", + "i32x4_bitmask": { + value: 164, + mnemonic: "i32x4.bitmask", stackBehavior: "PopPush", popOperands: ["V128"], - pushOperands: ["V128"], + pushOperands: ["Int32"], prefix: 253, feature: "simd" }, - "i32x4_trunc_sat_f32x4_u": { - value: 95, - mnemonic: "i32x4.trunc_sat_f32x4_u", + "i32x4_extend_low_i16x8_s": { + value: 167, + mnemonic: "i32x4.extend_low_i16x8_s", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_abs": { - value: 96, - mnemonic: "i8x16.abs", + "i32x4_extend_high_i16x8_s": { + value: 168, + mnemonic: "i32x4.extend_high_i16x8_s", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_neg": { - value: 97, - mnemonic: "i8x16.neg", + "i32x4_extend_low_i16x8_u": { + value: 169, + mnemonic: "i32x4.extend_low_i16x8_u", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_popcnt": { - value: 98, - mnemonic: "i8x16.popcnt", + "i32x4_extend_high_i16x8_u": { + value: 170, + mnemonic: "i32x4.extend_high_i16x8_u", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_all_true": { - value: 99, - mnemonic: "i8x16.all_true", + "i32x4_shl": { + value: 171, + mnemonic: "i32x4.shl", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["Int32"], + popOperands: ["V128", "Int32"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_bitmask": { - value: 100, - mnemonic: "i8x16.bitmask", + "i32x4_shr_s": { + value: 172, + mnemonic: "i32x4.shr_s", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["Int32"], + popOperands: ["V128", "Int32"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_narrow_i16x8_s": { - value: 101, - mnemonic: "i8x16.narrow_i16x8_s", + "i32x4_shr_u": { + value: 173, + mnemonic: "i32x4.shr_u", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_narrow_i16x8_u": { - value: 102, - mnemonic: "i8x16.narrow_i16x8_u", + "i32x4_add": { + value: 174, + mnemonic: "i32x4.add", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f32x4_ceil": { - value: 103, - mnemonic: "f32x4.ceil", + "f32x4_convert_i32x4_s": { + value: 175, + mnemonic: "f32x4.convert_i32x4_s", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f32x4_floor": { - value: 104, - mnemonic: "f32x4.floor", + "f32x4_convert_i32x4_u": { + value: 176, + mnemonic: "f32x4.convert_i32x4_u", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f32x4_trunc": { - value: 105, - mnemonic: "f32x4.trunc", + "i32x4_sub": { + value: 177, + mnemonic: "i32x4.sub", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f32x4_nearest": { - value: 106, - mnemonic: "f32x4.nearest", + "i32x4_mul": { + value: 181, + mnemonic: "i32x4.mul", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_shl": { - value: 107, - mnemonic: "i8x16.shl", + "i32x4_min_s": { + value: 182, + mnemonic: "i32x4.min_s", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_shr_s": { - value: 108, - mnemonic: "i8x16.shr_s", + "i32x4_min_u": { + value: 183, + mnemonic: "i32x4.min_u", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_shr_u": { - value: 109, - mnemonic: "i8x16.shr_u", + "i32x4_max_s": { + value: 184, + mnemonic: "i32x4.max_s", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_add": { - value: 110, - mnemonic: "i8x16.add", + "i32x4_max_u": { + value: 185, + mnemonic: "i32x4.max_u", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_add_sat_s": { - value: 111, - mnemonic: "i8x16.add_sat_s", + "i32x4_dot_i16x8_s": { + value: 186, + mnemonic: "i32x4.dot_i16x8_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_add_sat_u": { - value: 112, - mnemonic: "i8x16.add_sat_u", + "i32x4_extmul_low_i16x8_s": { + value: 188, + mnemonic: "i32x4.extmul_low_i16x8_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_sub": { - value: 113, - mnemonic: "i8x16.sub", + "i32x4_extmul_high_i16x8_s": { + value: 189, + mnemonic: "i32x4.extmul_high_i16x8_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_sub_sat_s": { - value: 114, - mnemonic: "i8x16.sub_sat_s", + "i32x4_extmul_low_i16x8_u": { + value: 190, + mnemonic: "i32x4.extmul_low_i16x8_u", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_sub_sat_u": { - value: 115, - mnemonic: "i8x16.sub_sat_u", + "i32x4_extmul_high_i16x8_u": { + value: 191, + mnemonic: "i32x4.extmul_high_i16x8_u", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_ceil": { - value: 116, - mnemonic: "f64x2.ceil", + "i64x2_abs": { + value: 192, + mnemonic: "i64x2.abs", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_floor": { - value: 117, - mnemonic: "f64x2.floor", + "i64x2_neg": { + value: 193, + mnemonic: "i64x2.neg", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_min_s": { - value: 118, - mnemonic: "i8x16.min_s", + "i64x2_all_true": { + value: 195, + mnemonic: "i64x2.all_true", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], + popOperands: ["V128"], + pushOperands: ["Int32"], prefix: 253, feature: "simd" }, - "i8x16_min_u": { - value: 119, - mnemonic: "i8x16.min_u", + "i64x2_bitmask": { + value: 196, + mnemonic: "i64x2.bitmask", + stackBehavior: "PopPush", + popOperands: ["V128"], + pushOperands: ["Int32"], + prefix: 253, + feature: "simd" + }, + "i64x2_extend_low_i32x4_s": { + value: 199, + mnemonic: "i64x2.extend_low_i32x4_s", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_max_s": { - value: 120, - mnemonic: "i8x16.max_s", + "i64x2_extend_high_i32x4_s": { + value: 200, + mnemonic: "i64x2.extend_high_i32x4_s", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_max_u": { - value: 121, - mnemonic: "i8x16.max_u", + "i64x2_extend_low_i32x4_u": { + value: 201, + mnemonic: "i64x2.extend_low_i32x4_u", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_trunc": { - value: 122, - mnemonic: "f64x2.trunc", + "i64x2_extend_high_i32x4_u": { + value: 202, + mnemonic: "i64x2.extend_high_i32x4_u", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i8x16_avgr_u": { - value: 123, - mnemonic: "i8x16.avgr_u", + "i64x2_shl": { + value: 203, + mnemonic: "i64x2.shl", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extadd_pairwise_i8x16_s": { - value: 124, - mnemonic: "i16x8.extadd_pairwise_i8x16_s", + "i64x2_shr_s": { + value: 204, + mnemonic: "i64x2.shr_s", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extadd_pairwise_i8x16_u": { - value: 125, - mnemonic: "i16x8.extadd_pairwise_i8x16_u", + "i64x2_shr_u": { + value: 205, + mnemonic: "i64x2.shr_u", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "Int32"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_extadd_pairwise_i16x8_s": { - value: 126, - mnemonic: "i32x4.extadd_pairwise_i16x8_s", + "i64x2_add": { + value: 206, + mnemonic: "i64x2.add", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_extadd_pairwise_i16x8_u": { - value: 127, - mnemonic: "i32x4.extadd_pairwise_i16x8_u", + "i64x2_sub": { + value: 209, + mnemonic: "i64x2.sub", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_abs": { - value: 128, - mnemonic: "i16x8.abs", + "i64x2_mul": { + value: 213, + mnemonic: "i64x2.mul", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_neg": { - value: 129, - mnemonic: "i16x8.neg", + "i64x2_eq": { + value: 214, + mnemonic: "i64x2.eq", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_q15mulr_sat_s": { - value: 130, - mnemonic: "i16x8.q15mulr_sat_s", + "i64x2_ne": { + value: 215, + mnemonic: "i64x2.ne", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_all_true": { - value: 131, - mnemonic: "i16x8.all_true", + "i64x2_lt_s": { + value: 216, + mnemonic: "i64x2.lt_s", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["Int32"], + popOperands: ["V128", "V128"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_bitmask": { - value: 132, - mnemonic: "i16x8.bitmask", + "i64x2_gt_s": { + value: 217, + mnemonic: "i64x2.gt_s", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["Int32"], + popOperands: ["V128", "V128"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_narrow_i32x4_s": { - value: 133, - mnemonic: "i16x8.narrow_i32x4_s", + "i64x2_le_s": { + value: 218, + mnemonic: "i64x2.le_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_narrow_i32x4_u": { - value: 134, - mnemonic: "i16x8.narrow_i32x4_u", + "i64x2_ge_s": { + value: 219, + mnemonic: "i64x2.ge_s", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extend_low_i8x16_s": { - value: 135, - mnemonic: "i16x8.extend_low_i8x16_s", + "i64x2_extmul_low_i32x4_s": { + value: 220, + mnemonic: "i64x2.extmul_low_i32x4_s", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extend_high_i8x16_s": { - value: 136, - mnemonic: "i16x8.extend_high_i8x16_s", + "i64x2_extmul_high_i32x4_s": { + value: 221, + mnemonic: "i64x2.extmul_high_i32x4_s", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extend_low_i8x16_u": { - value: 137, - mnemonic: "i16x8.extend_low_i8x16_u", + "i64x2_extmul_low_i32x4_u": { + value: 222, + mnemonic: "i64x2.extmul_low_i32x4_u", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extend_high_i8x16_u": { - value: 138, - mnemonic: "i16x8.extend_high_i8x16_u", + "i64x2_extmul_high_i32x4_u": { + value: 223, + mnemonic: "i64x2.extmul_high_i32x4_u", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_shl": { - value: 139, - mnemonic: "i16x8.shl", + "f32x4_abs": { + value: 224, + mnemonic: "f32x4.abs", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_shr_s": { - value: 140, - mnemonic: "i16x8.shr_s", + "f32x4_neg": { + value: 225, + mnemonic: "f32x4.neg", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_shr_u": { - value: 141, - mnemonic: "i16x8.shr_u", + "f32x4_sqrt": { + value: 227, + mnemonic: "f32x4.sqrt", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_add": { - value: 142, - mnemonic: "i16x8.add", + "f32x4_add": { + value: 228, + mnemonic: "f32x4.add", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_add_sat_s": { - value: 143, - mnemonic: "i16x8.add_sat_s", + "f32x4_sub": { + value: 229, + mnemonic: "f32x4.sub", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_add_sat_u": { - value: 144, - mnemonic: "i16x8.add_sat_u", + "f32x4_mul": { + value: 230, + mnemonic: "f32x4.mul", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_sub": { - value: 145, - mnemonic: "i16x8.sub", + "f32x4_div": { + value: 231, + mnemonic: "f32x4.div", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_sub_sat_s": { - value: 146, - mnemonic: "i16x8.sub_sat_s", + "f32x4_min": { + value: 232, + mnemonic: "f32x4.min", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_sub_sat_u": { - value: 147, - mnemonic: "i16x8.sub_sat_u", + "f32x4_max": { + value: 233, + mnemonic: "f32x4.max", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "f64x2_nearest": { - value: 148, - mnemonic: "f64x2.nearest", + "f32x4_pmin": { + value: 234, + mnemonic: "f32x4.pmin", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_mul": { - value: 149, - mnemonic: "i16x8.mul", + "f32x4_pmax": { + value: 235, + mnemonic: "f32x4.pmax", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_min_s": { - value: 150, - mnemonic: "i16x8.min_s", + "f64x2_abs": { + value: 236, + mnemonic: "f64x2.abs", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_min_u": { - value: 151, - mnemonic: "i16x8.min_u", + "f64x2_neg": { + value: 237, + mnemonic: "f64x2.neg", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_max_s": { - value: 152, - mnemonic: "i16x8.max_s", + "f64x2_sqrt": { + value: 239, + mnemonic: "f64x2.sqrt", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_max_u": { - value: 153, - mnemonic: "i16x8.max_u", + "f64x2_add": { + value: 240, + mnemonic: "f64x2.add", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_avgr_u": { - value: 155, - mnemonic: "i16x8.avgr_u", + "f64x2_sub": { + value: 241, + mnemonic: "f64x2.sub", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extmul_low_i8x16_s": { - value: 156, - mnemonic: "i16x8.extmul_low_i8x16_s", + "f64x2_mul": { + value: 242, + mnemonic: "f64x2.mul", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extmul_high_i8x16_s": { - value: 157, - mnemonic: "i16x8.extmul_high_i8x16_s", + "f64x2_div": { + value: 243, + mnemonic: "f64x2.div", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extmul_low_i8x16_u": { - value: 158, - mnemonic: "i16x8.extmul_low_i8x16_u", + "f64x2_min": { + value: 244, + mnemonic: "f64x2.min", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i16x8_extmul_high_i8x16_u": { - value: 159, - mnemonic: "i16x8.extmul_high_i8x16_u", + "f64x2_max": { + value: 245, + mnemonic: "f64x2.max", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_abs": { - value: 160, - mnemonic: "i32x4.abs", + "f64x2_pmin": { + value: 246, + mnemonic: "f64x2.pmin", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_neg": { - value: 161, - mnemonic: "i32x4.neg", + "f64x2_pmax": { + value: 247, + mnemonic: "f64x2.pmax", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_all_true": { - value: 163, - mnemonic: "i32x4.all_true", + "i32x4_trunc_sat_f64x2_s_zero": { + value: 248, + mnemonic: "i32x4.trunc_sat_f64x2_s_zero", stackBehavior: "PopPush", popOperands: ["V128"], - pushOperands: ["Int32"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_bitmask": { - value: 164, - mnemonic: "i32x4.bitmask", + "i32x4_trunc_sat_f64x2_u_zero": { + value: 249, + mnemonic: "i32x4.trunc_sat_f64x2_u_zero", stackBehavior: "PopPush", popOperands: ["V128"], - pushOperands: ["Int32"], + pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_extend_low_i16x8_s": { - value: 167, - mnemonic: "i32x4.extend_low_i16x8_s", + "f64x2_convert_low_i32x4_s": { + value: 250, + mnemonic: "f64x2.convert_low_i32x4_s", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_extend_high_i16x8_s": { - value: 168, - mnemonic: "i32x4.extend_high_i16x8_s", + "f64x2_convert_low_i32x4_u": { + value: 251, + mnemonic: "f64x2.convert_low_i32x4_u", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_extend_low_i16x8_u": { - value: 169, - mnemonic: "i32x4.extend_low_i16x8_u", + "f32x4_demote_f64x2_zero": { + value: 252, + mnemonic: "f32x4.demote_f64x2_zero", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_extend_high_i16x8_u": { - value: 170, - mnemonic: "i32x4.extend_high_i16x8_u", + "f64x2_promote_low_f32x4": { + value: 253, + mnemonic: "f64x2.promote_low_f32x4", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, feature: "simd" }, - "i32x4_shl": { - value: 171, - mnemonic: "i32x4.shl", + "memory_atomic_notify": { + value: 0, + mnemonic: "memory.atomic.notify", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i32x4_shr_s": { - value: 172, - mnemonic: "i32x4.shr_s", + "memory_atomic_wait32": { + value: 1, + mnemonic: "memory.atomic.wait32", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32", "Int64"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i32x4_shr_u": { - value: 173, - mnemonic: "i32x4.shr_u", + "memory_atomic_wait64": { + value: 2, + mnemonic: "memory.atomic.wait64", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64", "Int64"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i32x4_add": { - value: 174, - mnemonic: "i32x4.add", + "atomic_fence": { + value: 3, + mnemonic: "atomic.fence", + immediate: "VarUInt1", + stackBehavior: "None", + prefix: 254, + feature: "threads" + }, + "i32_atomic_load": { + value: 16, + mnemonic: "i32.atomic.load", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "f32x4_convert_i32x4_s": { - value: 175, - mnemonic: "f32x4.convert_i32x4_s", + "i64_atomic_load": { + value: 17, + mnemonic: "i64.atomic.load", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "f32x4_convert_i32x4_u": { - value: 176, - mnemonic: "f32x4.convert_i32x4_u", + "i32_atomic_load8_u": { + value: 18, + mnemonic: "i32.atomic.load8_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i32x4_sub": { - value: 177, - mnemonic: "i32x4.sub", + "i32_atomic_load16_u": { + value: 19, + mnemonic: "i32.atomic.load16_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i32x4_mul": { - value: 181, - mnemonic: "i32x4.mul", + "i64_atomic_load8_u": { + value: 20, + mnemonic: "i64.atomic.load8_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i32x4_min_s": { - value: 182, - mnemonic: "i32x4.min_s", + "i64_atomic_load16_u": { + value: 21, + mnemonic: "i64.atomic.load16_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" + }, + "i64_atomic_load32_u": { + value: 22, + mnemonic: "i64.atomic.load32_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" + }, + "i32_atomic_store": { + value: 23, + mnemonic: "i32.atomic.store", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32"], + prefix: 254, + feature: "threads" + }, + "i64_atomic_store": { + value: 24, + mnemonic: "i64.atomic.store", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int64"], + prefix: 254, + feature: "threads" + }, + "i32_atomic_store8": { + value: 25, + mnemonic: "i32.atomic.store8", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32"], + prefix: 254, + feature: "threads" + }, + "i32_atomic_store16": { + value: 26, + mnemonic: "i32.atomic.store16", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int32"], + prefix: 254, + feature: "threads" + }, + "i64_atomic_store8": { + value: 27, + mnemonic: "i64.atomic.store8", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int64"], + prefix: 254, + feature: "threads" + }, + "i64_atomic_store16": { + value: 28, + mnemonic: "i64.atomic.store16", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int64"], + prefix: 254, + feature: "threads" + }, + "i64_atomic_store32": { + value: 29, + mnemonic: "i64.atomic.store32", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32", "Int64"], + prefix: 254, + feature: "threads" + }, + "i32_atomic_rmw_add": { + value: 30, + mnemonic: "i32.atomic.rmw.add", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" + }, + "i64_atomic_rmw_add": { + value: 31, + mnemonic: "i64.atomic.rmw.add", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" + }, + "i32_atomic_rmw8_add_u": { + value: 32, + mnemonic: "i32.atomic.rmw8.add_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" + }, + "i32_atomic_rmw16_add_u": { + value: 33, + mnemonic: "i32.atomic.rmw16.add_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" + }, + "i64_atomic_rmw8_add_u": { + value: 34, + mnemonic: "i64.atomic.rmw8.add_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" + }, + "i64_atomic_rmw16_add_u": { + value: 35, + mnemonic: "i64.atomic.rmw16.add_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i32x4_min_u": { - value: 183, - mnemonic: "i32x4.min_u", + "i64_atomic_rmw32_add_u": { + value: 36, + mnemonic: "i64.atomic.rmw32.add_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i32x4_max_s": { - value: 184, - mnemonic: "i32x4.max_s", + "i32_atomic_rmw_sub": { + value: 37, + mnemonic: "i32.atomic.rmw.sub", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i32x4_max_u": { - value: 185, - mnemonic: "i32x4.max_u", + "i64_atomic_rmw_sub": { + value: 38, + mnemonic: "i64.atomic.rmw.sub", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i32x4_dot_i16x8_s": { - value: 186, - mnemonic: "i32x4.dot_i16x8_s", + "i32_atomic_rmw8_sub_u": { + value: 39, + mnemonic: "i32.atomic.rmw8.sub_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i32x4_extmul_low_i16x8_s": { - value: 188, - mnemonic: "i32x4.extmul_low_i16x8_s", + "i32_atomic_rmw16_sub_u": { + value: 40, + mnemonic: "i32.atomic.rmw16.sub_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i32x4_extmul_high_i16x8_s": { - value: 189, - mnemonic: "i32x4.extmul_high_i16x8_s", + "i64_atomic_rmw8_sub_u": { + value: 41, + mnemonic: "i64.atomic.rmw8.sub_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i32x4_extmul_low_i16x8_u": { - value: 190, - mnemonic: "i32x4.extmul_low_i16x8_u", + "i64_atomic_rmw16_sub_u": { + value: 42, + mnemonic: "i64.atomic.rmw16.sub_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i32x4_extmul_high_i16x8_u": { - value: 191, - mnemonic: "i32x4.extmul_high_i16x8_u", + "i64_atomic_rmw32_sub_u": { + value: 43, + mnemonic: "i64.atomic.rmw32.sub_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_abs": { - value: 192, - mnemonic: "i64x2.abs", + "i32_atomic_rmw_and": { + value: 44, + mnemonic: "i32.atomic.rmw.and", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i64x2_neg": { - value: 193, - mnemonic: "i64x2.neg", + "i64_atomic_rmw_and": { + value: 45, + mnemonic: "i64.atomic.rmw.and", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_all_true": { - value: 195, - mnemonic: "i64x2.all_true", + "i32_atomic_rmw8_and_u": { + value: 46, + mnemonic: "i32.atomic.rmw8.and_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["Int32", "Int32"], pushOperands: ["Int32"], - prefix: 253, - feature: "simd" + prefix: 254, + feature: "threads" }, - "i64x2_bitmask": { - value: 196, - mnemonic: "i64x2.bitmask", + "i32_atomic_rmw16_and_u": { + value: 47, + mnemonic: "i32.atomic.rmw16.and_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["Int32", "Int32"], pushOperands: ["Int32"], - prefix: 253, - feature: "simd" + prefix: 254, + feature: "threads" }, - "i64x2_extend_low_i32x4_s": { - value: 199, - mnemonic: "i64x2.extend_low_i32x4_s", + "i64_atomic_rmw8_and_u": { + value: 48, + mnemonic: "i64.atomic.rmw8.and_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_extend_high_i32x4_s": { - value: 200, - mnemonic: "i64x2.extend_high_i32x4_s", + "i64_atomic_rmw16_and_u": { + value: 49, + mnemonic: "i64.atomic.rmw16.and_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_extend_low_i32x4_u": { - value: 201, - mnemonic: "i64x2.extend_low_i32x4_u", + "i64_atomic_rmw32_and_u": { + value: 50, + mnemonic: "i64.atomic.rmw32.and_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_extend_high_i32x4_u": { - value: 202, - mnemonic: "i64x2.extend_high_i32x4_u", + "i32_atomic_rmw_or": { + value: 51, + mnemonic: "i32.atomic.rmw.or", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i64x2_shl": { - value: 203, - mnemonic: "i64x2.shl", + "i64_atomic_rmw_or": { + value: 52, + mnemonic: "i64.atomic.rmw.or", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_shr_s": { - value: 204, - mnemonic: "i64x2.shr_s", + "i32_atomic_rmw8_or_u": { + value: 53, + mnemonic: "i32.atomic.rmw8.or_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i64x2_shr_u": { - value: 205, - mnemonic: "i64x2.shr_u", + "i32_atomic_rmw16_or_u": { + value: 54, + mnemonic: "i32.atomic.rmw16.or_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "Int32"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i64x2_add": { - value: 206, - mnemonic: "i64x2.add", + "i64_atomic_rmw8_or_u": { + value: 55, + mnemonic: "i64.atomic.rmw8.or_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_sub": { - value: 209, - mnemonic: "i64x2.sub", + "i64_atomic_rmw16_or_u": { + value: 56, + mnemonic: "i64.atomic.rmw16.or_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_mul": { - value: 213, - mnemonic: "i64x2.mul", + "i64_atomic_rmw32_or_u": { + value: 57, + mnemonic: "i64.atomic.rmw32.or_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_eq": { - value: 214, - mnemonic: "i64x2.eq", + "i32_atomic_rmw_xor": { + value: 58, + mnemonic: "i32.atomic.rmw.xor", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" + }, + "i64_atomic_rmw_xor": { + value: 59, + mnemonic: "i64.atomic.rmw.xor", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" + }, + "i32_atomic_rmw8_xor_u": { + value: 60, + mnemonic: "i32.atomic.rmw8.xor_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" + }, + "i32_atomic_rmw16_xor_u": { + value: 61, + mnemonic: "i32.atomic.rmw16.xor_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i64x2_ne": { - value: 215, - mnemonic: "i64x2.ne", + "i64_atomic_rmw8_xor_u": { + value: 62, + mnemonic: "i64.atomic.rmw8.xor_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_lt_s": { - value: 216, - mnemonic: "i64x2.lt_s", + "i64_atomic_rmw16_xor_u": { + value: 63, + mnemonic: "i64.atomic.rmw16.xor_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_gt_s": { - value: 217, - mnemonic: "i64x2.gt_s", + "i64_atomic_rmw32_xor_u": { + value: 64, + mnemonic: "i64.atomic.rmw32.xor_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_le_s": { - value: 218, - mnemonic: "i64x2.le_s", + "i32_atomic_rmw_xchg": { + value: 65, + mnemonic: "i32.atomic.rmw.xchg", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i64x2_ge_s": { - value: 219, - mnemonic: "i64x2.ge_s", + "i64_atomic_rmw_xchg": { + value: 66, + mnemonic: "i64.atomic.rmw.xchg", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_extmul_low_i32x4_s": { - value: 220, - mnemonic: "i64x2.extmul_low_i32x4_s", + "i32_atomic_rmw8_xchg_u": { + value: 67, + mnemonic: "i32.atomic.rmw8.xchg_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i64x2_extmul_high_i32x4_s": { - value: 221, - mnemonic: "i64x2.extmul_high_i32x4_s", + "i32_atomic_rmw16_xchg_u": { + value: 68, + mnemonic: "i32.atomic.rmw16.xchg_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "i64x2_extmul_low_i32x4_u": { - value: 222, - mnemonic: "i64x2.extmul_low_i32x4_u", + "i64_atomic_rmw8_xchg_u": { + value: 69, + mnemonic: "i64.atomic.rmw8.xchg_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "i64x2_extmul_high_i32x4_u": { - value: 223, - mnemonic: "i64x2.extmul_high_i32x4_u", + "i64_atomic_rmw16_xchg_u": { + value: 70, + mnemonic: "i64.atomic.rmw16.xchg_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "f32x4_abs": { - value: 224, - mnemonic: "f32x4.abs", + "i64_atomic_rmw32_xchg_u": { + value: 71, + mnemonic: "i64.atomic.rmw32.xchg_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "f32x4_neg": { - value: 225, - mnemonic: "f32x4.neg", + "i32_atomic_rmw_cmpxchg": { + value: 72, + mnemonic: "i32.atomic.rmw.cmpxchg", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "f32x4_sqrt": { - value: 227, - mnemonic: "f32x4.sqrt", + "i64_atomic_rmw_cmpxchg": { + value: 73, + mnemonic: "i64.atomic.rmw.cmpxchg", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "f32x4_add": { - value: 228, - mnemonic: "f32x4.add", + "i32_atomic_rmw8_cmpxchg_u": { + value: 74, + mnemonic: "i32.atomic.rmw8.cmpxchg_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "f32x4_sub": { - value: 229, - mnemonic: "f32x4.sub", + "i32_atomic_rmw16_cmpxchg_u": { + value: 75, + mnemonic: "i32.atomic.rmw16.cmpxchg_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int32", "Int32"], + pushOperands: ["Int32"], + prefix: 254, + feature: "threads" }, - "f32x4_mul": { - value: 230, - mnemonic: "f32x4.mul", + "i64_atomic_rmw8_cmpxchg_u": { + value: 76, + mnemonic: "i64.atomic.rmw8.cmpxchg_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "f32x4_div": { - value: 231, - mnemonic: "f32x4.div", + "i64_atomic_rmw16_cmpxchg_u": { + value: 77, + mnemonic: "i64.atomic.rmw16.cmpxchg_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "f32x4_min": { - value: 232, - mnemonic: "f32x4.min", + "i64_atomic_rmw32_cmpxchg_u": { + value: 78, + mnemonic: "i64.atomic.rmw32.cmpxchg_u", + immediate: "MemoryImmediate", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], - pushOperands: ["V128"], - prefix: 253, - feature: "simd" + popOperands: ["Int32", "Int64", "Int64"], + pushOperands: ["Int64"], + prefix: 254, + feature: "threads" }, - "f32x4_max": { - value: 233, - mnemonic: "f32x4.max", + "i8x16_relaxed_swizzle": { + value: 256, + mnemonic: "i8x16.relaxed_swizzle", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f32x4_pmin": { - value: 234, - mnemonic: "f32x4.pmin", + "i32x4_relaxed_trunc_f32x4_s": { + value: 257, + mnemonic: "i32x4.relaxed_trunc_f32x4_s", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f32x4_pmax": { - value: 235, - mnemonic: "f32x4.pmax", + "i32x4_relaxed_trunc_f32x4_u": { + value: 258, + mnemonic: "i32x4.relaxed_trunc_f32x4_u", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_abs": { - value: 236, - mnemonic: "f64x2.abs", + "i32x4_relaxed_trunc_f64x2_s_zero": { + value: 259, + mnemonic: "i32x4.relaxed_trunc_f64x2_s_zero", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_neg": { - value: 237, - mnemonic: "f64x2.neg", + "i32x4_relaxed_trunc_f64x2_u_zero": { + value: 260, + mnemonic: "i32x4.relaxed_trunc_f64x2_u_zero", stackBehavior: "PopPush", popOperands: ["V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_sqrt": { - value: 239, - mnemonic: "f64x2.sqrt", + "f32x4_relaxed_madd": { + value: 261, + mnemonic: "f32x4.relaxed_madd", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_add": { - value: 240, - mnemonic: "f64x2.add", + "f32x4_relaxed_nmadd": { + value: 262, + mnemonic: "f32x4.relaxed_nmadd", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_sub": { - value: 241, - mnemonic: "f64x2.sub", + "f64x2_relaxed_madd": { + value: 263, + mnemonic: "f64x2.relaxed_madd", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_mul": { - value: 242, - mnemonic: "f64x2.mul", + "f64x2_relaxed_nmadd": { + value: 264, + mnemonic: "f64x2.relaxed_nmadd", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_div": { - value: 243, - mnemonic: "f64x2.div", + "i8x16_relaxed_laneselect": { + value: 265, + mnemonic: "i8x16.relaxed_laneselect", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_min": { - value: 244, - mnemonic: "f64x2.min", + "i16x8_relaxed_laneselect": { + value: 266, + mnemonic: "i16x8.relaxed_laneselect", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_max": { - value: 245, - mnemonic: "f64x2.max", + "i32x4_relaxed_laneselect": { + value: 267, + mnemonic: "i32x4.relaxed_laneselect", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_pmin": { - value: 246, - mnemonic: "f64x2.pmin", + "i64x2_relaxed_laneselect": { + value: 268, + mnemonic: "i64x2.relaxed_laneselect", stackBehavior: "PopPush", - popOperands: ["V128", "V128"], + popOperands: ["V128", "V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_pmax": { - value: 247, - mnemonic: "f64x2.pmax", + "f32x4_relaxed_min": { + value: 269, + mnemonic: "f32x4.relaxed_min", stackBehavior: "PopPush", popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" - }, - "i32x4_trunc_sat_f64x2_s_zero": { - value: 248, - mnemonic: "i32x4.trunc_sat_f64x2_s_zero", + feature: "relaxed-simd" + }, + "f32x4_relaxed_max": { + value: 270, + mnemonic: "f32x4.relaxed_max", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "i32x4_trunc_sat_f64x2_u_zero": { - value: 249, - mnemonic: "i32x4.trunc_sat_f64x2_u_zero", + "f64x2_relaxed_min": { + value: 271, + mnemonic: "f64x2.relaxed_min", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_convert_low_i32x4_s": { - value: 250, - mnemonic: "f64x2.convert_low_i32x4_s", + "f64x2_relaxed_max": { + value: 272, + mnemonic: "f64x2.relaxed_max", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_convert_low_i32x4_u": { - value: 251, - mnemonic: "f64x2.convert_low_i32x4_u", + "i16x8_relaxed_q15mulr_s": { + value: 273, + mnemonic: "i16x8.relaxed_q15mulr_s", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f32x4_demote_f64x2_zero": { - value: 252, - mnemonic: "f32x4.demote_f64x2_zero", + "i16x8_relaxed_dot_i8x16_i7x16_s": { + value: 274, + mnemonic: "i16x8.relaxed_dot_i8x16_i7x16_s", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" }, - "f64x2_promote_low_f32x4": { - value: 253, - mnemonic: "f64x2.promote_low_f32x4", + "i32x4_relaxed_dot_i8x16_i7x16_add_s": { + value: 275, + mnemonic: "i32x4.relaxed_dot_i8x16_i7x16_add_s", stackBehavior: "PopPush", - popOperands: ["V128"], + popOperands: ["V128", "V128", "V128"], pushOperands: ["V128"], prefix: 253, - feature: "simd" + feature: "relaxed-simd" + } + }; + var OpCodes_default = OpCodes; + + // src/BinaryReader.ts + var MagicHeader2 = 1836278016; + var BinaryReader = class { + constructor(buffer) { + this.buffer = buffer; + this.offset = 0; + } + read() { + const magic = this.readUInt32(); + if (magic !== MagicHeader2) { + throw new Error(`Invalid WASM magic header: 0x${magic.toString(16)}`); + } + const version = this.readUInt32(); + if (version !== 1) { + throw new Error(`Unsupported WASM version: ${version}`); + } + const module = { + version, + types: [], + imports: [], + functions: [], + tables: [], + memories: [], + globals: [], + exports: [], + start: null, + elements: [], + data: [], + customSections: [] + }; + const functionTypeIndices = []; + while (this.offset < this.buffer.length) { + const sectionId = this.readVarUInt7(); + const sectionSize = this.readVarUInt32(); + const sectionEnd = this.offset + sectionSize; + switch (sectionId) { + case 0: + this.readCustomSection(module, sectionEnd); + break; + case 1: + this.readTypeSection(module); + break; + case 2: + this.readImportSection(module); + break; + case 3: + this.readFunctionSection(functionTypeIndices); + break; + case 4: + this.readTableSection(module); + break; + case 5: + this.readMemorySection(module); + break; + case 6: + this.readGlobalSection(module); + break; + case 7: + this.readExportSection(module); + break; + case 8: + module.start = this.readVarUInt32(); + break; + case 9: + this.readElementSection(module); + break; + case 10: + this.readCodeSection(module, functionTypeIndices); + break; + case 11: + this.readDataSection(module); + break; + default: + this.offset = sectionEnd; + break; + } + this.offset = sectionEnd; + } + return module; + } + readCustomSection(module, sectionEnd) { + const nameLen = this.readVarUInt32(); + const name = this.readString(nameLen); + if (name === "name") { + module.nameSection = this.readNameSection(sectionEnd); + return; + } + const remaining = sectionEnd - this.offset; + const data = this.readBytes(remaining); + module.customSections.push({ name, data }); + } + readNameSection(sectionEnd) { + const info = {}; + while (this.offset < sectionEnd) { + const subsectionId = this.readVarUInt7(); + const subsectionSize = this.readVarUInt32(); + const subsectionEnd = this.offset + subsectionSize; + switch (subsectionId) { + case 0: { + const len = this.readVarUInt32(); + info.moduleName = this.readString(len); + break; + } + case 1: { + const count = this.readVarUInt32(); + info.functionNames = /* @__PURE__ */ new Map(); + for (let i = 0; i < count; i++) { + const index = this.readVarUInt32(); + const len = this.readVarUInt32(); + info.functionNames.set(index, this.readString(len)); + } + break; + } + case 2: { + const funcCount = this.readVarUInt32(); + info.localNames = /* @__PURE__ */ new Map(); + for (let i = 0; i < funcCount; i++) { + const funcIndex = this.readVarUInt32(); + const localCount = this.readVarUInt32(); + const locals = /* @__PURE__ */ new Map(); + for (let j = 0; j < localCount; j++) { + const localIndex = this.readVarUInt32(); + const len = this.readVarUInt32(); + locals.set(localIndex, this.readString(len)); + } + info.localNames.set(funcIndex, locals); + } + break; + } + case 7: { + const count = this.readVarUInt32(); + info.globalNames = /* @__PURE__ */ new Map(); + for (let i = 0; i < count; i++) { + const index = this.readVarUInt32(); + const len = this.readVarUInt32(); + info.globalNames.set(index, this.readString(len)); + } + break; + } + default: + this.offset = subsectionEnd; + break; + } + this.offset = subsectionEnd; + } + return info; + } + readTypeSection(module) { + const count = this.readVarUInt32(); + for (let i = 0; i < count; i++) { + const form = this.readVarInt7(); + const paramCount = this.readVarUInt32(); + const parameterTypes = []; + for (let j = 0; j < paramCount; j++) { + parameterTypes.push(this.readValueType()); + } + const returnCount = this.readVarUInt32(); + const returnTypes = []; + for (let j = 0; j < returnCount; j++) { + returnTypes.push(this.readValueType()); + } + module.types.push({ parameterTypes, returnTypes }); + } + } + readImportSection(module) { + const count = this.readVarUInt32(); + for (let i = 0; i < count; i++) { + const moduleNameLen = this.readVarUInt32(); + const moduleName = this.readString(moduleNameLen); + const fieldNameLen = this.readVarUInt32(); + const fieldName = this.readString(fieldNameLen); + const kind = this.readUInt8(); + const imp = { moduleName, fieldName, kind }; + switch (kind) { + case 0: + imp.typeIndex = this.readVarUInt32(); + break; + case 1: { + const elementType = this.readVarInt7(); + const { initial, maximum } = this.readResizableLimits(); + imp.tableType = { elementType, initial, maximum }; + break; + } + case 2: { + const { initial, maximum } = this.readResizableLimits(); + imp.memoryType = { initial, maximum }; + break; + } + case 3: { + const valueType = this.readVarInt7(); + const mutable = this.readVarUInt1() === 1; + imp.globalType = { valueType, mutable }; + break; + } + } + module.imports.push(imp); + } + } + readFunctionSection(functionTypeIndices) { + const count = this.readVarUInt32(); + for (let i = 0; i < count; i++) { + functionTypeIndices.push(this.readVarUInt32()); + } + } + readTableSection(module) { + const count = this.readVarUInt32(); + for (let i = 0; i < count; i++) { + const elementType = this.readVarInt7(); + const { initial, maximum } = this.readResizableLimits(); + module.tables.push({ elementType, initial, maximum }); + } + } + readMemorySection(module) { + const count = this.readVarUInt32(); + for (let i = 0; i < count; i++) { + const { initial, maximum } = this.readResizableLimits(); + module.memories.push({ initial, maximum }); + } + } + readGlobalSection(module) { + const count = this.readVarUInt32(); + for (let i = 0; i < count; i++) { + const valueType = this.readVarInt7(); + const mutable = this.readVarUInt1() === 1; + const initExpr = this.readInitExpr(); + module.globals.push({ valueType, mutable, initExpr }); + } + } + readExportSection(module) { + const count = this.readVarUInt32(); + for (let i = 0; i < count; i++) { + const nameLen = this.readVarUInt32(); + const name = this.readString(nameLen); + const kind = this.readUInt8(); + const index = this.readVarUInt32(); + module.exports.push({ name, kind, index }); + } + } + readElementSection(module) { + const count = this.readVarUInt32(); + for (let i = 0; i < count; i++) { + const tableIndex = this.readVarUInt32(); + const offsetExpr = this.readInitExpr(); + const numElems = this.readVarUInt32(); + const functionIndices = []; + for (let j = 0; j < numElems; j++) { + functionIndices.push(this.readVarUInt32()); + } + module.elements.push({ tableIndex, offsetExpr, functionIndices }); + } + } + readCodeSection(module, functionTypeIndices) { + const count = this.readVarUInt32(); + for (let i = 0; i < count; i++) { + const bodySize = this.readVarUInt32(); + const bodyEnd = this.offset + bodySize; + const localCount = this.readVarUInt32(); + const locals = []; + for (let j = 0; j < localCount; j++) { + const lCount = this.readVarUInt32(); + const type = this.readVarInt7(); + locals.push({ count: lCount, type }); + } + const bodyLength = bodyEnd - this.offset; + const body = this.readBytes(bodyLength); + module.functions.push({ + typeIndex: functionTypeIndices[i], + locals, + body + }); + this.offset = bodyEnd; + } + } + readDataSection(module) { + const count = this.readVarUInt32(); + for (let i = 0; i < count; i++) { + const memoryIndex = this.readVarUInt32(); + const offsetExpr = this.readInitExpr(); + const dataSize = this.readVarUInt32(); + const data = this.readBytes(dataSize); + module.data.push({ memoryIndex, offsetExpr, data }); + } + } + readInitExpr() { + const start = this.offset; + while (this.offset < this.buffer.length) { + const byte = this.buffer[this.offset++]; + if (byte === OpCodes_default.end.value) { + break; + } + switch (byte) { + case OpCodes_default.i32_const.value: + this.readVarInt32(); + break; + case OpCodes_default.i64_const.value: + this.readVarInt64(); + break; + case OpCodes_default.f32_const.value: + this.offset += 4; + break; + case OpCodes_default.f64_const.value: + this.offset += 8; + break; + case OpCodes_default.get_global.value: + this.readVarUInt32(); + break; + } + } + return this.buffer.slice(start, this.offset); + } + readResizableLimits() { + const flags = this.readVarUInt1(); + const initial = this.readVarUInt32(); + const maximum = flags === 1 ? this.readVarUInt32() : null; + return { initial, maximum }; + } + readValueType() { + const value = this.readVarInt7(); + switch (value) { + case -1: + return ValueType.Int32; + case -2: + return ValueType.Int64; + case -3: + return ValueType.Float32; + case -4: + return ValueType.Float64; + default: + throw new Error(`Unknown value type: 0x${(value & 255).toString(16)}`); + } + } + // --- Primitive readers --- + readUInt8() { + return this.buffer[this.offset++]; + } + readUInt32() { + const value = this.buffer[this.offset] | this.buffer[this.offset + 1] << 8 | this.buffer[this.offset + 2] << 16 | this.buffer[this.offset + 3] << 24; + this.offset += 4; + return value >>> 0; + } + readVarUInt1() { + return this.buffer[this.offset++] & 1; + } + readVarUInt7() { + return this.buffer[this.offset++] & 127; + } + readVarUInt32() { + let result = 0; + let shift = 0; + let byte; + do { + byte = this.buffer[this.offset++]; + result |= (byte & 127) << shift; + shift += 7; + } while (byte & 128); + return result >>> 0; + } + readVarInt7() { + const byte = this.buffer[this.offset++]; + return byte & 64 ? byte | 4294967168 : byte & 127; + } + readVarInt32() { + let result = 0; + let shift = 0; + let byte; + do { + byte = this.buffer[this.offset++]; + result |= (byte & 127) << shift; + shift += 7; + } while (byte & 128); + if (shift < 32 && byte & 64) { + result |= -(1 << shift); + } + return result; + } + readVarInt64() { + let result = 0n; + let shift = 0n; + let byte; + do { + byte = this.buffer[this.offset++]; + result |= BigInt(byte & 127) << shift; + shift += 7n; + } while (byte & 128); + if (shift < 64n && byte & 64) { + result |= -(1n << shift); + } + return result; + } + readString(length) { + const bytes = this.buffer.slice(this.offset, this.offset + length); + this.offset += length; + return new TextDecoder().decode(bytes); + } + readBytes(length) { + const bytes = this.buffer.slice(this.offset, this.offset + length); + this.offset += length; + return bytes; + } + }; + + // src/CustomSectionBuilder.ts + var CustomSectionBuilder = class { + constructor(name, data) { + this.name = name; + this.type = SectionType.createCustom(name); + this._data = data || new Uint8Array(0); + } + write(writer) { + const sectionWriter = new BinaryWriter(); + sectionWriter.writeVarUInt32(this.name.length); + sectionWriter.writeString(this.name); + if (this._data.length > 0) { + sectionWriter.writeBytes(this._data); + } + writer.writeVarUInt7(0); + writer.writeVarUInt32(sectionWriter.length); + writer.writeBytes(sectionWriter); + } + toBytes() { + const buffer = new BinaryWriter(); + this.write(buffer); + return buffer.toArray(); + } + }; + + // src/FunctionParameterBuilder.ts + var FunctionParameterBuilder = class { + constructor(valueType, index) { + this.name = null; + this.valueType = valueType; + this.index = index; + } + withName(name) { + this.name = name; + return this; + } + }; + + // src/LocalBuilder.ts + var LocalBuilder = class { + constructor(valueType, name, index, count) { + this.index = index; + this.valueType = valueType; + this.name = name; + this.count = count; + } + write(writer) { + writer.writeVarUInt32(this.count); + writer.writeVarInt7(this.valueType.value); + } + toBytes() { + const buffer = new BinaryWriter(); + this.write(buffer); + return buffer.toArray(); + } + }; + + // src/GlobalType.ts + var GlobalType = class { + constructor(valueType, mutable) { + this._valueType = valueType; + this._mutable = mutable; + } + get valueType() { + return this._valueType; + } + get mutable() { + return this._mutable; + } + write(writer) { + writer.writeVarInt7(this._valueType.value); + writer.writeVarUInt1(this._mutable ? 1 : 0); + } + toBytes() { + const buffer = new BinaryWriter(); + this.write(buffer); + return buffer.toArray(); + } + }; + + // src/GlobalBuilder.ts + var GlobalBuilder = class _GlobalBuilder { + constructor(moduleBuilder, valueType, mutable, index) { + this._initExpressionEmitter = null; + this.name = null; + this._moduleBuilder = moduleBuilder; + this._globalType = new GlobalType(valueType, mutable); + this._index = index; + } + withName(name) { + this.name = name; + return this; + } + get globalType() { + return this._globalType; + } + get valueType() { + return this._globalType.valueType; + } + createInitEmitter(callback) { + if (this._initExpressionEmitter) { + throw new Error("Initialization expression emitter has already been created."); + } + this._initExpressionEmitter = new InitExpressionEmitter( + "Global" /* Global */, + this.valueType, + this._moduleBuilder.features + ); + if (callback) { + callback(this._initExpressionEmitter); + this._initExpressionEmitter.end(); + } + return this._initExpressionEmitter; + } + value(value) { + if (typeof value === "function") { + this.createInitEmitter(value); + } else if (value instanceof _GlobalBuilder) { + this.createInitEmitter((asm) => { + asm.get_global(value); + }); + } else if (typeof value === "number" || typeof value === "bigint") { + this.createInitEmitter((asm) => { + const vt = this.valueType; + if (vt === ValueType.Int32) { + asm.const_i32(Number(value)); + } else if (vt === ValueType.Int64) { + asm.const_i64(BigInt(value)); + } else if (vt === ValueType.Float32) { + asm.const_f32(Number(value)); + } else if (vt === ValueType.Float64) { + asm.const_f64(Number(value)); + } else { + throw new Error(`Unsupported global value type: ${vt.name}`); + } + }); + } else { + throw new Error("Unsupported global value."); + } + } + withExport(name) { + this._moduleBuilder.exportGlobal(this, name); + return this; + } + write(writer) { + if (!this._initExpressionEmitter) { + throw new Error("The initialization expression was not defined."); + } + this._globalType.write(writer); + this._initExpressionEmitter.write(writer); + } + toBytes() { + const buffer = new BinaryWriter(); + this.write(buffer); + return buffer.toArray(); + } + }; + + // src/ImportBuilder.ts + var ImportBuilder = class { + constructor(moduleName, fieldName, externalKind, data, index) { + this.moduleName = moduleName; + this.fieldName = fieldName; + this.externalKind = externalKind; + this.data = data; + this.index = index; + } + write(writer) { + writer.writeVarUInt32(this.moduleName.length); + writer.writeString(this.moduleName); + writer.writeVarUInt32(this.fieldName.length); + writer.writeString(this.fieldName); + writer.writeUInt8(this.externalKind.value); + switch (this.externalKind) { + case ExternalKind.Function: + writer.writeVarUInt32(this.data.index); + break; + case ExternalKind.Global: + case ExternalKind.Memory: + case ExternalKind.Table: + this.data.write(writer); + break; + default: + throw new Error("Unknown external kind."); + } + } + toBytes() { + const buffer = new BinaryWriter(); + this.write(buffer); + return buffer.toArray(); + } + }; + + // src/ImmediateEncoder.ts + var ImmediateEncoder = class { + static encodeBlockSignature(writer, blockType) { + writer.writeVarInt7(blockType.value); + } + static encodeRelativeDepth(writer, label, depth) { + const relativeDepth = depth - label.block.depth; + writer.writeVarInt7(relativeDepth); + } + static encodeBranchTable(writer, defaultLabel, labels) { + writer.writeVarUInt32(labels.length); + labels.forEach((x) => { + writer.writeVarUInt32(x); + }); + writer.writeVarUInt32(defaultLabel); + } + static encodeFunction(writer, func) { + let functionIndex = 0; + if (func instanceof ImportBuilder) { + functionIndex = func.index; + } else if (typeof func === "object" && func !== null && "_index" in func) { + functionIndex = func._index; + } else if (typeof func === "number") { + functionIndex = func; + } else { + throw new Error( + "Function argument must either be the index of the function or a FunctionBuilder." + ); + } + writer.writeVarUInt32(functionIndex); + } + static encodeIndirectFunction(writer, funcType) { + writer.writeVarUInt32(funcType.index); + writer.writeVarUInt1(0); + } + static encodeLocal(writer, local) { + Arg.notNull("local", local); + let localIndex = 0; + if (local instanceof LocalBuilder) { + localIndex = local.index; + } else if (local instanceof FunctionParameterBuilder) { + localIndex = local.index; + } else if (typeof local === "number") { + localIndex = local; + } else { + throw new Error( + "Local argument must either be the index of the local variable or a LocalBuilder." + ); + } + writer.writeVarUInt32(localIndex); + } + static encodeGlobal(writer, global) { + Arg.notNull("global", global); + let globalIndex = 0; + if (global instanceof GlobalBuilder) { + globalIndex = global._index; + } else if (global instanceof ImportBuilder) { + if (global.externalKind !== ExternalKind.Global) { + throw new Error("Import external kind must be global."); + } + globalIndex = global.index; + } else if (typeof global === "number") { + globalIndex = global; + } else { + throw new Error( + "Global argument must either be the index of the global variable, GlobalBuilder, or an ImportBuilder." + ); + } + writer.writeVarUInt32(globalIndex); + } + static encodeFloat32(writer, value) { + writer.writeFloat32(value); + } + static encodeFloat64(writer, value) { + writer.writeFloat64(value); + } + static encodeVarInt32(writer, value) { + writer.writeVarInt32(value); + } + static encodeVarInt64(writer, value) { + writer.writeVarInt64(value); + } + static encodeVarUInt32(writer, value) { + writer.writeVarUInt32(value); + } + static encodeVarUInt1(writer, value) { + writer.writeVarUInt1(value); + } + static encodeMemoryImmediate(writer, alignment, offset) { + writer.writeVarUInt32(alignment); + writer.writeVarUInt32(offset); + } + static encodeV128Const(writer, bytes) { + for (let i = 0; i < 16; i++) { + writer.writeByte(bytes[i]); + } + } + static encodeLaneIndex(writer, index) { + writer.writeByte(index); + } + static encodeShuffleMask(writer, mask) { + for (let i = 0; i < 16; i++) { + writer.writeByte(mask[i]); + } + } + }; + + // src/Immediate.ts + var Immediate = class _Immediate { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + constructor(type, values) { + Arg.notNull("type", type); + Arg.notNull("values", values); + this.type = type; + this.values = values; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static createBlockSignature(blockType) { + return new _Immediate("BlockSignature" /* BlockSignature */, [blockType]); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static createBranchTable(defaultLabel, labels, depth) { + const relativeDepths = labels.map((x) => { + return depth - x.block.depth; + }); + const defaultLabelDepth = depth - defaultLabel.block.depth; + return new _Immediate("BranchTable" /* BranchTable */, [defaultLabelDepth, relativeDepths]); + } + static createFloat32(value) { + return new _Immediate("Float32" /* Float32 */, [value]); + } + static createFloat64(value) { + return new _Immediate("Float64" /* Float64 */, [value]); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static createFunction(functionBuilder) { + return new _Immediate("Function" /* Function */, [functionBuilder]); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static createGlobal(globalBuilder) { + return new _Immediate("Global" /* Global */, [globalBuilder]); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static createIndirectFunction(functionTypeBuilder) { + return new _Immediate("IndirectFunction" /* IndirectFunction */, [functionTypeBuilder]); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static createLocal(local) { + return new _Immediate("Local" /* Local */, [local]); + } + static createMemoryImmediate(alignment, offset) { + return new _Immediate("MemoryImmediate" /* MemoryImmediate */, [alignment, offset]); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static createRelativeDepth(label, depth) { + return new _Immediate("RelativeDepth" /* RelativeDepth */, [label, depth]); + } + static createVarUInt1(value) { + return new _Immediate("VarUInt1" /* VarUInt1 */, [value]); + } + static createVarInt32(value) { + return new _Immediate("VarInt32" /* VarInt32 */, [value]); + } + static createVarInt64(value) { + return new _Immediate("VarInt64" /* VarInt64 */, [value]); + } + static createVarUInt32(value) { + return new _Immediate("VarUInt32" /* VarUInt32 */, [value]); + } + static createV128Const(bytes) { + if (bytes.length !== 16) { + throw new Error("V128 constant must be exactly 16 bytes."); + } + return new _Immediate("V128Const" /* V128Const */, [bytes]); + } + static createLaneIndex(index) { + return new _Immediate("LaneIndex" /* LaneIndex */, [index]); + } + static createShuffleMask(mask) { + if (mask.length !== 16) { + throw new Error("Shuffle mask must be exactly 16 bytes."); + } + return new _Immediate("ShuffleMask" /* ShuffleMask */, [mask]); + } + writeBytes(writer) { + switch (this.type) { + case "BlockSignature" /* BlockSignature */: + ImmediateEncoder.encodeBlockSignature(writer, this.values[0]); + break; + case "BranchTable" /* BranchTable */: + ImmediateEncoder.encodeBranchTable(writer, this.values[0], this.values[1]); + break; + case "Float32" /* Float32 */: + ImmediateEncoder.encodeFloat32(writer, this.values[0]); + break; + case "Float64" /* Float64 */: + ImmediateEncoder.encodeFloat64(writer, this.values[0]); + break; + case "Function" /* Function */: + ImmediateEncoder.encodeFunction(writer, this.values[0]); + break; + case "Global" /* Global */: + ImmediateEncoder.encodeGlobal(writer, this.values[0]); + break; + case "IndirectFunction" /* IndirectFunction */: + ImmediateEncoder.encodeIndirectFunction(writer, this.values[0]); + break; + case "Local" /* Local */: + ImmediateEncoder.encodeLocal(writer, this.values[0]); + break; + case "MemoryImmediate" /* MemoryImmediate */: + ImmediateEncoder.encodeMemoryImmediate(writer, this.values[0], this.values[1]); + break; + case "RelativeDepth" /* RelativeDepth */: + ImmediateEncoder.encodeRelativeDepth(writer, this.values[0], this.values[1]); + break; + case "VarInt32" /* VarInt32 */: + ImmediateEncoder.encodeVarInt32(writer, this.values[0]); + break; + case "VarInt64" /* VarInt64 */: + ImmediateEncoder.encodeVarInt64(writer, this.values[0]); + break; + case "VarUInt1" /* VarUInt1 */: + ImmediateEncoder.encodeVarUInt1(writer, this.values[0]); + break; + case "VarUInt32" /* VarUInt32 */: + ImmediateEncoder.encodeVarUInt32(writer, this.values[0]); + break; + case "V128Const" /* V128Const */: + ImmediateEncoder.encodeV128Const(writer, this.values[0]); + break; + case "LaneIndex" /* LaneIndex */: + ImmediateEncoder.encodeLaneIndex(writer, this.values[0]); + break; + case "ShuffleMask" /* ShuffleMask */: + ImmediateEncoder.encodeShuffleMask(writer, this.values[0]); + break; + default: + throw new Error("Cannot encode unknown operand type."); + } + } + toBytes() { + const buffer = new BinaryWriter(); + this.writeBytes(buffer); + return buffer.toArray(); + } + }; + + // src/Instruction.ts + var Instruction = class { + constructor(opCode, immediate) { + Arg.notNull("opCode", opCode); + this.opCode = opCode; + this.immediate = immediate; + } + write(writer) { + if (this.opCode.prefix !== void 0) { + writer.writeByte(this.opCode.prefix); + writer.writeVarUInt32(this.opCode.value); + } else { + writer.writeByte(this.opCode.value); + } + if (this.immediate) { + this.immediate.writeBytes(writer); + } + } + toBytes() { + const buffer = new BinaryWriter(); + this.write(buffer); + return buffer.toArray(); + } + }; + + // src/LabelBuilder.ts + var LabelBuilder = class { + constructor() { + this.resolved = false; + this.block = null; + } + get isResolved() { + return this.resolved; + } + resolve(block) { + this.block = block; + this.resolved = true; + } + reference(block) { + if (this.isResolved) { + throw new Error("Cannot add a reference to a label that has been resolved."); + } + this.block = block; } }; - var OpCodes_default = OpCodes; // src/OpCodeEmitter.ts var OpCodeEmitter = class { @@ -4958,6 +5860,18 @@ var webasmPlayground = (() => { else() { return this.emit(OpCodes_default.else); } + try(blockType, label) { + return this.emit(OpCodes_default.try, blockType, label); + } + catch(varUInt32) { + return this.emit(OpCodes_default.catch, varUInt32); + } + throw(varUInt32) { + return this.emit(OpCodes_default.throw, varUInt32); + } + rethrow(varUInt32) { + return this.emit(OpCodes_default.rethrow, varUInt32); + } end() { return this.emit(OpCodes_default.end); } @@ -4979,6 +5893,18 @@ var webasmPlayground = (() => { call_indirect(funcTypeBuilder) { return this.emit(OpCodes_default.call_indirect, funcTypeBuilder); } + return_call(functionBuilder) { + return this.emit(OpCodes_default.return_call, functionBuilder); + } + return_call_indirect(funcTypeBuilder) { + return this.emit(OpCodes_default.return_call_indirect, funcTypeBuilder); + } + delegate(varUInt32) { + return this.emit(OpCodes_default.delegate, varUInt32); + } + catch_all() { + return this.emit(OpCodes_default.catch_all); + } drop() { return this.emit(OpCodes_default.drop); } @@ -6248,6 +7174,267 @@ var webasmPlayground = (() => { promote_low_f32x4_f64x2() { return this.emit(OpCodes_default.f64x2_promote_low_f32x4); } + atomic_notify(alignment, offset) { + return this.emit(OpCodes_default.memory_atomic_notify, alignment, offset); + } + atomic_wait32(alignment, offset) { + return this.emit(OpCodes_default.memory_atomic_wait32, alignment, offset); + } + atomic_wait64(alignment, offset) { + return this.emit(OpCodes_default.memory_atomic_wait64, alignment, offset); + } + atomic_fence(varUInt1) { + return this.emit(OpCodes_default.atomic_fence, varUInt1); + } + atomic_load_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_load, alignment, offset); + } + atomic_load_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_load, alignment, offset); + } + atomic_load8_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_load8_u, alignment, offset); + } + atomic_load16_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_load16_u, alignment, offset); + } + atomic_load8_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_load8_u, alignment, offset); + } + atomic_load16_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_load16_u, alignment, offset); + } + atomic_load32_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_load32_u, alignment, offset); + } + atomic_store_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_store, alignment, offset); + } + atomic_store_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_store, alignment, offset); + } + atomic_store8_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_store8, alignment, offset); + } + atomic_store16_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_store16, alignment, offset); + } + atomic_store8_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_store8, alignment, offset); + } + atomic_store16_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_store16, alignment, offset); + } + atomic_store32_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_store32, alignment, offset); + } + atomic_rmw_add_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw_add, alignment, offset); + } + atomic_rmw_add_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw_add, alignment, offset); + } + atomic_rmw8_add_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw8_add_u, alignment, offset); + } + atomic_rmw16_add_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw16_add_u, alignment, offset); + } + atomic_rmw8_add_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw8_add_u, alignment, offset); + } + atomic_rmw16_add_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw16_add_u, alignment, offset); + } + atomic_rmw32_add_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw32_add_u, alignment, offset); + } + atomic_rmw_sub_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw_sub, alignment, offset); + } + atomic_rmw_sub_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw_sub, alignment, offset); + } + atomic_rmw8_sub_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw8_sub_u, alignment, offset); + } + atomic_rmw16_sub_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw16_sub_u, alignment, offset); + } + atomic_rmw8_sub_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw8_sub_u, alignment, offset); + } + atomic_rmw16_sub_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw16_sub_u, alignment, offset); + } + atomic_rmw32_sub_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw32_sub_u, alignment, offset); + } + atomic_rmw_and_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw_and, alignment, offset); + } + atomic_rmw_and_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw_and, alignment, offset); + } + atomic_rmw8_and_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw8_and_u, alignment, offset); + } + atomic_rmw16_and_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw16_and_u, alignment, offset); + } + atomic_rmw8_and_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw8_and_u, alignment, offset); + } + atomic_rmw16_and_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw16_and_u, alignment, offset); + } + atomic_rmw32_and_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw32_and_u, alignment, offset); + } + atomic_rmw_or_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw_or, alignment, offset); + } + atomic_rmw_or_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw_or, alignment, offset); + } + atomic_rmw8_or_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw8_or_u, alignment, offset); + } + atomic_rmw16_or_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw16_or_u, alignment, offset); + } + atomic_rmw8_or_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw8_or_u, alignment, offset); + } + atomic_rmw16_or_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw16_or_u, alignment, offset); + } + atomic_rmw32_or_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw32_or_u, alignment, offset); + } + atomic_rmw_xor_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw_xor, alignment, offset); + } + atomic_rmw_xor_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw_xor, alignment, offset); + } + atomic_rmw8_xor_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw8_xor_u, alignment, offset); + } + atomic_rmw16_xor_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw16_xor_u, alignment, offset); + } + atomic_rmw8_xor_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw8_xor_u, alignment, offset); + } + atomic_rmw16_xor_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw16_xor_u, alignment, offset); + } + atomic_rmw32_xor_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw32_xor_u, alignment, offset); + } + atomic_rmw_xchg_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw_xchg, alignment, offset); + } + atomic_rmw_xchg_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw_xchg, alignment, offset); + } + atomic_rmw8_xchg_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw8_xchg_u, alignment, offset); + } + atomic_rmw16_xchg_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw16_xchg_u, alignment, offset); + } + atomic_rmw8_xchg_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw8_xchg_u, alignment, offset); + } + atomic_rmw16_xchg_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw16_xchg_u, alignment, offset); + } + atomic_rmw32_xchg_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw32_xchg_u, alignment, offset); + } + atomic_rmw_cmpxchg_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw_cmpxchg, alignment, offset); + } + atomic_rmw_cmpxchg_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw_cmpxchg, alignment, offset); + } + atomic_rmw8_cmpxchg_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw8_cmpxchg_u, alignment, offset); + } + atomic_rmw16_cmpxchg_u_i32(alignment, offset) { + return this.emit(OpCodes_default.i32_atomic_rmw16_cmpxchg_u, alignment, offset); + } + atomic_rmw8_cmpxchg_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw8_cmpxchg_u, alignment, offset); + } + atomic_rmw16_cmpxchg_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw16_cmpxchg_u, alignment, offset); + } + atomic_rmw32_cmpxchg_u_i64(alignment, offset) { + return this.emit(OpCodes_default.i64_atomic_rmw32_cmpxchg_u, alignment, offset); + } + relaxed_swizzle_i8x16() { + return this.emit(OpCodes_default.i8x16_relaxed_swizzle); + } + relaxed_trunc_f32x4_s_i32x4() { + return this.emit(OpCodes_default.i32x4_relaxed_trunc_f32x4_s); + } + relaxed_trunc_f32x4_u_i32x4() { + return this.emit(OpCodes_default.i32x4_relaxed_trunc_f32x4_u); + } + relaxed_trunc_f64x2_s_zero_i32x4() { + return this.emit(OpCodes_default.i32x4_relaxed_trunc_f64x2_s_zero); + } + relaxed_trunc_f64x2_u_zero_i32x4() { + return this.emit(OpCodes_default.i32x4_relaxed_trunc_f64x2_u_zero); + } + relaxed_madd_f32x4() { + return this.emit(OpCodes_default.f32x4_relaxed_madd); + } + relaxed_nmadd_f32x4() { + return this.emit(OpCodes_default.f32x4_relaxed_nmadd); + } + relaxed_madd_f64x2() { + return this.emit(OpCodes_default.f64x2_relaxed_madd); + } + relaxed_nmadd_f64x2() { + return this.emit(OpCodes_default.f64x2_relaxed_nmadd); + } + relaxed_laneselect_i8x16() { + return this.emit(OpCodes_default.i8x16_relaxed_laneselect); + } + relaxed_laneselect_i16x8() { + return this.emit(OpCodes_default.i16x8_relaxed_laneselect); + } + relaxed_laneselect_i32x4() { + return this.emit(OpCodes_default.i32x4_relaxed_laneselect); + } + relaxed_laneselect_i64x2() { + return this.emit(OpCodes_default.i64x2_relaxed_laneselect); + } + relaxed_min_f32x4() { + return this.emit(OpCodes_default.f32x4_relaxed_min); + } + relaxed_max_f32x4() { + return this.emit(OpCodes_default.f32x4_relaxed_max); + } + relaxed_min_f64x2() { + return this.emit(OpCodes_default.f64x2_relaxed_min); + } + relaxed_max_f64x2() { + return this.emit(OpCodes_default.f64x2_relaxed_max); + } + relaxed_q15mulr_s_i16x8() { + return this.emit(OpCodes_default.i16x8_relaxed_q15mulr_s); + } + relaxed_dot_i8x16_i7x16_s_i16x8() { + return this.emit(OpCodes_default.i16x8_relaxed_dot_i8x16_i7x16_s); + } + relaxed_dot_i8x16_i7x16_add_s_i32x4() { + return this.emit(OpCodes_default.i32x4_relaxed_dot_i8x16_i7x16_add_s); + } }; // src/verification/ControlFlowBlock.ts @@ -6482,7 +7669,7 @@ var webasmPlayground = (() => { this.parameterTypes.forEach((x) => { writer.writeVarInt7(x.value); }); - writer.writeVarUInt1(this.returnTypes.length); + writer.writeVarUInt32(this.returnTypes.length); this.returnTypes.forEach((x) => { writer.writeVarInt7(x.value); }); @@ -6601,7 +7788,7 @@ var webasmPlayground = (() => { let errorMessage = ""; for (let index = 0; index < remaining.length; index++) { if (remaining[index] !== this._funcType.returnTypes[index]) { - errorMessage = `A ${this._funcType.returnTypes[index]} was expected at ${remaining.length - index} but a ${remaining[index]} was found. `; + errorMessage = `A ${this._funcType.returnTypes[index].name} was expected at ${remaining.length - index} but a ${remaining[index].name} was found. `; } } if (errorMessage !== "") { @@ -6642,28 +7829,33 @@ var webasmPlayground = (() => { return modifiedStack; } _verifyStackPop(stack, opCode, funcType) { - if (funcType) { - stack = funcType.parameterTypes.reduce((i, x) => { - if (x !== i.valueType) { - throw new VerificationError( - `Unexpected type found on stack at offset ${this._instructionCount + 1}. A ${x} was expected but a ${i.valueType} was found.` - ); - } - return i.pop(); - }, stack); - } - stack = (opCode.popOperands || []).reduce((i, x) => { + const pops = opCode.popOperands || []; + for (let idx = pops.length - 1; idx >= 0; idx--) { + const x = pops[idx]; if (x === "Any" /* Any */) { - return i.pop(); + stack = stack.pop(); + continue; } const valueType = ValueType[x]; - if (valueType !== i.valueType) { + if (valueType !== stack.valueType) { throw new VerificationError( - `Unexpected type found on stack at offset ${this._instructionCount + 1}. A ${valueType} was expected but a ${i.valueType} was found.` + `Unexpected type found on stack at offset ${this._instructionCount + 1}. A ${valueType.name} was expected but a ${stack.valueType.name} was found.` ); } - return i.pop(); - }, stack); + stack = stack.pop(); + } + if (funcType) { + const params = funcType.parameterTypes; + for (let idx = params.length - 1; idx >= 0; idx--) { + const x = params[idx]; + if (x !== stack.valueType) { + throw new VerificationError( + `Unexpected type found on stack at offset ${this._instructionCount + 1}. A ${x.name} was expected but a ${stack.valueType.name} was found.` + ); + } + stack = stack.pop(); + } + } return stack; } _stackPush(stack, controlBlock, opCode, immediate, funcType) { @@ -6687,7 +7879,7 @@ var webasmPlayground = (() => { } _getFuncType(opCode, immediate) { let funcType = null; - if (opCode === OpCodes_default.call) { + if (opCode === OpCodes_default.call || opCode === OpCodes_default.return_call) { if (immediate.values[0] instanceof ImportBuilder) { funcType = immediate.values[0].data; } else if (immediate.values[0] && "funcTypeBuilder" in immediate.values[0]) { @@ -6695,7 +7887,7 @@ var webasmPlayground = (() => { } else { throw new VerificationError("Error getting funcType for call, invalid immediate."); } - } else if (opCode === OpCodes_default.call_indirect) { + } else if (opCode === OpCodes_default.call_indirect || opCode === OpCodes_default.return_call_indirect) { if (immediate.values[0] instanceof FuncTypeBuilder) { funcType = immediate.values[0]; } else { @@ -6970,9 +8162,10 @@ var webasmPlayground = (() => { // src/InitExpressionEmitter.ts var InitExpressionEmitter = class extends AssemblyEmitter { - constructor(initExpressionType, valueType) { + constructor(initExpressionType, valueType, features) { super(new FuncTypeSignature([valueType], [])); this._initExpressionType = initExpressionType; + this._features = features || /* @__PURE__ */ new Set(); } getParameter(_index) { throw new Error("An initialization expression does not have any parameters."); @@ -6990,15 +8183,20 @@ var webasmPlayground = (() => { } } _isValidateOp(opCode, args) { - if (this._instructions.length === 2) { + const hasExtendedConst = this._features.has("extended-const"); + const maxInstructions = hasExtendedConst ? Infinity : 2; + if (this._instructions.length >= maxInstructions) { return; } - if (this._instructions.length === 1) { + if (!hasExtendedConst && this._instructions.length === 1) { if (opCode !== OpCodes_default.end) { throw new Error(`Opcode ${opCode.mnemonic} is not valid after init expression value.`); } return; } + if (opCode === OpCodes_default.end) { + return; + } switch (opCode) { case OpCodes_default.f32_const: case OpCodes_default.f64_const: @@ -7007,7 +8205,7 @@ var webasmPlayground = (() => { break; case OpCodes_default.get_global: { const globalBuilder = args?.[0]; - if (this._initExpressionType === "Element" /* Element */) { + if (this._initExpressionType === "Element" /* Element */ && !hasExtendedConst) { throw new Error( "The only valid instruction for an element initializer expression is a constant i32, global not supported." ); @@ -7015,13 +8213,27 @@ var webasmPlayground = (() => { if (!(globalBuilder instanceof GlobalBuilder)) { throw new Error("A global builder was expected."); } - if (globalBuilder.globalType.mutable) { + if (globalBuilder.globalType.mutable && !hasExtendedConst) { throw new Error( "An initializer expression cannot reference a mutable global." ); } break; } + // Extended-const: allow arithmetic in init expressions + case OpCodes_default.i32_add: + case OpCodes_default.i32_sub: + case OpCodes_default.i32_mul: + case OpCodes_default.i64_add: + case OpCodes_default.i64_sub: + case OpCodes_default.i64_mul: { + if (!hasExtendedConst) { + throw new Error( + `Opcode ${opCode.mnemonic} is not supported in an initializer expression. Enable the extended-const feature to allow arithmetic in init expressions.` + ); + } + break; + } default: throw new Error( `Opcode ${opCode.mnemonic} is not supported in an initializer expression.` @@ -7032,9 +8244,20 @@ var webasmPlayground = (() => { // src/DataSegmentBuilder.ts var DataSegmentBuilder = class { - constructor(data) { + constructor(data, features) { this._initExpressionEmitter = null; + this._passive = false; + this._memoryIndex = 0; this._data = data; + this._features = features || /* @__PURE__ */ new Set(); + } + passive() { + this._passive = true; + return this; + } + memoryIndex(index) { + this._memoryIndex = index; + return this; } createInitEmitter(callback) { if (this._initExpressionEmitter) { @@ -7042,7 +8265,8 @@ var webasmPlayground = (() => { } this._initExpressionEmitter = new InitExpressionEmitter( "Data" /* Data */, - ValueType.Int32 + ValueType.Int32, + this._features ); if (callback) { callback(this._initExpressionEmitter); @@ -7066,10 +8290,21 @@ var webasmPlayground = (() => { } } write(writer) { + if (this._passive) { + writer.writeVarUInt32(1); + writer.writeVarUInt32(this._data.length); + writer.writeBytes(this._data); + return; + } if (!this._initExpressionEmitter) { throw new Error("The initialization expression was not defined."); } - writer.writeVarUInt32(0); + if (this._memoryIndex !== 0) { + writer.writeVarUInt32(2); + writer.writeVarUInt32(this._memoryIndex); + } else { + writer.writeVarUInt32(0); + } this._initExpressionEmitter.write(writer); writer.writeVarUInt32(this._data.length); writer.writeBytes(this._data); @@ -7162,11 +8397,17 @@ var webasmPlayground = (() => { // src/ElementSegmentBuilder.ts var ElementSegmentBuilder = class { - constructor(table, functions) { + constructor(table, functions, features) { this._functions = []; this._initExpressionEmitter = null; + this._passive = false; this._table = table; this._functions = functions; + this._features = features || /* @__PURE__ */ new Set(); + } + passive() { + this._passive = true; + return this; } createInitEmitter(callback) { if (this._initExpressionEmitter) { @@ -7174,7 +8415,8 @@ var webasmPlayground = (() => { } this._initExpressionEmitter = new InitExpressionEmitter( "Element" /* Element */, - ValueType.Int32 + ValueType.Int32, + this._features ); if (callback) { callback(this._initExpressionEmitter); @@ -7197,20 +8439,38 @@ var webasmPlayground = (() => { throw new Error("Unsupported offset"); } } + _writeFuncIndex(writer, func) { + if (func instanceof FunctionBuilder) { + writer.writeVarUInt32(func._index); + } else if (func instanceof ImportBuilder) { + writer.writeVarUInt32(func.index); + } + } write(writer) { + if (this._passive) { + writer.writeVarUInt32(1); + writer.writeUInt8(0); + writer.writeVarUInt32(this._functions.length); + this._functions.forEach((x) => this._writeFuncIndex(writer, x)); + return; + } if (!this._initExpressionEmitter) { throw new Error("The initialization expression was not defined."); } - writer.writeVarUInt32(this._table._index); - this._initExpressionEmitter.write(writer); - writer.writeVarUInt32(this._functions.length); - this._functions.forEach((x) => { - if (x instanceof FunctionBuilder) { - writer.writeVarUInt32(x._index); - } else if (x instanceof ImportBuilder) { - writer.writeVarUInt32(x.index); - } - }); + const tableIndex = this._table ? this._table._index : 0; + if (tableIndex !== 0) { + writer.writeVarUInt32(2); + writer.writeVarUInt32(tableIndex); + this._initExpressionEmitter.write(writer); + writer.writeUInt8(0); + writer.writeVarUInt32(this._functions.length); + this._functions.forEach((x) => this._writeFuncIndex(writer, x)); + } else { + writer.writeVarUInt32(0); + this._initExpressionEmitter.write(writer); + writer.writeVarUInt32(this._functions.length); + this._functions.forEach((x) => this._writeFuncIndex(writer, x)); + } } toBytes() { const buffer = new BinaryWriter(); @@ -7268,12 +8528,28 @@ var webasmPlayground = (() => { // src/MemoryType.ts var MemoryType = class { - constructor(resizableLimits) { + constructor(resizableLimits, shared = false, memory64 = false) { Arg.instanceOf("resizableLimits", resizableLimits, ResizableLimits); + if (shared && resizableLimits.maximum === null) { + throw new Error("Shared memory requires a maximum size."); + } this.resizableLimits = resizableLimits; + this.shared = shared; + this.memory64 = memory64; } write(writer) { - this.resizableLimits.write(writer); + if (this.shared || this.memory64) { + let flags = this.resizableLimits.maximum !== null ? 1 : 0; + if (this.shared) flags |= 2; + if (this.memory64) flags |= 4; + writer.writeVarUInt7(flags); + writer.writeVarUInt32(this.resizableLimits.initial); + if (this.resizableLimits.maximum !== null) { + writer.writeVarUInt32(this.resizableLimits.maximum); + } + } else { + this.resizableLimits.write(writer); + } } toBytes() { const buffer = new BinaryWriter(); @@ -7284,15 +8560,21 @@ var webasmPlayground = (() => { // src/MemoryBuilder.ts var MemoryBuilder = class { - constructor(moduleBuilder, resizableLimits, index) { + constructor(moduleBuilder, resizableLimits, index, shared = false, memory64 = false) { this._moduleBuilder = moduleBuilder; - this._memoryType = new MemoryType(resizableLimits); + this._memoryType = new MemoryType(resizableLimits, shared, memory64); this._index = index; } withExport(name) { this._moduleBuilder.exportMemory(this, name); return this; } + get isShared() { + return this._memoryType.shared; + } + get isMemory64() { + return this._memoryType.memory64; + } write(writer) { this._memoryType.write(writer); } @@ -7371,6 +8653,7 @@ var webasmPlayground = (() => { this.writeTables(lines, mod); this.writeMemories(lines, mod); this.writeGlobals(lines, mod); + this.writeTags(lines, mod); this.writeExports(lines, mod); this.writeStart(lines, mod); this.writeElements(lines, mod); @@ -7557,7 +8840,9 @@ var webasmPlayground = (() => { mod._memories.forEach((mem) => { const limits = mem._memoryType.resizableLimits; const max = limits.maximum !== null ? ` ${limits.maximum}` : ""; - lines.push(` (memory (;${mem._index};) ${limits.initial}${max})`); + const shared = mem._memoryType.shared ? " shared" : ""; + const m64 = mem._memoryType.memory64 ? " i64" : ""; + lines.push(` (memory (;${mem._index};)${m64} ${limits.initial}${max}${shared})`); }); } writeGlobals(lines, mod) { @@ -7579,6 +8864,14 @@ var webasmPlayground = (() => { lines.push(` (global (;${g._index};) ${typeStr} (${initExpr}))`); }); } + writeTags(lines, mod) { + mod._tags.forEach((tag, i) => { + const params = tag._funcType.parameterTypes.map((p) => p.name).join(" "); + let sig = ""; + if (params.length > 0) sig = ` (param ${params})`; + lines.push(` (tag (;${i};) (type ${tag._funcType.index})${sig})`); + }); + } writeExports(lines, mod) { mod._exports.forEach((exp) => { let kindName = ""; @@ -7607,6 +8900,15 @@ var webasmPlayground = (() => { } writeElements(lines, mod) { mod._elements.forEach((elem, i) => { + const funcIndices = elem._functions.map((f) => { + if (f instanceof FunctionBuilder) return f._index; + if (f instanceof ImportBuilder) return f.index; + return 0; + }).join(" "); + if (elem._passive) { + lines.push(` (elem (;${i};) func ${funcIndices})`); + return; + } let offsetExpr = ""; if (elem._initExpressionEmitter) { const instrs = elem._initExpressionEmitter._instructions; @@ -7619,16 +8921,21 @@ var webasmPlayground = (() => { } } } - const funcIndices = elem._functions.map((f) => { - if (f instanceof FunctionBuilder) return f._index; - if (f instanceof ImportBuilder) return f.index; - return 0; - }).join(" "); - lines.push(` (elem (;${i};) (${offsetExpr}) func ${funcIndices})`); + const tableIndex = elem._table ? elem._table._index : 0; + if (tableIndex !== 0) { + lines.push(` (elem (;${i};) (table ${tableIndex}) (${offsetExpr}) func ${funcIndices})`); + } else { + lines.push(` (elem (;${i};) (${offsetExpr}) func ${funcIndices})`); + } }); } writeData(lines, mod) { mod._data.forEach((seg, i) => { + const dataStr = this.bytesToWatString(seg._data); + if (seg._passive) { + lines.push(` (data (;${i};) "${dataStr}")`); + return; + } let offsetExpr = ""; if (seg._initExpressionEmitter) { const instrs = seg._initExpressionEmitter._instructions; @@ -7641,8 +8948,11 @@ var webasmPlayground = (() => { } } } - const dataStr = this.bytesToWatString(seg._data); - lines.push(` (data (;${i};) (${offsetExpr}) "${dataStr}")`); + if (seg._memoryIndex !== 0) { + lines.push(` (data (;${i};) (memory ${seg._memoryIndex}) (${offsetExpr}) "${dataStr}")`); + } else { + lines.push(` (data (;${i};) (${offsetExpr}) "${dataStr}")`); + } }); } bytesToWatString(data) { @@ -7659,6 +8969,27 @@ var webasmPlayground = (() => { } }; + // src/TagBuilder.ts + var TagBuilder = class { + constructor(moduleBuilder, funcType, index) { + this._moduleBuilder = moduleBuilder; + this._funcType = funcType; + this._index = index; + } + get funcType() { + return this._funcType; + } + write(writer) { + writer.writeVarUInt32(0); + writer.writeVarUInt32(this._funcType.index); + } + toBytes() { + const buffer = new BinaryWriter(); + this.write(buffer); + return buffer.toArray(); + } + }; + // src/ModuleBuilder.ts var _ModuleBuilder = class _ModuleBuilder { constructor(name, options = { generateNameSection: true, disableVerification: false }) { @@ -7671,6 +9002,7 @@ var webasmPlayground = (() => { this._exports = []; this._elements = []; this._data = []; + this._tags = []; this._customSections = []; this._startFunction = null; this._importsIndexSpace = { @@ -7708,8 +9040,8 @@ var webasmPlayground = (() => { } else { normalizedReturnTypes = returnTypes; } - if (normalizedReturnTypes.length > 1) { - throw new Error("A method can only return zero to one values."); + if (normalizedReturnTypes.length > 1 && !this._resolvedFeatures.has("multi-value")) { + throw new Error("A method can only return zero to one values. Enable the multi-value feature to allow multiple return values."); } const funcTypeKey = FuncTypeBuilder.createKey(normalizedReturnTypes, parameters); let funcType = this._types.find((x) => x.key === funcTypeKey); @@ -7767,7 +9099,7 @@ var webasmPlayground = (() => { }); return importBuilder; } - importMemory(moduleName, name, initialSize, maximumSize = null) { + importMemory(moduleName, name, initialSize, maximumSize = null, shared = false) { Arg.string("moduleName", moduleName); Arg.string("name", name); Arg.number("initialSize", initialSize); @@ -7776,10 +9108,10 @@ var webasmPlayground = (() => { )) { throw new Error(`An import already existing for ${moduleName}.${name}`); } - if (this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) { - throw new VerificationError("Only one memory is allowed per module."); + if ((this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) && !this._resolvedFeatures.has("multi-memory")) { + throw new VerificationError("Only one memory is allowed per module. Enable the multi-memory feature to allow multiple memories."); } - const memoryType = new MemoryType(new ResizableLimits(initialSize, maximumSize)); + const memoryType = new MemoryType(new ResizableLimits(initialSize, maximumSize), shared); const importBuilder = new ImportBuilder( moduleName, name, @@ -7831,8 +9163,8 @@ var webasmPlayground = (() => { return functionBuilder; } defineTable(elementType, initialSize, maximumSize = null) { - if (this._tables.length === 1) { - throw new Error("Only one table can be created per module."); + if (this._tables.length >= 1 && !this._resolvedFeatures.has("multi-table")) { + throw new Error("Only one table can be created per module. Enable the multi-table feature to allow multiple tables."); } const table = new TableBuilder( this, @@ -7843,14 +9175,16 @@ var webasmPlayground = (() => { this._tables.push(table); return table; } - defineMemory(initialSize, maximumSize = null) { - if (this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) { - throw new VerificationError("Only one memory is allowed per module."); + defineMemory(initialSize, maximumSize = null, shared = false, memory64 = false) { + if ((this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) && !this._resolvedFeatures.has("multi-memory")) { + throw new VerificationError("Only one memory is allowed per module. Enable the multi-memory feature to allow multiple memories."); } const memory = new MemoryBuilder( this, new ResizableLimits(initialSize, maximumSize), - this._memories.length + this._importsIndexSpace.memory + this._memories.length + this._importsIndexSpace.memory, + shared, + memory64 ); this._memories.push(memory); return memory; @@ -7868,6 +9202,16 @@ var webasmPlayground = (() => { this._globals.push(globalBuilder); return globalBuilder; } + defineTag(parameters) { + const funcType = this.defineFuncType(null, parameters); + const tagBuilder = new TagBuilder( + this, + funcType, + this._tags.length + ); + this._tags.push(tagBuilder); + return tagBuilder; + } setStartFunction(functionBuilder) { Arg.instanceOf("functionBuilder", functionBuilder, FunctionBuilder); this._startFunction = functionBuilder; @@ -7916,8 +9260,8 @@ var webasmPlayground = (() => { exportGlobal(globalBuilder, name) { Arg.notEmptyString("name", name); Arg.instanceOf("globalBuilder", globalBuilder, GlobalBuilder); - if (globalBuilder.globalType.mutable && !this.disableVerification) { - throw new VerificationError("Cannot export a mutable global."); + if (globalBuilder.globalType.mutable && !this.disableVerification && !this._resolvedFeatures.has("mutable-globals")) { + throw new VerificationError("Cannot export a mutable global. Enable the mutable-globals feature to allow this."); } if (this._exports.find( (x) => x.externalKind === ExternalKind.Global && x.name === name @@ -7929,15 +9273,22 @@ var webasmPlayground = (() => { return exportBuilder; } defineTableSegment(table, elements, offset) { - const segment = new ElementSegmentBuilder(table, elements); + const segment = new ElementSegmentBuilder(table, elements, this._resolvedFeatures); if (offset !== void 0) { segment.offset(offset); } this._elements.push(segment); + return segment; + } + definePassiveElementSegment(elements) { + const segment = new ElementSegmentBuilder(null, elements, this._resolvedFeatures); + segment.passive(); + this._elements.push(segment); + return segment; } defineData(data, offset) { Arg.instanceOf("data", data, Uint8Array); - const dataSegmentBuilder = new DataSegmentBuilder(data); + const dataSegmentBuilder = new DataSegmentBuilder(data, this._resolvedFeatures); if (offset !== void 0) { dataSegmentBuilder.offset(offset); } @@ -7979,11 +9330,127 @@ var webasmPlayground = (() => { }; _ModuleBuilder.targetFeatures = { "mvp": [], - "2.0": ["sign-extend", "sat-trunc", "bulk-memory", "reference-types", "multi-value"], - "latest": ["sign-extend", "sat-trunc", "bulk-memory", "reference-types", "simd", "multi-value"] + "2.0": ["sign-extend", "sat-trunc", "bulk-memory", "reference-types", "multi-value", "mutable-globals"], + "3.0": [ + "sign-extend", + "sat-trunc", + "bulk-memory", + "reference-types", + "multi-value", + "mutable-globals", + "simd", + "tail-call", + "exception-handling", + "threads", + "multi-memory", + "multi-table", + "memory64", + "extended-const" + ], + "latest": [ + "sign-extend", + "sat-trunc", + "bulk-memory", + "reference-types", + "multi-value", + "mutable-globals", + "simd", + "tail-call", + "exception-handling", + "threads", + "multi-memory", + "multi-table", + "memory64", + "extended-const", + "relaxed-simd", + "gc" + ] }; var ModuleBuilder = _ModuleBuilder; + // src/PackageBuilder.ts + var PackageBuilder = class { + constructor() { + this._modules = []; + } + defineModule(name, options) { + if (this._modules.find((m) => m.name === name)) { + throw new Error(`A module with the name "${name}" already exists.`); + } + const moduleBuilder = new ModuleBuilder(name, options); + this._modules.push({ name, moduleBuilder, dependencies: [] }); + return moduleBuilder; + } + addDependency(moduleName, dependsOn) { + const entry = this._modules.find((m) => m.name === moduleName); + if (!entry) { + throw new Error(`Module "${moduleName}" not found.`); + } + if (!this._modules.find((m) => m.name === dependsOn)) { + throw new Error(`Dependency module "${dependsOn}" not found.`); + } + if (!entry.dependencies.includes(dependsOn)) { + entry.dependencies.push(dependsOn); + } + } + getModule(name) { + return this._modules.find((m) => m.name === name)?.moduleBuilder; + } + topologicalSort() { + const visited = /* @__PURE__ */ new Set(); + const sorted = []; + const visiting = /* @__PURE__ */ new Set(); + const visit = (name) => { + if (visited.has(name)) return; + if (visiting.has(name)) { + throw new Error(`Circular dependency detected involving module "${name}".`); + } + visiting.add(name); + const entry = this._modules.find((m) => m.name === name); + for (const dep of entry.dependencies) { + visit(dep); + } + visiting.delete(name); + visited.add(name); + sorted.push(entry); + }; + for (const entry of this._modules) { + visit(entry.name); + } + return sorted; + } + async compile() { + const sorted = this.topologicalSort(); + const result = {}; + for (const entry of sorted) { + const bytes = entry.moduleBuilder.toBytes(); + result[entry.name] = await WebAssembly.compile(bytes.buffer); + } + return result; + } + async instantiate(imports = {}) { + const sorted = this.topologicalSort(); + const result = {}; + for (const entry of sorted) { + const bytes = entry.moduleBuilder.toBytes(); + const moduleImports = {}; + if (imports[entry.name]) { + Object.assign(moduleImports, imports[entry.name]); + } + for (const depName of entry.dependencies) { + const depInstance = result[depName]; + if (depInstance) { + moduleImports[depName] = depInstance.exports; + } + } + const instantiated = await WebAssembly.instantiate(bytes.buffer, moduleImports); + const instance = instantiated.instance; + result[entry.name] = instance; + } + return result; + } + }; + // src/WatParser.ts function tokenize(source) { const tokens = []; @@ -8960,1192 +10427,3066 @@ var webasmPlayground = (() => { return parser.parse(options); } - // playground/playground.ts - var EXAMPLES = { - // ─── Basics ─── - "hello-wasm": { - label: "Hello WASM", - group: "Basics", - code: `// Hello WASM \u2014 the simplest possible module -const mod = new webasmjs.ModuleBuilder('hello'); + // playground/playground.ts + var EXAMPLES = { + // ─── Basics ─── + "hello-wasm": { + label: "Hello WASM", + group: "Basics", + description: "The simplest possible module \u2014 export a function that returns 42.", + target: "mvp", + features: [], + code: `// Hello WASM \u2014 the simplest possible module +const mod = new webasmjs.ModuleBuilder('hello'); + +mod.defineFunction('answer', [webasmjs.ValueType.Int32], [], (f, a) => { + a.const_i32(42); +}).withExport(); + +const instance = await mod.instantiate(); +const answer = instance.instance.exports.answer; +log('The answer to everything: ' + answer());` + }, + factorial: { + label: "Factorial", + group: "Basics", + description: "Iterative factorial using loop and block for control flow.", + target: "mvp", + features: [], + code: `// Factorial \u2014 iterative with loop and block +const mod = new webasmjs.ModuleBuilder('factorial'); + +mod.defineFunction('factorial', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const n = f.getParameter(0); + const result = a.declareLocal(webasmjs.ValueType.Int32, 'result'); + const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); + + a.const_i32(1); + a.set_local(result); + a.const_i32(1); + a.set_local(i); + + a.loop(webasmjs.BlockType.Void, (loopLabel) => { + a.block(webasmjs.BlockType.Void, (breakLabel) => { + a.get_local(i); + a.get_local(n); + a.gt_i32(); + a.br_if(breakLabel); + + a.get_local(result); + a.get_local(i); + a.mul_i32(); + a.set_local(result); + + a.get_local(i); + a.const_i32(1); + a.add_i32(); + a.set_local(i); + a.br(loopLabel); + }); + }); + + a.get_local(result); +}).withExport(); + +const instance = await mod.instantiate(); +const factorial = instance.instance.exports.factorial; +for (let n = 0; n <= 10; n++) { + log(n + '! = ' + factorial(n)); +}` + }, + fibonacci: { + label: "Fibonacci", + group: "Basics", + description: "Iterative Fibonacci with local variables and branching.", + target: "mvp", + features: [], + code: `// Fibonacci sequence \u2014 iterative +const mod = new webasmjs.ModuleBuilder('fibonacci'); + +mod.defineFunction('fib', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const n = f.getParameter(0); + const prev = a.declareLocal(webasmjs.ValueType.Int32, 'prev'); + const curr = a.declareLocal(webasmjs.ValueType.Int32, 'curr'); + const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp'); + const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); + + a.get_local(n); + a.const_i32(1); + a.le_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.get_local(n); + a.return(); + }); + + a.const_i32(0); + a.set_local(prev); + a.const_i32(1); + a.set_local(curr); + a.const_i32(2); + a.set_local(i); + + a.loop(webasmjs.BlockType.Void, (loopLabel) => { + a.block(webasmjs.BlockType.Void, (breakLabel) => { + a.get_local(i); + a.get_local(n); + a.gt_i32(); + a.br_if(breakLabel); + + a.get_local(curr); + a.set_local(temp); + a.get_local(curr); + a.get_local(prev); + a.add_i32(); + a.set_local(curr); + a.get_local(temp); + a.set_local(prev); + + a.get_local(i); + a.const_i32(1); + a.add_i32(); + a.set_local(i); + a.br(loopLabel); + }); + }); + + a.get_local(curr); +}).withExport(); + +const instance = await mod.instantiate(); +const fib = instance.instance.exports.fib; +for (let n = 0; n <= 15; n++) { + log('fib(' + n + ') = ' + fib(n)); +}` + }, + "if-else": { + label: "If/Else", + group: "Basics", + description: "Absolute value and sign function using typed if/else blocks.", + target: "mvp", + features: [], + code: `// If/Else \u2014 absolute value and sign function +const mod = new webasmjs.ModuleBuilder('ifElse'); + +// Absolute value using if/else with typed block +mod.defineFunction('abs', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(0); + a.lt_i32(); + a.if(webasmjs.BlockType.Int32); + a.const_i32(0); + a.get_local(f.getParameter(0)); + a.sub_i32(); + a.else(); + a.get_local(f.getParameter(0)); + a.end(); +}).withExport(); + +// Sign function: returns -1, 0, or 1 +mod.defineFunction('sign', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(0); + a.lt_i32(); + a.if(webasmjs.BlockType.Int32); + a.const_i32(-1); + a.else(); + a.get_local(f.getParameter(0)); + a.const_i32(0); + a.gt_i32(); + a.if(webasmjs.BlockType.Int32); + a.const_i32(1); + a.else(); + a.const_i32(0); + a.end(); + a.end(); +}).withExport(); + +const instance = await mod.instantiate(); +const { abs, sign } = instance.instance.exports; + +log('abs(5) = ' + abs(5)); +log('abs(-5) = ' + abs(-5)); +log('abs(0) = ' + abs(0)); +log(''); +log('sign(42) = ' + sign(42)); +log('sign(-7) = ' + sign(-7)); +log('sign(0) = ' + sign(0));` + }, + // ─── Memory ─── + memory: { + label: "Memory Basics", + group: "Memory", + description: "Store and load i32 values in linear memory.", + target: "mvp", + features: [], + code: `// Memory: store and load values +const mod = new webasmjs.ModuleBuilder('memoryExample'); +const mem = mod.defineMemory(1); +mod.exportMemory(mem, 'memory'); + +mod.defineFunction('store', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0); +}).withExport(); + +mod.defineFunction('load', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { store, load } = instance.instance.exports; + +store(0, 42); +store(4, 100); +log('Value at address 0: ' + load(0)); +log('Value at address 4: ' + load(4)); +store(0, load(0) + load(4)); +log('Sum stored at 0: ' + load(0));` + }, + "byte-array": { + label: "Byte Array", + group: "Memory", + description: "Store and sum individual bytes with load8/store8 instructions.", + target: "mvp", + features: [], + code: `// Byte array \u2014 store and sum individual bytes +const mod = new webasmjs.ModuleBuilder('byteArray'); +mod.defineMemory(1); + +// Store a byte at offset +mod.defineFunction('setByte', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store8_i32(0, 0); +}).withExport(); + +// Load a byte from offset +mod.defineFunction('getByte', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load8_i32_u(0, 0); +}).withExport(); + +// Sum bytes from offset 0 to length-1 +mod.defineFunction('sumBytes', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const len = f.getParameter(0); + const sum = a.declareLocal(webasmjs.ValueType.Int32, 'sum'); + const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); + + a.const_i32(0); + a.set_local(sum); + a.const_i32(0); + a.set_local(i); + + a.loop(webasmjs.BlockType.Void, (loopLabel) => { + a.block(webasmjs.BlockType.Void, (breakLabel) => { + a.get_local(i); + a.get_local(len); + a.ge_i32(); + a.br_if(breakLabel); + + a.get_local(sum); + a.get_local(i); + a.load8_i32_u(0, 0); + a.add_i32(); + a.set_local(sum); + + a.get_local(i); + a.const_i32(1); + a.add_i32(); + a.set_local(i); + a.br(loopLabel); + }); + }); + + a.get_local(sum); +}).withExport(); + +const instance = await mod.instantiate(); +const { setByte, getByte, sumBytes } = instance.instance.exports; + +// Fill bytes 0..9 with values 10, 20, 30, ... +for (let i = 0; i < 10; i++) { + setByte(i, (i + 1) * 10); +} + +log('Stored bytes:'); +for (let i = 0; i < 10; i++) { + log(' [' + i + '] = ' + getByte(i)); +} +log('Sum of 10 bytes: ' + sumBytes(10));` + }, + "string-memory": { + label: "Strings in Memory", + group: "Memory", + description: "Store a string via data segment and compute its length.", + target: "mvp", + features: [], + code: `// Strings in memory \u2014 store a string, compute its length +const mod = new webasmjs.ModuleBuilder('stringMem'); +const mem = mod.defineMemory(1); +mod.exportMemory(mem, 'memory'); + +// Store a data segment with a string at offset 0 +const greeting = new TextEncoder().encode('Hello, WebAssembly!'); +mod.defineData(new Uint8Array([...greeting, 0]), 0); // null-terminated + +// strlen: count bytes until null +mod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const ptr = f.getParameter(0); + const len = a.declareLocal(webasmjs.ValueType.Int32, 'len'); + + a.const_i32(0); + a.set_local(len); + + a.loop(webasmjs.BlockType.Void, (loopLabel) => { + a.block(webasmjs.BlockType.Void, (breakLabel) => { + // Load byte at ptr + len + a.get_local(ptr); + a.get_local(len); + a.add_i32(); + a.load8_i32_u(0, 0); + a.eqz_i32(); + a.br_if(breakLabel); + + a.get_local(len); + a.const_i32(1); + a.add_i32(); + a.set_local(len); + a.br(loopLabel); + }); + }); + + a.get_local(len); +}).withExport(); + +const instance = await mod.instantiate(); +const { strlen, memory } = instance.instance.exports; + +// Read the string from memory +const memView = new Uint8Array(memory.buffer); +const strLen = strlen(0); +const str = new TextDecoder().decode(memView.slice(0, strLen)); + +log('String in memory: "' + str + '"'); +log('Length: ' + strLen);` + }, + "data-segments": { + label: "Data Segments", + group: "Memory", + description: "Pre-initialize memory with defineData and read values at runtime.", + target: "mvp", + features: [], + code: `// Data segments \u2014 pre-initialize memory with static data +const mod = new webasmjs.ModuleBuilder('dataSegments'); +const mem = mod.defineMemory(1); +mod.exportMemory(mem, 'memory'); + +// Pre-fill memory with a lookup table at offset 0 +// Powers of 2: [1, 2, 4, 8, 16, 32, 64, 128] +const powers = new Uint8Array(new Int32Array([1, 2, 4, 8, 16, 32, 64, 128]).buffer); +mod.defineData(powers, 0); + +// Pre-fill memory with a message at offset 64 +const msg = new TextEncoder().encode('Hello from data segment!'); +mod.defineData(new Uint8Array([...msg, 0]), 64); + +// Read an i32 from the powers table: getPower(index) +mod.defineFunction('getPower', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(4); + a.mul_i32(); + a.load_i32(2, 0); +}).withExport(); + +// strlen starting at offset +mod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const ptr = f.getParameter(0); + const len = a.declareLocal(webasmjs.ValueType.Int32, 'len'); + a.const_i32(0); + a.set_local(len); + a.loop(webasmjs.BlockType.Void, (loopLabel) => { + a.block(webasmjs.BlockType.Void, (breakLabel) => { + a.get_local(ptr); + a.get_local(len); + a.add_i32(); + a.load8_i32_u(0, 0); + a.eqz_i32(); + a.br_if(breakLabel); + a.get_local(len); + a.const_i32(1); + a.add_i32(); + a.set_local(len); + a.br(loopLabel); + }); + }); + a.get_local(len); +}).withExport(); + +const instance = await mod.instantiate(); +const { getPower, strlen, memory } = instance.instance.exports; + +log('Powers of 2 from data segment:'); +for (let i = 0; i < 8; i++) { + log(' 2^' + i + ' = ' + getPower(i)); +} + +const view = new Uint8Array(memory.buffer); +const len = strlen(64); +const str = new TextDecoder().decode(view.slice(64, 64 + len)); +log(''); +log('Message from data segment: "' + str + '"');` + }, + "memory-growth": { + label: "Memory Growth", + group: "Memory", + description: "Grow memory at runtime with mem_grow and query size with mem_size.", + target: "mvp", + features: [], + code: `// Memory growth \u2014 dynamically add pages at runtime +const mod = new webasmjs.ModuleBuilder('memGrowth'); +const mem = mod.defineMemory(1); // start with 1 page (64KB) +mod.exportMemory(mem, 'memory'); + +// Return current memory size in pages +mod.defineFunction('pages', [webasmjs.ValueType.Int32], [], (f, a) => { + a.mem_size(0); +}).withExport(); + +// Grow memory by N pages, return previous size (or -1 on failure) +mod.defineFunction('grow', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.mem_grow(0); +}).withExport(); + +// Store an i32 at a byte offset +mod.defineFunction('store', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0); +}).withExport(); + +// Load an i32 from a byte offset +mod.defineFunction('load', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { pages, grow, store, load } = instance.instance.exports; + +log('Initial size: ' + pages() + ' page(s) = ' + (pages() * 64) + ' KB'); + +// Grow by 2 pages +const prev = grow(2); +log('grow(2) returned previous size: ' + prev); +log('New size: ' + pages() + ' page(s) = ' + (pages() * 64) + ' KB'); + +// Write to the new pages (offset > 64KB = beyond original page) +const offset = 65536 + 100; // byte 100 in second page +store(offset, 12345); +log('Stored 12345 at offset ' + offset + ' (in grown memory)'); +log('Loaded: ' + load(offset)); + +// Grow again +grow(1); +log('After another grow(1): ' + pages() + ' pages');` + }, + // ─── Globals & State ─── + globals: { + label: "Global Counter", + group: "Globals", + description: "Mutable global variable used as a persistent counter.", + target: "mvp", + features: [], + code: `// Globals: mutable counter +const mod = new webasmjs.ModuleBuilder('globals'); + +const counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0); + +mod.defineFunction('increment', [webasmjs.ValueType.Int32], [], (f, a) => { + a.get_global(counter); + a.const_i32(1); + a.add_i32(); + a.set_global(counter); + a.get_global(counter); +}).withExport(); + +mod.defineFunction('getCount', [webasmjs.ValueType.Int32], [], (f, a) => { + a.get_global(counter); +}).withExport(); + +const instance = await mod.instantiate(); +const { increment, getCount } = instance.instance.exports; + +log('Initial: ' + getCount()); +increment(); +increment(); +increment(); +log('After 3 increments: ' + getCount()); +for (let i = 0; i < 7; i++) increment(); +log('After 7 more: ' + getCount());` + }, + "start-function": { + label: "Start Function", + group: "Globals", + description: "A function that runs automatically on module instantiation.", + target: "mvp", + features: [], + code: `// Start function \u2014 runs automatically on instantiation +const mod = new webasmjs.ModuleBuilder('startExample'); + +const initialized = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0); + +// This function runs automatically at instantiation +const initFn = mod.defineFunction('init', null, [], (f, a) => { + a.const_i32(1); + a.set_global(initialized); +}); +mod.setStartFunction(initFn); + +// Exported getter +mod.defineFunction('isInitialized', [webasmjs.ValueType.Int32], [], (f, a) => { + a.get_global(initialized); +}).withExport(); + +const instance = await mod.instantiate(); +const { isInitialized } = instance.instance.exports; +log('isInitialized (should be 1): ' + isInitialized()); +log('The start function ran automatically!');` + }, + // ─── Functions & Calls ─── + "multi-func": { + label: "Function Calls", + group: "Functions", + description: "Multiple functions calling each other \u2014 square, double, compose.", + target: "mvp", + features: [], + code: `// Multiple functions calling each other +const mod = new webasmjs.ModuleBuilder('multiFn'); + +// Helper: square +mod.defineFunction('square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(0)); + a.mul_i32(); +}).withExport(); + +// Helper: double +mod.defineFunction('double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(2); + a.mul_i32(); +}).withExport(); + +// Composed: 2 * x^2 +const squareFn = mod._functions[0]; +const doubleFn = mod._functions[1]; + +mod.defineFunction('doubleSquare', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.call(squareFn); + a.call(doubleFn); +}).withExport(); + +const instance = await mod.instantiate(); +const { square, double: dbl, doubleSquare } = instance.instance.exports; + +for (let x = 1; x <= 5; x++) { + log('x=' + x + ': square=' + square(x) + ', double=' + dbl(x) + ', 2x\xB2=' + doubleSquare(x)); +}` + }, + "imports": { + label: "Import Functions", + group: "Functions", + description: "Import host functions so WASM can call JavaScript.", + target: "mvp", + features: [], + code: `// Importing host functions \u2014 WASM calling JavaScript +const mod = new webasmjs.ModuleBuilder('imports'); + +// Declare an import: env.print takes an i32 +const printImport = mod.importFunction('env', 'print', null, [webasmjs.ValueType.Int32]); + +// Declare another import: env.getTime returns an i32 +const getTimeImport = mod.importFunction('env', 'getTime', [webasmjs.ValueType.Int32], []); + +mod.defineFunction('run', null, [], (f, a) => { + // Call getTime, then print it + a.call(getTimeImport); + a.call(printImport); + + // Print some constants + a.const_i32(100); + a.call(printImport); + a.const_i32(200); + a.call(printImport); + a.const_i32(300); + a.call(printImport); +}).withExport(); + +const logged = []; +const instance = await mod.instantiate({ + env: { + print: (v) => { logged.push(v); }, + getTime: () => Date.now() & 0x7FFFFFFF, + }, +}); + +instance.instance.exports.run(); + +log('Values printed by WASM:'); +logged.forEach((v, i) => log(' [' + i + '] ' + v));` + }, + "indirect-call": { + label: "Indirect Calls (Table)", + group: "Functions", + description: "Dispatch function calls through a table using call_indirect.", + target: "mvp", + features: [], + code: `// Indirect calls via function table +const mod = new webasmjs.ModuleBuilder('indirectCall'); + +const add = mod.defineFunction('add', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_i32(); +}); + +const sub = mod.defineFunction('sub', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.sub_i32(); +}); + +const mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.mul_i32(); +}); + +// Create a table with 3 entries +const table = mod.defineTable(webasmjs.ElementType.AnyFunc, 3); +mod.defineTableSegment(table, [add, sub, mul], 0); + +// Dispatcher: call function at table[opIndex](a, b) +mod.defineFunction('dispatch', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(1)); // a + a.get_local(f.getParameter(2)); // b + a.get_local(f.getParameter(0)); // table index + a.call_indirect(add.funcTypeBuilder); +}).withExport(); + +const instance = await mod.instantiate(); +const { dispatch } = instance.instance.exports; + +const ops = ['add', 'sub', 'mul']; +for (let op = 0; op < 3; op++) { + log(ops[op] + '(10, 3) = ' + dispatch(op, 10, 3)); +}` + }, + "multi-module": { + label: "Multi-Module", + group: "Functions", + description: "Use PackageBuilder to link two modules with imports.", + target: "mvp", + features: [], + code: `// Multi-module \u2014 PackageBuilder links modules with dependencies +const pkg = new webasmjs.PackageBuilder(); + +// Module "math": provides a double function +const mathMod = pkg.defineModule('math'); +mathMod.defineFunction('double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(2); + a.mul_i32(); +}).withExport(); + +mathMod.defineFunction('square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(0)); + a.mul_i32(); +}).withExport(); + +// Module "main": imports from "math" and composes +const mainMod = pkg.defineModule('main'); +const doubleFn = mainMod.importFunction('math', 'double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32]); +const squareFn = mainMod.importFunction('math', 'square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32]); + +// quadruple(x) = double(double(x)) +mainMod.defineFunction('quadruple', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.call(doubleFn); + a.call(doubleFn); +}).withExport(); + +// doubleSquare(x) = double(square(x)) = 2 * x^2 +mainMod.defineFunction('doubleSquare', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.call(squareFn); + a.call(doubleFn); +}).withExport(); + +pkg.addDependency('main', 'math'); +const result = await pkg.instantiate(); +const { quadruple, doubleSquare } = result.main.exports; + +log('PackageBuilder \u2014 two linked modules:'); +for (let x = 1; x <= 6; x++) { + log(' x=' + x + ': quadruple=' + quadruple(x) + ', 2x\\u00B2=' + doubleSquare(x)); +}` + }, + "recursive": { + label: "Recursive Function", + group: "Functions", + description: "Self-recursive power function using a.call(f).", + target: "mvp", + features: [], + code: `// Recursive function \u2014 power(base, exp) calls itself +const mod = new webasmjs.ModuleBuilder('recursion'); + +mod.defineFunction('power', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const base = f.getParameter(0); + const exp = f.getParameter(1); + + // if exp == 0 return 1 + a.get_local(exp); + a.eqz_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.const_i32(1); + a.return(); + }); + + // return base * power(base, exp - 1) + a.get_local(base); + a.get_local(base); + a.get_local(exp); + a.const_i32(1); + a.sub_i32(); + a.call(f); // recursive call to self! + a.mul_i32(); +}).withExport(); + +const instance = await mod.instantiate(); +const { power } = instance.instance.exports; + +log('Recursive power(base, exp):'); +for (let b = 2; b <= 5; b++) { + const results = []; + for (let e = 0; e <= 5; e++) results.push(b + '^' + e + '=' + power(b, e)); + log(' ' + results.join(', ')); +}` + }, + // ─── Control Flow ─── + "br-table": { + label: "Branch Table", + group: "Control Flow", + description: "Switch/case dispatch using the br_table instruction.", + target: "mvp", + features: [], + code: `// br_table \u2014 switch/case dispatch to different blocks +const mod = new webasmjs.ModuleBuilder('brTable'); + +// dayType(day): 0-4 => "weekday" (return 1), 5-6 => "weekend" (return 2), else => "invalid" (return 0) +mod.defineFunction('dayType', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const day = f.getParameter(0); + const result = a.declareLocal(webasmjs.ValueType.Int32, 'result'); + + a.block(webasmjs.BlockType.Void, (invalidBlock) => { + a.block(webasmjs.BlockType.Void, (weekendBlock) => { + a.block(webasmjs.BlockType.Void, (weekdayBlock) => { + // br_table: value 0-4 => weekdayBlock, 5-6 => weekendBlock, default => invalidBlock + a.get_local(day); + a.br_table(invalidBlock, + weekdayBlock, weekdayBlock, weekdayBlock, weekdayBlock, weekdayBlock, + weekendBlock, weekendBlock + ); + }); + // weekday path + a.const_i32(1); + a.set_local(result); + a.br(invalidBlock); // jump to end + }); + // weekend path + a.const_i32(2); + a.set_local(result); + a.br(invalidBlock); // jump to end + }); + // if we fell through to here via default, result is still 0 + + a.get_local(result); +}).withExport(); + +const instance = await mod.instantiate(); +const { dayType } = instance.instance.exports; + +const names = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; +const types = ['invalid', 'weekday', 'weekend']; +for (let d = 0; d < 7; d++) { + log(names[d] + ' (day ' + d + '): ' + types[dayType(d)]); +} +log('day 7: ' + types[dayType(7)]); +log('day 99: ' + types[dayType(99)]);` + }, + "select": { + label: "Select (Ternary)", + group: "Control Flow", + description: "Branchless conditional with select \u2014 like a ternary operator.", + target: "mvp", + features: [], + code: `// select \u2014 branchless conditional (ternary operator) +const mod = new webasmjs.ModuleBuilder('selectOp'); + +// max(a, b) = a > b ? a : b (using select) +mod.defineFunction('max', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const x = f.getParameter(0); + const y = f.getParameter(1); + + a.get_local(x); // value if true + a.get_local(y); // value if false + a.get_local(x); + a.get_local(y); + a.gt_i32(); // condition: x > y + a.select(); +}).withExport(); + +// min(a, b) = a < b ? a : b +mod.defineFunction('min', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const x = f.getParameter(0); + const y = f.getParameter(1); + + a.get_local(x); + a.get_local(y); + a.get_local(x); + a.get_local(y); + a.lt_i32(); + a.select(); +}).withExport(); + +// clamp(val, lo, hi) +mod.defineFunction('clamp', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const val = f.getParameter(0); + const lo = f.getParameter(1); + const hi = f.getParameter(2); + const tmp = a.declareLocal(webasmjs.ValueType.Int32, 'tmp'); + + // tmp = val > hi ? hi : val + a.get_local(hi); + a.get_local(val); + a.get_local(val); + a.get_local(hi); + a.gt_i32(); + a.select(); + a.set_local(tmp); + + // result = tmp < lo ? lo : tmp + a.get_local(lo); + a.get_local(tmp); + a.get_local(tmp); + a.get_local(lo); + a.lt_i32(); + a.select(); +}).withExport(); + +const instance = await mod.instantiate(); +const { max, min, clamp } = instance.instance.exports; + +log('max(3, 7) = ' + max(3, 7)); +log('max(10, 2) = ' + max(10, 2)); +log('min(3, 7) = ' + min(3, 7)); +log('min(10, 2) = ' + min(10, 2)); +log(''); +log('clamp(5, 0, 10) = ' + clamp(5, 0, 10)); +log('clamp(-3, 0, 10) = ' + clamp(-3, 0, 10)); +log('clamp(15, 0, 10) = ' + clamp(15, 0, 10)); +log('clamp(0, 0, 10) = ' + clamp(0, 0, 10)); +log('clamp(10, 0, 10) = ' + clamp(10, 0, 10));` + }, + "nested-blocks": { + label: "Nested Blocks", + group: "Control Flow", + description: "Multi-level block nesting with early break and continue.", + target: "mvp", + features: [], + code: `// Nested blocks \u2014 multi-level break and continue patterns +const mod = new webasmjs.ModuleBuilder('nestedBlocks'); + +// Find the first number in [start, start+limit) divisible by both 3 and 5 +// Returns -1 if not found +mod.defineFunction('findFizzBuzz', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const start = f.getParameter(0); + const limit = f.getParameter(1); + const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); + const end = a.declareLocal(webasmjs.ValueType.Int32, 'end'); + const result = a.declareLocal(webasmjs.ValueType.Int32, 'result'); + + a.const_i32(-1); + a.set_local(result); + + // end = start + limit + a.get_local(start); + a.get_local(limit); + a.add_i32(); + a.set_local(end); + + a.get_local(start); + a.set_local(i); + + // outer block \u2014 break here when found + a.block(webasmjs.BlockType.Void, (found) => { + a.loop(webasmjs.BlockType.Void, (cont) => { + // if i >= end, exit loop + a.block(webasmjs.BlockType.Void, (skip) => { + a.get_local(i); + a.get_local(end); + a.ge_i32(); + a.br_if(found); + + // Check divisible by 3 + a.get_local(i); + a.const_i32(3); + a.rem_i32_u(); + a.br_if(skip); // not divisible by 3, skip + + // Check divisible by 5 + a.get_local(i); + a.const_i32(5); + a.rem_i32_u(); + a.br_if(skip); // not divisible by 5, skip + + // Found! Save and break to outer + a.get_local(i); + a.set_local(result); + a.br(found); + }); + + // i++ + a.get_local(i); + a.const_i32(1); + a.add_i32(); + a.set_local(i); + a.br(cont); + }); + }); + + a.get_local(result); +}).withExport(); + +const instance = await mod.instantiate(); +const { findFizzBuzz } = instance.instance.exports; + +log('Find first FizzBuzz (divisible by 3 and 5):'); +log(' findFizzBuzz(1, 100) = ' + findFizzBuzz(1, 100)); +log(' findFizzBuzz(16, 10) = ' + findFizzBuzz(16, 10)); +log(' findFizzBuzz(31, 50) = ' + findFizzBuzz(31, 50)); +log(' findFizzBuzz(1, 5) = ' + findFizzBuzz(1, 5) + ' (not found)'); +log(' findFizzBuzz(46, 10) = ' + findFizzBuzz(46, 10));` + }, + "drop-and-tee": { + label: "Drop & Tee Local", + group: "Control Flow", + description: "Stack manipulation with drop() and tee_local().", + target: "mvp", + features: [], + code: `// drop and tee_local \u2014 stack manipulation +const mod = new webasmjs.ModuleBuilder('stackOps'); + +// tee_local: stores to local AND keeps value on stack +// Equivalent to: set_local + get_local, but in one instruction +mod.defineFunction('sumAndCount', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + const n = f.getParameter(0); + const sum = a.declareLocal(webasmjs.ValueType.Int32, 'sum'); + const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); + + a.const_i32(0); + a.set_local(sum); + a.const_i32(1); + a.set_local(i); + + a.loop(webasmjs.BlockType.Void, (cont) => { + a.block(webasmjs.BlockType.Void, (brk) => { + a.get_local(i); + a.get_local(n); + a.gt_i32(); + a.br_if(brk); + + // tee_local: store i to sum while keeping it on stack + a.get_local(sum); + a.get_local(i); + a.tee_local(i); // stores i, but also leaves value on stack + a.add_i32(); + a.set_local(sum); + + // increment i (which was already tee'd) + a.get_local(i); + a.const_i32(1); + a.add_i32(); + a.set_local(i); + a.br(cont); + }); + }); + + a.get_local(sum); +}).withExport(); + +// drop: discard an unwanted return value +mod.defineFunction('callAndDiscard', [webasmjs.ValueType.Int32], [], (f, a) => { + // Call sumAndCount but ignore its return value + a.const_i32(10); + a.call(mod._functions[0]); // calls sumAndCount(10) + a.drop(); // discard the result + + // Return a fixed value instead + a.const_i32(42); +}).withExport(); + +const instance = await mod.instantiate(); +const { sumAndCount, callAndDiscard } = instance.instance.exports; + +log('sumAndCount (uses tee_local):'); +for (const n of [5, 10, 100]) { + log(' sum(1..' + n + ') = ' + sumAndCount(n)); +} +log(''); +log('callAndDiscard (uses drop):'); +log(' result = ' + callAndDiscard() + ' (dropped sumAndCount result, returned 42)');` + }, + "unreachable-trap": { + label: "Unreachable Trap", + group: "Control Flow", + description: "Use unreachable as an assertion \u2014 traps if reached.", + target: "mvp", + features: [], + code: `// unreachable \u2014 intentional trap for defensive programming +const mod = new webasmjs.ModuleBuilder('trapDemo'); + +// divide(a, b) \u2014 traps if b is zero +mod.defineFunction('divide', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const x = f.getParameter(0); + const y = f.getParameter(1); + + // Guard: trap if divisor is zero + a.get_local(y); + a.eqz_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.unreachable(); // trap! + }); + + a.get_local(x); + a.get_local(y); + a.div_i32(); +}).withExport(); + +const instance = await mod.instantiate(); +const { divide } = instance.instance.exports; + +log('divide(10, 2) = ' + divide(10, 2)); +log('divide(100, 5) = ' + divide(100, 5)); +log('divide(7, 3) = ' + divide(7, 3)); +log(''); + +try { + divide(10, 0); + log('Should not reach here!'); +} catch (e) { + log('divide(10, 0) trapped: ' + e.message); + log('The unreachable instruction prevented division by zero!'); +}` + }, + // ─── Numeric Types ─── + "float-math": { + label: "Float Math", + group: "Numeric", + description: "Floating-point distance, rounding, and sqrt with f64.", + target: "mvp", + features: [], + code: `// Floating-point operations \u2014 f64 math functions +const mod = new webasmjs.ModuleBuilder('floatMath'); + +// Distance: sqrt(dx*dx + dy*dy) +mod.defineFunction('distance', [webasmjs.ValueType.Float64], + [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64, + webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => { + const x1 = f.getParameter(0); + const y1 = f.getParameter(1); + const x2 = f.getParameter(2); + const y2 = f.getParameter(3); + const dx = a.declareLocal(webasmjs.ValueType.Float64, 'dx'); + const dy = a.declareLocal(webasmjs.ValueType.Float64, 'dy'); + + // dx = x2 - x1 + a.get_local(x2); + a.get_local(x1); + a.sub_f64(); + a.set_local(dx); + + // dy = y2 - y1 + a.get_local(y2); + a.get_local(y1); + a.sub_f64(); + a.set_local(dy); + + // sqrt(dx*dx + dy*dy) + a.get_local(dx); + a.get_local(dx); + a.mul_f64(); + a.get_local(dy); + a.get_local(dy); + a.mul_f64(); + a.add_f64(); + a.sqrt_f64(); +}).withExport(); + +// Rounding functions +mod.defineFunction('roundUp', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.ceil_f64(); +}).withExport(); + +mod.defineFunction('roundDown', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.floor_f64(); +}).withExport(); + +const instance = await mod.instantiate(); +const { distance, roundUp, roundDown } = instance.instance.exports; + +log('distance((0,0), (3,4)) = ' + distance(0, 0, 3, 4)); +log('distance((1,1), (4,5)) = ' + distance(1, 1, 4, 5)); +log(''); +log('roundUp(2.3) = ' + roundUp(2.3)); +log('roundUp(2.7) = ' + roundUp(2.7)); +log('roundDown(2.3) = ' + roundDown(2.3)); +log('roundDown(2.7) = ' + roundDown(2.7));` + }, + "i64-bigint": { + label: "i64 / BigInt", + group: "Numeric", + description: "64-bit integers with BigInt interop \u2014 large factorial.", + target: "mvp", + features: [], + code: `// 64-bit integers \u2014 BigInt interop +const mod = new webasmjs.ModuleBuilder('i64ops'); + +mod.defineFunction('add64', [webasmjs.ValueType.Int64], + [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_i64(); +}).withExport(); + +mod.defineFunction('mul64', [webasmjs.ValueType.Int64], + [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.mul_i64(); +}).withExport(); + +// Factorial with i64 \u2014 can handle larger numbers +mod.defineFunction('factorial64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int64], (f, a) => { + const n = f.getParameter(0); + const result = a.declareLocal(webasmjs.ValueType.Int64, 'result'); + const i = a.declareLocal(webasmjs.ValueType.Int64, 'i'); + + a.const_i64(1n); + a.set_local(result); + a.const_i64(1n); + a.set_local(i); + + a.loop(webasmjs.BlockType.Void, (loopLabel) => { + a.block(webasmjs.BlockType.Void, (breakLabel) => { + a.get_local(i); + a.get_local(n); + a.gt_i64(); + a.br_if(breakLabel); + + a.get_local(result); + a.get_local(i); + a.mul_i64(); + a.set_local(result); + + a.get_local(i); + a.const_i64(1n); + a.add_i64(); + a.set_local(i); + a.br(loopLabel); + }); + }); + + a.get_local(result); +}).withExport(); + +const instance = await mod.instantiate(); +const { add64, mul64, factorial64 } = instance.instance.exports; + +log('add64(1000000000000n, 2000000000000n) = ' + add64(1000000000000n, 2000000000000n)); +log('mul64(123456789n, 987654321n) = ' + mul64(123456789n, 987654321n)); +log(''); +log('Factorial with i64 (no overflow up to 20!):'); +for (let n = 0n; n <= 20n; n++) { + log(' ' + n + '! = ' + factorial64(n)); +}` + }, + "type-conversions": { + label: "Type Conversions", + group: "Numeric", + description: "Convert between i32, i64, f32, and f64 types.", + target: "mvp", + features: [], + code: `// Type conversions between numeric types +const mod = new webasmjs.ModuleBuilder('conversions'); + +// i32 to f64 +mod.defineFunction('i32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.convert_i32_s_f64(); +}).withExport(); + +// f64 to i32 (truncate) +mod.defineFunction('f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.trunc_f64_s_i32(); +}).withExport(); + +// i32 to i64 (sign extend) +mod.defineFunction('i32_to_i64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.extend_i32_s_i64(); +}).withExport(); + +// i64 to i32 (wrap) +mod.defineFunction('i64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); + a.wrap_i64_i32(); +}).withExport(); + +// f32 to f64 (promote) +mod.defineFunction('f32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.promote_f32_f64(); +}).withExport(); + +const instance = await mod.instantiate(); +const { i32_to_f64, f64_to_i32, i32_to_i64, i64_to_i32, f32_to_f64 } = instance.instance.exports; + +log('i32(42) \u2192 f64: ' + i32_to_f64(42)); +log('f64(3.14) \u2192 i32: ' + f64_to_i32(3.14)); +log('f64(99.9) \u2192 i32: ' + f64_to_i32(99.9)); +log('i32(42) \u2192 i64: ' + i32_to_i64(42)); +log('i32(-1) \u2192 i64: ' + i32_to_i64(-1)); +log('i64(0x1FFFFFFFFn) \u2192 i32: ' + i64_to_i32(0x1FFFFFFFFn)); +log('f32(3.14) \u2192 f64: ' + f32_to_f64(3.140000104904175));` + }, + "bitwise-ops": { + label: "Bitwise Operations", + group: "Numeric", + description: "Rotation, leading/trailing zeros, and popcount on i32.", + target: "mvp", + features: [], + code: `// Bitwise operations \u2014 rotl, rotr, clz, ctz, popcnt +const mod = new webasmjs.ModuleBuilder('bitwiseOps'); -mod.defineFunction('answer', [webasmjs.ValueType.Int32], [], (f, a) => { - a.const_i32(42); +mod.defineFunction('rotl', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.rotl_i32(); }).withExport(); -const instance = await mod.instantiate(); -const answer = instance.instance.exports.answer; -log('The answer to everything: ' + answer());` - }, - factorial: { - label: "Factorial", - group: "Basics", - code: `// Factorial \u2014 iterative with loop and block -const mod = new webasmjs.ModuleBuilder('factorial'); +mod.defineFunction('rotr', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.rotr_i32(); +}).withExport(); -mod.defineFunction('factorial', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { - const n = f.getParameter(0); - const result = a.declareLocal(webasmjs.ValueType.Int32, 'result'); - const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); +mod.defineFunction('clz', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.clz_i32(); +}).withExport(); - a.const_i32(1); - a.set_local(result); - a.const_i32(1); - a.set_local(i); +mod.defineFunction('ctz', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.ctz_i32(); +}).withExport(); - a.loop(webasmjs.BlockType.Void, (loopLabel) => { - a.block(webasmjs.BlockType.Void, (breakLabel) => { - a.get_local(i); - a.get_local(n); - a.gt_i32(); - a.br_if(breakLabel); +mod.defineFunction('popcnt', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.popcnt_i32(); +}).withExport(); - a.get_local(result); - a.get_local(i); - a.mul_i32(); - a.set_local(result); +const instance = await mod.instantiate(); +const { rotl, rotr, clz, ctz, popcnt } = instance.instance.exports; - a.get_local(i); - a.const_i32(1); - a.add_i32(); - a.set_local(i); - a.br(loopLabel); - }); - }); +log('=== Rotation ==='); +log('rotl(0x80000001, 1) = 0x' + (rotl(0x80000001, 1) >>> 0).toString(16)); +log('rotr(0x80000001, 1) = 0x' + (rotr(0x80000001, 1) >>> 0).toString(16)); +log('rotl(1, 10) = ' + rotl(1, 10) + ' (1 << 10 = 1024)'); - a.get_local(result); +log(''); +log('=== Bit Counting ==='); +log('clz(1) = ' + clz(1) + ' (31 leading zeros)'); +log('clz(256) = ' + clz(256) + ' (23 leading zeros)'); +log('clz(0) = ' + clz(0) + ' (all 32 zeros)'); +log('ctz(256) = ' + ctz(256) + ' (8 trailing zeros)'); +log('ctz(1) = ' + ctz(1) + ' (0 trailing zeros)'); +log('popcnt(0xFF) = ' + popcnt(0xFF) + ' (8 bits set)'); +log('popcnt(0x55555555) = ' + popcnt(0x55555555) + ' (16 bits set)'); +log('popcnt(0) = ' + popcnt(0));` + }, + "float-special": { + label: "Float Special Ops", + group: "Numeric", + description: "copysign, nearest, trunc \u2014 standalone float operations.", + target: "mvp", + features: [], + code: `// Special float operations \u2014 copysign, nearest, trunc +const mod = new webasmjs.ModuleBuilder('floatSpecial'); + +// copysign(a, b) \u2014 magnitude of a, sign of b +mod.defineFunction('copysign', [webasmjs.ValueType.Float64], + [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.copysign_f64(); }).withExport(); -const instance = await mod.instantiate(); -const factorial = instance.instance.exports.factorial; -for (let n = 0; n <= 10; n++) { - log(n + '! = ' + factorial(n)); -}` - }, - fibonacci: { - label: "Fibonacci", - group: "Basics", - code: `// Fibonacci sequence \u2014 iterative -const mod = new webasmjs.ModuleBuilder('fibonacci'); +// nearest \u2014 round to nearest even (banker's rounding) +mod.defineFunction('nearest', [webasmjs.ValueType.Float64], + [webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.nearest_f64(); +}).withExport(); -mod.defineFunction('fib', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { - const n = f.getParameter(0); - const prev = a.declareLocal(webasmjs.ValueType.Int32, 'prev'); - const curr = a.declareLocal(webasmjs.ValueType.Int32, 'curr'); - const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp'); - const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); +// trunc \u2014 round towards zero (remove fractional part) +mod.defineFunction('trunc', [webasmjs.ValueType.Float64], + [webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.trunc_f64(); +}).withExport(); - a.get_local(n); - a.const_i32(1); - a.le_i32(); - a.if(webasmjs.BlockType.Void, () => { - a.get_local(n); - a.return(); - }); +const instance = await mod.instantiate(); +const { copysign, nearest, trunc } = instance.instance.exports; - a.const_i32(0); - a.set_local(prev); - a.const_i32(1); - a.set_local(curr); - a.const_i32(2); - a.set_local(i); +log('=== copysign(magnitude, sign) ==='); +log('copysign(5.0, -1.0) = ' + copysign(5.0, -1.0)); +log('copysign(-5.0, 1.0) = ' + copysign(-5.0, 1.0)); +log('copysign(3.14, -0.0) = ' + copysign(3.14, -0.0)); - a.loop(webasmjs.BlockType.Void, (loopLabel) => { - a.block(webasmjs.BlockType.Void, (breakLabel) => { - a.get_local(i); - a.get_local(n); - a.gt_i32(); - a.br_if(breakLabel); +log(''); +log('=== nearest (banker\\u2019s rounding) ==='); +log('nearest(0.5) = ' + nearest(0.5) + ' (rounds to even: 0)'); +log('nearest(1.5) = ' + nearest(1.5) + ' (rounds to even: 2)'); +log('nearest(2.5) = ' + nearest(2.5) + ' (rounds to even: 2)'); +log('nearest(3.5) = ' + nearest(3.5) + ' (rounds to even: 4)'); +log('nearest(2.3) = ' + nearest(2.3)); +log('nearest(-1.7) = ' + nearest(-1.7)); - a.get_local(curr); - a.set_local(temp); - a.get_local(curr); - a.get_local(prev); - a.add_i32(); - a.set_local(curr); - a.get_local(temp); - a.set_local(prev); +log(''); +log('=== trunc (towards zero) ==='); +log('trunc(2.9) = ' + trunc(2.9)); +log('trunc(-2.9) = ' + trunc(-2.9)); +log('trunc(0.1) = ' + trunc(0.1));` + }, + "reinterpret": { + label: "Reinterpret Casts", + group: "Numeric", + description: "Reinterpret bits between float and int without conversion.", + target: "mvp", + features: [], + code: `// Reinterpret \u2014 same bits, different type interpretation +const mod = new webasmjs.ModuleBuilder('reinterpret'); + +// View f32 bits as i32 +mod.defineFunction('f32_bits', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.reinterpret_f32_i32(); +}).withExport(); - a.get_local(i); - a.const_i32(1); - a.add_i32(); - a.set_local(i); - a.br(loopLabel); - }); - }); +// View i32 bits as f32 +mod.defineFunction('i32_as_f32', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.reinterpret_i32_f32(); +}).withExport(); - a.get_local(curr); +// View f64 bits as i64 +mod.defineFunction('f64_bits', [webasmjs.ValueType.Int64], + [webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.reinterpret_f64_i64(); +}).withExport(); + +// View i64 bits as f64 +mod.defineFunction('i64_as_f64', [webasmjs.ValueType.Float64], + [webasmjs.ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); + a.reinterpret_i64_f64(); }).withExport(); const instance = await mod.instantiate(); -const fib = instance.instance.exports.fib; -for (let n = 0; n <= 15; n++) { - log('fib(' + n + ') = ' + fib(n)); -}` +const { f32_bits, i32_as_f32, f64_bits, i64_as_f64 } = instance.instance.exports; + +log('=== f32 \\u2194 i32 reinterpret ==='); +log('f32_bits(1.0) = 0x' + (f32_bits(1.0) >>> 0).toString(16).padStart(8, '0') + ' (IEEE 754: 3F800000)'); +log('f32_bits(-1.0) = 0x' + (f32_bits(-1.0) >>> 0).toString(16).padStart(8, '0') + ' (BF800000)'); +log('f32_bits(0.0) = 0x' + (f32_bits(0.0) >>> 0).toString(16).padStart(8, '0')); +log('i32_as_f32(0x3F800000) = ' + i32_as_f32(0x3F800000) + ' (1.0)'); +log('i32_as_f32(0x40490FDB) = ' + i32_as_f32(0x40490FDB) + ' (~pi)'); + +log(''); +log('=== f64 \\u2194 i64 reinterpret ==='); +log('f64_bits(1.0) = 0x' + f64_bits(1.0).toString(16) + ' (3FF0000000000000)'); +log('i64_as_f64(0x4009_21FB_5444_2D18n) = ' + i64_as_f64(0x400921FB54442D18n) + ' (pi)');` }, - "if-else": { - label: "If/Else", - group: "Basics", - code: `// If/Else \u2014 absolute value and sign function -const mod = new webasmjs.ModuleBuilder('ifElse'); + // ─── Algorithms ─── + "bubble-sort": { + label: "Bubble Sort", + group: "Algorithms", + description: "Sort an array in linear memory with nested loops.", + target: "mvp", + features: [], + code: `// Bubble sort in WASM memory +const mod = new webasmjs.ModuleBuilder('bubbleSort'); +mod.defineMemory(1); -// Absolute value using if/else with typed block -mod.defineFunction('abs', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { +// Store i32 at index (index * 4) +mod.defineFunction('set', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.const_i32(0); - a.lt_i32(); - a.if(webasmjs.BlockType.Int32); - a.const_i32(0); - a.get_local(f.getParameter(0)); - a.sub_i32(); - a.else(); - a.get_local(f.getParameter(0)); - a.end(); + a.const_i32(4); + a.mul_i32(); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0); }).withExport(); -// Sign function: returns -1, 0, or 1 -mod.defineFunction('sign', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { +// Load i32 at index +mod.defineFunction('get', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); + a.const_i32(4); + a.mul_i32(); + a.load_i32(2, 0); +}).withExport(); + +const setFn = mod._functions[0]; +const getFn = mod._functions[1]; + +// Bubble sort(length) +mod.defineFunction('sort', null, [webasmjs.ValueType.Int32], (f, a) => { + const len = f.getParameter(0); + const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); + const j = a.declareLocal(webasmjs.ValueType.Int32, 'j'); + const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp'); + const swapped = a.declareLocal(webasmjs.ValueType.Int32, 'swapped'); + a.const_i32(0); - a.lt_i32(); - a.if(webasmjs.BlockType.Int32); - a.const_i32(-1); - a.else(); - a.get_local(f.getParameter(0)); - a.const_i32(0); - a.gt_i32(); - a.if(webasmjs.BlockType.Int32); + a.set_local(i); + + // Outer loop + a.loop(webasmjs.BlockType.Void, (outerLoop) => { + a.block(webasmjs.BlockType.Void, (outerBreak) => { + a.get_local(i); + a.get_local(len); + a.const_i32(1); + a.sub_i32(); + a.ge_i32(); + a.br_if(outerBreak); + + a.const_i32(0); + a.set_local(swapped); + a.const_i32(0); + a.set_local(j); + + // Inner loop + a.loop(webasmjs.BlockType.Void, (innerLoop) => { + a.block(webasmjs.BlockType.Void, (innerBreak) => { + a.get_local(j); + a.get_local(len); + a.const_i32(1); + a.sub_i32(); + a.get_local(i); + a.sub_i32(); + a.ge_i32(); + a.br_if(innerBreak); + + // if arr[j] > arr[j+1], swap + a.get_local(j); + a.call(getFn); + a.get_local(j); + a.const_i32(1); + a.add_i32(); + a.call(getFn); + a.gt_i32(); + a.if(webasmjs.BlockType.Void, () => { + // temp = arr[j] + a.get_local(j); + a.call(getFn); + a.set_local(temp); + // arr[j] = arr[j+1] + a.get_local(j); + a.get_local(j); + a.const_i32(1); + a.add_i32(); + a.call(getFn); + a.call(setFn); + // arr[j+1] = temp + a.get_local(j); + a.const_i32(1); + a.add_i32(); + a.get_local(temp); + a.call(setFn); + a.const_i32(1); + a.set_local(swapped); + }); + + a.get_local(j); + a.const_i32(1); + a.add_i32(); + a.set_local(j); + a.br(innerLoop); + }); + }); + + // Early exit if no swaps + a.get_local(swapped); + a.eqz_i32(); + a.br_if(outerBreak); + + a.get_local(i); a.const_i32(1); - a.else(); - a.const_i32(0); - a.end(); - a.end(); + a.add_i32(); + a.set_local(i); + a.br(outerLoop); + }); + }); }).withExport(); const instance = await mod.instantiate(); -const { abs, sign } = instance.instance.exports; +const { set, get, sort } = instance.instance.exports; -log('abs(5) = ' + abs(5)); -log('abs(-5) = ' + abs(-5)); -log('abs(0) = ' + abs(0)); -log(''); -log('sign(42) = ' + sign(42)); -log('sign(-7) = ' + sign(-7)); -log('sign(0) = ' + sign(0));` +const data = [64, 34, 25, 12, 22, 11, 90, 1, 55, 42]; +log('Before: ' + data.join(', ')); + +data.forEach((v, i) => set(i, v)); +sort(data.length); + +const sorted = []; +for (let i = 0; i < data.length; i++) sorted.push(get(i)); +log('After: ' + sorted.join(', '));` }, - // ─── Memory ─── - memory: { - label: "Memory Basics", - group: "Memory", - code: `// Memory: store and load values -const mod = new webasmjs.ModuleBuilder('memoryExample'); -const mem = mod.defineMemory(1); -mod.exportMemory(mem, 'memory'); + "gcd": { + label: "GCD (Euclidean)", + group: "Algorithms", + description: "Greatest common divisor using the Euclidean algorithm.", + target: "mvp", + features: [], + code: `// Greatest common divisor \u2014 Euclidean algorithm +const mod = new webasmjs.ModuleBuilder('gcd'); -mod.defineFunction('store', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { - a.get_local(f.getParameter(0)); - a.get_local(f.getParameter(1)); - a.store_i32(2, 0); -}).withExport(); +mod.defineFunction('gcd', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const x = f.getParameter(0); + const y = f.getParameter(1); + const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp'); -mod.defineFunction('load', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { - a.get_local(f.getParameter(0)); - a.load_i32(2, 0); -}).withExport(); + a.loop(webasmjs.BlockType.Void, (loopLabel) => { + a.block(webasmjs.BlockType.Void, (breakLabel) => { + a.get_local(y); + a.eqz_i32(); + a.br_if(breakLabel); -const instance = await mod.instantiate(); -const { store, load } = instance.instance.exports; + // temp = y + a.get_local(y); + a.set_local(temp); + // y = x % y + a.get_local(x); + a.get_local(y); + a.rem_i32_u(); + a.set_local(y); + // x = temp + a.get_local(temp); + a.set_local(x); -store(0, 42); -store(4, 100); -log('Value at address 0: ' + load(0)); -log('Value at address 4: ' + load(4)); -store(0, load(0) + load(4)); -log('Sum stored at 0: ' + load(0));` - }, - "byte-array": { - label: "Byte Array", - group: "Memory", - code: `// Byte array \u2014 store and sum individual bytes -const mod = new webasmjs.ModuleBuilder('byteArray'); -mod.defineMemory(1); + a.br(loopLabel); + }); + }); -// Store a byte at offset -mod.defineFunction('setByte', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { - a.get_local(f.getParameter(0)); - a.get_local(f.getParameter(1)); - a.store8_i32(0, 0); + a.get_local(x); }).withExport(); -// Load a byte from offset -mod.defineFunction('getByte', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { - a.get_local(f.getParameter(0)); - a.load8_i32_u(0, 0); -}).withExport(); +const instance = await mod.instantiate(); +const { gcd } = instance.instance.exports; -// Sum bytes from offset 0 to length-1 -mod.defineFunction('sumBytes', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { - const len = f.getParameter(0); - const sum = a.declareLocal(webasmjs.ValueType.Int32, 'sum'); - const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); +const pairs = [[12, 8], [100, 75], [17, 13], [48, 18], [0, 5], [7, 0], [1071, 462]]; +for (const [a, b] of pairs) { + log('gcd(' + a + ', ' + b + ') = ' + gcd(a, b)); +}` + }, + "collatz": { + label: "Collatz Conjecture", + group: "Algorithms", + description: "Count steps to reach 1 using the 3n+1 conjecture.", + target: "mvp", + features: [], + code: `// Collatz conjecture \u2014 count steps to reach 1 +const mod = new webasmjs.ModuleBuilder('collatz'); + +mod.defineFunction('collatz', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const n = f.getParameter(0); + const steps = a.declareLocal(webasmjs.ValueType.Int32, 'steps'); a.const_i32(0); - a.set_local(sum); - a.const_i32(0); - a.set_local(i); + a.set_local(steps); a.loop(webasmjs.BlockType.Void, (loopLabel) => { a.block(webasmjs.BlockType.Void, (breakLabel) => { - a.get_local(i); - a.get_local(len); - a.ge_i32(); + a.get_local(n); + a.const_i32(1); + a.le_i32(); a.br_if(breakLabel); - a.get_local(sum); - a.get_local(i); - a.load8_i32_u(0, 0); + a.get_local(steps); + a.const_i32(1); a.add_i32(); - a.set_local(sum); + a.set_local(steps); - a.get_local(i); + // if n is odd: n = 3n + 1, else: n = n / 2 + a.get_local(n); a.const_i32(1); - a.add_i32(); - a.set_local(i); + a.and_i32(); + a.if(webasmjs.BlockType.Void); + // odd: n = 3n + 1 + a.get_local(n); + a.const_i32(3); + a.mul_i32(); + a.const_i32(1); + a.add_i32(); + a.set_local(n); + a.else(); + // even: n = n / 2 + a.get_local(n); + a.const_i32(1); + a.shr_i32_u(); + a.set_local(n); + a.end(); + a.br(loopLabel); }); }); - a.get_local(sum); + a.get_local(steps); }).withExport(); const instance = await mod.instantiate(); -const { setByte, getByte, sumBytes } = instance.instance.exports; - -// Fill bytes 0..9 with values 10, 20, 30, ... -for (let i = 0; i < 10; i++) { - setByte(i, (i + 1) * 10); -} +const { collatz } = instance.instance.exports; -log('Stored bytes:'); -for (let i = 0; i < 10; i++) { - log(' [' + i + '] = ' + getByte(i)); -} -log('Sum of 10 bytes: ' + sumBytes(10));` +for (const n of [1, 2, 3, 6, 7, 9, 27, 97, 871]) { + log('collatz(' + n + ') = ' + collatz(n) + ' steps'); +}` }, - "string-memory": { - label: "Strings in Memory", - group: "Memory", - code: `// Strings in memory \u2014 store a string, compute its length -const mod = new webasmjs.ModuleBuilder('stringMem'); -const mem = mod.defineMemory(1); -mod.exportMemory(mem, 'memory'); + "is-prime": { + label: "Primality Test", + group: "Algorithms", + description: "Trial division to test and list prime numbers.", + target: "mvp", + features: [], + code: `// Primality test \u2014 trial division +const mod = new webasmjs.ModuleBuilder('prime'); -// Store a data segment with a string at offset 0 -const greeting = new TextEncoder().encode('Hello, WebAssembly!'); -mod.defineData(new Uint8Array([...greeting, 0]), 0); // null-terminated +mod.defineFunction('isPrime', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const n = f.getParameter(0); + const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); -// strlen: count bytes until null -mod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { - const ptr = f.getParameter(0); - const len = a.declareLocal(webasmjs.ValueType.Int32, 'len'); + // n <= 1 \u2192 not prime + a.get_local(n); + a.const_i32(1); + a.le_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.const_i32(0); + a.return(); + }); - a.const_i32(0); - a.set_local(len); + // n <= 3 \u2192 prime + a.get_local(n); + a.const_i32(3); + a.le_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.const_i32(1); + a.return(); + }); + + // divisible by 2 \u2192 not prime + a.get_local(n); + a.const_i32(2); + a.rem_i32_u(); + a.eqz_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.const_i32(0); + a.return(); + }); + + // Trial division from 3 to sqrt(n) + a.const_i32(3); + a.set_local(i); a.loop(webasmjs.BlockType.Void, (loopLabel) => { a.block(webasmjs.BlockType.Void, (breakLabel) => { - // Load byte at ptr + len - a.get_local(ptr); - a.get_local(len); - a.add_i32(); - a.load8_i32_u(0, 0); + // if i * i > n, break (is prime) + a.get_local(i); + a.get_local(i); + a.mul_i32(); + a.get_local(n); + a.gt_i32(); + a.br_if(breakLabel); + + // if n % i == 0, not prime + a.get_local(n); + a.get_local(i); + a.rem_i32_u(); a.eqz_i32(); - a.br_if(breakLabel); + a.if(webasmjs.BlockType.Void, () => { + a.const_i32(0); + a.return(); + }); - a.get_local(len); - a.const_i32(1); + a.get_local(i); + a.const_i32(2); a.add_i32(); - a.set_local(len); + a.set_local(i); a.br(loopLabel); }); }); - a.get_local(len); + a.const_i32(1); }).withExport(); const instance = await mod.instantiate(); -const { strlen, memory } = instance.instance.exports; +const { isPrime } = instance.instance.exports; -// Read the string from memory -const memView = new Uint8Array(memory.buffer); -const strLen = strlen(0); -const str = new TextDecoder().decode(memView.slice(0, strLen)); +log('Prime numbers up to 100:'); +const primes = []; +for (let n = 2; n <= 100; n++) { + if (isPrime(n)) primes.push(n); +} +log(primes.join(', ')); +log(''); +log('Testing larger numbers:'); +for (const n of [997, 1000, 7919, 7920, 104729]) { + log(n + ' is ' + (isPrime(n) ? 'prime' : 'not prime')); +}` + }, + // ─── WAT Parser ─── + "wat-parser": { + label: "WAT Parser", + group: "WAT", + description: "Parse WebAssembly Text format and instantiate the module.", + target: "mvp", + features: [], + code: `// Parse WAT text and instantiate +const watSource = \` +(module $parsed + (func $add (param i32) (param i32) (result i32) + local.get 0 + local.get 1 + i32.add + ) + (export "add" (func $add)) +) +\`; -log('String in memory: "' + str + '"'); -log('Length: ' + strLen);` +log('Parsing WAT source...'); +const mod = webasmjs.parseWat(watSource); +log('WAT parsed successfully!'); +log(''); + +const instance = await mod.instantiate(); +const add = instance.instance.exports.add; +log('add(3, 4) = ' + add(3, 4)); +log('add(100, 200) = ' + add(100, 200)); +log('add(-5, 10) = ' + add(-5, 10));` }, - // ─── Globals & State ─── - globals: { - label: "Global Counter", - group: "Globals", - code: `// Globals: mutable counter -const mod = new webasmjs.ModuleBuilder('globals'); + "wat-loop": { + label: "WAT Loop & Branch", + group: "WAT", + description: "WAT with loop, block, and branch instructions.", + target: "mvp", + features: [], + code: `// WAT with loop and branch instructions +const watSource = \` +(module $loops + (func $sum (param i32) (result i32) + (local i32) ;; accumulator + (local i32) ;; counter + i32.const 0 + local.set 1 + i32.const 1 + local.set 2 + block $break + loop $continue + local.get 2 + local.get 0 + i32.gt_s + br_if $break -const counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0); + local.get 1 + local.get 2 + i32.add + local.set 1 -mod.defineFunction('increment', [webasmjs.ValueType.Int32], [], (f, a) => { - a.get_global(counter); - a.const_i32(1); - a.add_i32(); - a.set_global(counter); - a.get_global(counter); -}).withExport(); + local.get 2 + i32.const 1 + i32.add + local.set 2 + br $continue + end + end + local.get 1 + ) + (export "sum" (func $sum)) +) +\`; -mod.defineFunction('getCount', [webasmjs.ValueType.Int32], [], (f, a) => { - a.get_global(counter); -}).withExport(); +const mod = webasmjs.parseWat(watSource); +const instance = await mod.instantiate(); +const sum = instance.instance.exports.sum; + +log('Sum from 1 to N:'); +for (const n of [0, 1, 5, 10, 50, 100]) { + log(' sum(' + n + ') = ' + sum(n)); +}` + }, + "wat-memory": { + label: "WAT Memory & Data", + group: "WAT", + description: "WAT with memory declarations, store/load, and exports.", + target: "mvp", + features: [], + code: `// WAT with memory, data segments, and imports +const watSource = \` +(module $memTest + (memory 1) + (func $store (param i32) (param i32) + local.get 0 + local.get 1 + i32.store offset=0 align=4 + ) + (func $load (param i32) (result i32) + local.get 0 + i32.load offset=0 align=4 + ) + (export "store" (func $store)) + (export "load" (func $load)) + (export "mem" (memory 0)) +) +\`; +const mod = webasmjs.parseWat(watSource); const instance = await mod.instantiate(); -const { increment, getCount } = instance.instance.exports; +const { store, load, mem } = instance.instance.exports; -log('Initial: ' + getCount()); -increment(); -increment(); -increment(); -log('After 3 increments: ' + getCount()); -for (let i = 0; i < 7; i++) increment(); -log('After 7 more: ' + getCount());` +// Store values at various offsets +store(0, 11); +store(4, 22); +store(8, 33); +store(12, 44); + +log('Memory contents:'); +for (let addr = 0; addr < 16; addr += 4) { + log(' [' + addr + '] = ' + load(addr)); +} + +// Also inspect raw memory +const view = new Uint8Array(mem.buffer); +log(''); +log('Raw bytes [0..15]: ' + Array.from(view.slice(0, 16)).join(', '));` }, - "start-function": { - label: "Start Function", - group: "Globals", - code: `// Start function \u2014 runs automatically on instantiation -const mod = new webasmjs.ModuleBuilder('startExample'); + "wat-global": { + label: "WAT Globals & Start", + group: "WAT", + description: "WAT with mutable globals, start function, and inc/dec.", + target: "mvp", + features: [], + code: `// WAT with globals, start function, and if/else +const watSource = \` +(module $globalDemo + (global $counter (mut i32) (i32.const 0)) -const initialized = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0); + (func $init + i32.const 100 + global.set 0 + ) -// This function runs automatically at instantiation -const initFn = mod.defineFunction('init', null, [], (f, a) => { - a.const_i32(1); - a.set_global(initialized); -}); -mod.setStartFunction(initFn); + (func $inc (result i32) + global.get 0 + i32.const 1 + i32.add + global.set 0 + global.get 0 + ) -// Exported getter -mod.defineFunction('isInitialized', [webasmjs.ValueType.Int32], [], (f, a) => { - a.get_global(initialized); -}).withExport(); + (func $dec (result i32) + global.get 0 + i32.const 1 + i32.sub + global.set 0 + global.get 0 + ) + + (func $getCounter (result i32) + global.get 0 + ) + + (start $init) + (export "inc" (func $inc)) + (export "dec" (func $dec)) + (export "getCounter" (func $getCounter)) +) +\`; +const mod = webasmjs.parseWat(watSource); const instance = await mod.instantiate(); -const { isInitialized } = instance.instance.exports; -log('isInitialized (should be 1): ' + isInitialized()); -log('The start function ran automatically!');` +const { inc, dec, getCounter } = instance.instance.exports; + +log('Initial (set by start): ' + getCounter()); +log('inc() = ' + inc()); +log('inc() = ' + inc()); +log('inc() = ' + inc()); +log('dec() = ' + dec()); +log('Final: ' + getCounter());` }, - // ─── Functions & Calls ─── - "multi-func": { - label: "Function Calls", - group: "Functions", - code: `// Multiple functions calling each other -const mod = new webasmjs.ModuleBuilder('multiFn'); + "wat-imports": { + label: "WAT Imports", + group: "WAT", + description: "WAT with function imports calling JavaScript host functions.", + target: "mvp", + features: [], + code: `// WAT with imports \u2014 call JavaScript from WebAssembly text +const watSource = \` +(module $importDemo + (import "env" "print" (func $print (param i32))) + (import "env" "add" (func $add (param i32) (param i32) (result i32))) + + (func $run + ;; Call host add(3, 4), then print the result + i32.const 3 + i32.const 4 + call $add + call $print + + ;; Print some constants + i32.const 100 + call $print + i32.const 200 + call $print + ) + + (export "run" (func $run)) +) +\`; + +const mod = webasmjs.parseWat(watSource); +const results = []; +const instance = await mod.instantiate({ + env: { + print: (v) => results.push(v), + add: (a, b) => a + b, + }, +}); + +instance.instance.exports.run(); + +log('WAT module called JS imports:'); +results.forEach((v, i) => log(' print[' + i + '] = ' + v)); +log(''); +log('First value is add(3, 4) = 7, then constants 100, 200');` + }, + // ─── SIMD ─── + "simd-vec-add": { + label: "SIMD Vector Add", + group: "SIMD", + description: "Add two f32x4 vectors in memory using SIMD.", + target: "3.0", + features: ["simd"], + code: `// SIMD: add two f32x4 vectors in memory +const mod = new webasmjs.ModuleBuilder('simdAdd'); +mod.defineMemory(1); -// Helper: square -mod.defineFunction('square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { - a.get_local(f.getParameter(0)); +// vec4_add(srcA, srcB, dst) \u2014 adds two 4-float vectors +mod.defineFunction('vec4_add', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); // push dest address first a.get_local(f.getParameter(0)); - a.mul_i32(); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.add_f32x4(); + a.store_v128(2, 0); // store expects [addr, value] on stack }).withExport(); -// Helper: double -mod.defineFunction('double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { +mod.defineFunction('setF32', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => { a.get_local(f.getParameter(0)); - a.const_i32(2); - a.mul_i32(); + a.get_local(f.getParameter(1)); + a.store_f32(2, 0); }).withExport(); -// Composed: 2 * x^2 -const squareFn = mod._functions[0]; -const doubleFn = mod._functions[1]; - -mod.defineFunction('doubleSquare', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { +mod.defineFunction('getF32', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.call(squareFn); - a.call(doubleFn); + a.load_f32(2, 0); }).withExport(); const instance = await mod.instantiate(); -const { square, double: dbl, doubleSquare } = instance.instance.exports; +const { vec4_add, setF32, getF32 } = instance.instance.exports; -for (let x = 1; x <= 5; x++) { - log('x=' + x + ': square=' + square(x) + ', double=' + dbl(x) + ', 2x\xB2=' + doubleSquare(x)); +// A = [1, 2, 3, 4] at offset 0 +// B = [10, 20, 30, 40] at offset 16 +for (let i = 0; i < 4; i++) { + setF32(i * 4, i + 1); + setF32(16 + i * 4, (i + 1) * 10); +} + +vec4_add(0, 16, 32); + +log('A = [1, 2, 3, 4]'); +log('B = [10, 20, 30, 40]'); +log('A + B:'); +for (let i = 0; i < 4; i++) { + log(' [' + i + '] = ' + getF32(32 + i * 4)); }` }, - "imports": { - label: "Import Functions", - group: "Functions", - code: `// Importing host functions \u2014 WASM calling JavaScript -const mod = new webasmjs.ModuleBuilder('imports'); + "simd-dot-product": { + label: "SIMD Dot Product", + group: "SIMD", + description: "Element-wise multiply then sum lanes for dot product.", + target: "3.0", + features: ["simd"], + code: `// SIMD dot product: multiply element-wise then sum lanes +const mod = new webasmjs.ModuleBuilder('simdDot'); +mod.defineMemory(1); -// Declare an import: env.print takes an i32 -const printImport = mod.importFunction('env', 'print', null, [webasmjs.ValueType.Int32]); +mod.defineFunction('dot4', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const products = a.declareLocal(webasmjs.ValueType.V128, 'products'); -// Declare another import: env.getTime returns an i32 -const getTimeImport = mod.importFunction('env', 'getTime', [webasmjs.ValueType.Int32], []); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.mul_f32x4(); + a.set_local(products); -mod.defineFunction('run', null, [], (f, a) => { - // Call getTime, then print it - a.call(getTimeImport); - a.call(printImport); + // Sum all 4 lanes + a.get_local(products); + a.extract_lane_f32x4(0); + a.get_local(products); + a.extract_lane_f32x4(1); + a.add_f32(); + a.get_local(products); + a.extract_lane_f32x4(2); + a.add_f32(); + a.get_local(products); + a.extract_lane_f32x4(3); + a.add_f32(); +}).withExport(); - // Print some constants - a.const_i32(100); - a.call(printImport); - a.const_i32(200); - a.call(printImport); - a.const_i32(300); - a.call(printImport); +mod.defineFunction('setF32', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_f32(2, 0); }).withExport(); -const logged = []; -const instance = await mod.instantiate({ - env: { - print: (v) => { logged.push(v); }, - getTime: () => Date.now() & 0x7FFFFFFF, - }, -}); +const instance = await mod.instantiate(); +const { dot4, setF32 } = instance.instance.exports; -instance.instance.exports.run(); +const vecA = [1, 2, 3, 4]; +const vecB = [5, 6, 7, 8]; -log('Values printed by WASM:'); -logged.forEach((v, i) => log(' [' + i + '] ' + v));` +for (let i = 0; i < 4; i++) { + setF32(i * 4, vecA[i]); + setF32(16 + i * 4, vecB[i]); +} + +log('A = [' + vecA + ']'); +log('B = [' + vecB + ']'); +log('dot(A, B) = ' + dot4(0, 16)); +log('Expected: ' + (1*5 + 2*6 + 3*7 + 4*8));` }, - "indirect-call": { - label: "Indirect Calls (Table)", - group: "Functions", - code: `// Indirect calls via function table -const mod = new webasmjs.ModuleBuilder('indirectCall'); + "simd-splat-scale": { + label: "SIMD Splat & Scale", + group: "SIMD", + description: "Broadcast a scalar to all lanes and multiply a vector.", + target: "3.0", + features: ["simd"], + code: `// SIMD splat: broadcast a scalar to all lanes, then multiply +const mod = new webasmjs.ModuleBuilder('simdScale'); +mod.defineMemory(1); -const add = mod.defineFunction('add', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { +// scale_vec4(src, dst, scalar) \u2014 multiply a vector by a scalar +mod.defineFunction('scale_vec4', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(1)); // push dest address first a.get_local(f.getParameter(0)); - a.get_local(f.getParameter(1)); - a.add_i32(); -}); + a.load_v128(2, 0); + a.get_local(f.getParameter(2)); + a.splat_f32x4(); // broadcast scalar to all 4 lanes + a.mul_f32x4(); + a.store_v128(2, 0); // store expects [addr, value] on stack +}).withExport(); -const sub = mod.defineFunction('sub', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { +mod.defineFunction('setF32', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => { a.get_local(f.getParameter(0)); a.get_local(f.getParameter(1)); - a.sub_i32(); -}); + a.store_f32(2, 0); +}).withExport(); -const mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { +mod.defineFunction('getF32', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.get_local(f.getParameter(1)); - a.mul_i32(); -}); - -// Create a table with 3 entries -const table = mod.defineTable(webasmjs.ElementType.AnyFunc, 3); -mod.defineTableSegment(table, [add, sub, mul], 0); - -// Dispatcher: call function at table[opIndex](a, b) -mod.defineFunction('dispatch', [webasmjs.ValueType.Int32], - [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { - a.get_local(f.getParameter(1)); // a - a.get_local(f.getParameter(2)); // b - a.get_local(f.getParameter(0)); // table index - a.call_indirect(add.funcTypeBuilder); + a.load_f32(2, 0); }).withExport(); const instance = await mod.instantiate(); -const { dispatch } = instance.instance.exports; +const { scale_vec4, setF32, getF32 } = instance.instance.exports; -const ops = ['add', 'sub', 'mul']; -for (let op = 0; op < 3; op++) { - log(ops[op] + '(10, 3) = ' + dispatch(op, 10, 3)); +const vec = [2.0, 4.0, 6.0, 8.0]; +for (let i = 0; i < 4; i++) setF32(i * 4, vec[i]); + +scale_vec4(0, 16, 3.0); + +log('Vector: [' + vec + ']'); +log('Scalar: 3.0'); +log('Scaled:'); +for (let i = 0; i < 4; i++) { + log(' [' + i + '] = ' + getF32(16 + i * 4)); }` }, - // ─── Numeric Types ─── - "float-math": { - label: "Float Math", - group: "Numeric", - code: `// Floating-point operations \u2014 f64 math functions -const mod = new webasmjs.ModuleBuilder('floatMath'); + // ─── Bulk Memory ─── + "bulk-memory": { + label: "Bulk Memory Ops", + group: "Bulk Memory", + description: "Fill and copy memory regions with bulk operations.", + target: "2.0", + features: ["bulk-memory"], + code: `// Bulk memory: memory.fill and memory.copy +const mod = new webasmjs.ModuleBuilder('bulkMem'); +const mem = mod.defineMemory(1); +mod.exportMemory(mem, 'memory'); -// Distance: sqrt(dx*dx + dy*dy) -mod.defineFunction('distance', [webasmjs.ValueType.Float64], - [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64, - webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => { - const x1 = f.getParameter(0); - const y1 = f.getParameter(1); - const x2 = f.getParameter(2); - const y2 = f.getParameter(3); - const dx = a.declareLocal(webasmjs.ValueType.Float64, 'dx'); - const dy = a.declareLocal(webasmjs.ValueType.Float64, 'dy'); +// fill(dest, value, length) +mod.defineFunction('fill', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.get_local(f.getParameter(2)); + a.memory_fill(0); +}).withExport(); - // dx = x2 - x1 - a.get_local(x2); - a.get_local(x1); - a.sub_f64(); - a.set_local(dx); +// copy(dest, src, length) +mod.defineFunction('copy', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.get_local(f.getParameter(2)); + a.memory_copy(0, 0); +}).withExport(); - // dy = y2 - y1 - a.get_local(y2); - a.get_local(y1); - a.sub_f64(); - a.set_local(dy); +const instance = await mod.instantiate(); +const { fill, copy, memory } = instance.instance.exports; +const view = new Uint8Array(memory.buffer); + +// Fill 8 bytes at offset 0 with 0xAA +fill(0, 0xAA, 8); +log('After fill(0, 0xAA, 8):'); +log(' bytes[0..7] = [' + Array.from(view.slice(0, 8)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']'); + +// Copy those 8 bytes to offset 32 +copy(32, 0, 8); +log(''); +log('After copy(32, 0, 8):'); +log(' bytes[32..39] = [' + Array.from(view.slice(32, 40)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']'); - // sqrt(dx*dx + dy*dy) - a.get_local(dx); - a.get_local(dx); - a.mul_f64(); - a.get_local(dy); - a.get_local(dy); - a.mul_f64(); - a.add_f64(); - a.sqrt_f64(); -}).withExport(); +// Fill a region with incrementing pattern using a loop +fill(64, 0, 16); +for (let i = 0; i < 16; i++) { + view[64 + i] = i * 3; +} +log(''); +log('Manual pattern at [64..79]:'); +log(' ' + Array.from(view.slice(64, 80)).join(', ')); -// Rounding functions -mod.defineFunction('roundUp', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => { +// Copy that pattern further +copy(128, 64, 16); +log('Copied to [128..143]:'); +log(' ' + Array.from(view.slice(128, 144)).join(', '));` + }, + // ─── Post-MVP Features ─── + "sign-extend": { + label: "Sign Extension", + group: "Post-MVP", + description: "Interpret low bits as signed values with extend8/extend16.", + target: "2.0", + features: ["sign-extend"], + code: `// Sign extension: interpret low bits as signed values +const mod = new webasmjs.ModuleBuilder('signExt'); + +// Treat low 8 bits as a signed byte +mod.defineFunction('extend8', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.ceil_f64(); + a.extend8_s_i32(); }).withExport(); -mod.defineFunction('roundDown', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => { +// Treat low 16 bits as a signed i16 +mod.defineFunction('extend16', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.floor_f64(); + a.extend16_s_i32(); }).withExport(); const instance = await mod.instantiate(); -const { distance, roundUp, roundDown } = instance.instance.exports; +const { extend8, extend16 } = instance.instance.exports; -log('distance((0,0), (3,4)) = ' + distance(0, 0, 3, 4)); -log('distance((1,1), (4,5)) = ' + distance(1, 1, 4, 5)); +log('i32.extend8_s:'); +log(' extend8(0x7F) = ' + extend8(0x7F) + ' (127, positive byte)'); +log(' extend8(0x80) = ' + extend8(0x80) + ' (128 \u2192 -128, sign bit set)'); +log(' extend8(0xFF) = ' + extend8(0xFF) + ' (255 \u2192 -1)'); +log(' extend8(0x100) = ' + extend8(0x100) + ' (256 \u2192 0, wraps to low byte)'); log(''); -log('roundUp(2.3) = ' + roundUp(2.3)); -log('roundUp(2.7) = ' + roundUp(2.7)); -log('roundDown(2.3) = ' + roundDown(2.3)); -log('roundDown(2.7) = ' + roundDown(2.7));` +log('i32.extend16_s:'); +log(' extend16(0x7FFF) = ' + extend16(0x7FFF) + ' (32767, positive)'); +log(' extend16(0x8000) = ' + extend16(0x8000) + ' (32768 \u2192 -32768)'); +log(' extend16(0xFFFF) = ' + extend16(0xFFFF) + ' (65535 \u2192 -1)');` }, - "i64-bigint": { - label: "i64 / BigInt", - group: "Numeric", - code: `// 64-bit integers \u2014 BigInt interop -const mod = new webasmjs.ModuleBuilder('i64ops'); + "sat-trunc": { + label: "Saturating Truncation", + group: "Post-MVP", + description: "Float-to-int conversion that clamps instead of trapping.", + target: "2.0", + features: ["sat-trunc"], + code: `// Saturating truncation: float \u2192 int without trapping on overflow +const mod = new webasmjs.ModuleBuilder('satTrunc'); -mod.defineFunction('add64', [webasmjs.ValueType.Int64], - [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => { +// Normal trunc would trap on overflow; saturating clamps instead +mod.defineFunction('sat_f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => { a.get_local(f.getParameter(0)); - a.get_local(f.getParameter(1)); - a.add_i64(); + a.trunc_sat_f64_s_i32(); }).withExport(); -mod.defineFunction('mul64', [webasmjs.ValueType.Int64], - [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => { +mod.defineFunction('sat_f64_to_u32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => { a.get_local(f.getParameter(0)); - a.get_local(f.getParameter(1)); - a.mul_i64(); + a.trunc_sat_f64_u_i32(); }).withExport(); -// Factorial with i64 \u2014 can handle larger numbers -mod.defineFunction('factorial64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int64], (f, a) => { - const n = f.getParameter(0); - const result = a.declareLocal(webasmjs.ValueType.Int64, 'result'); - const i = a.declareLocal(webasmjs.ValueType.Int64, 'i'); - - a.const_i64(1n); - a.set_local(result); - a.const_i64(1n); - a.set_local(i); +const instance = await mod.instantiate(); +const { sat_f64_to_i32, sat_f64_to_u32 } = instance.instance.exports; - a.loop(webasmjs.BlockType.Void, (loopLabel) => { - a.block(webasmjs.BlockType.Void, (breakLabel) => { - a.get_local(i); - a.get_local(n); - a.gt_i64(); - a.br_if(breakLabel); +log('Saturating f64 \u2192 i32 (signed):'); +log(' 42.9 \u2192 ' + sat_f64_to_i32(42.9)); +log(' -42.9 \u2192 ' + sat_f64_to_i32(-42.9)); +log(' 1e20 \u2192 ' + sat_f64_to_i32(1e20) + ' (clamped to i32 max)'); +log(' -1e20 \u2192 ' + sat_f64_to_i32(-1e20) + ' (clamped to i32 min)'); +log(' NaN \u2192 ' + sat_f64_to_i32(NaN) + ' (NaN \u2192 0)'); +log(' Inf \u2192 ' + sat_f64_to_i32(Infinity) + ' (clamped)'); +log(''); +log('Saturating f64 \u2192 u32 (unsigned, shown as signed i32):'); +log(' 42.9 \u2192 ' + sat_f64_to_u32(42.9)); +log(' -1.0 \u2192 ' + sat_f64_to_u32(-1.0) + ' (negative \u2192 0)'); +log(' 1e20 \u2192 ' + sat_f64_to_u32(1e20) + ' (clamped to u32 max)');` + }, + "ref-types": { + label: "Reference Types", + group: "Post-MVP", + description: "Use ref.null, ref.is_null, and ref.func instructions.", + target: "2.0", + features: ["reference-types"], + code: `// Reference types: ref.null, ref.is_null, ref.func +const mod = new webasmjs.ModuleBuilder('refTypes'); - a.get_local(result); - a.get_local(i); - a.mul_i64(); - a.set_local(result); +const double = mod.defineFunction('double', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(2); + a.mul_i32(); +}).withExport(); - a.get_local(i); - a.const_i64(1n); - a.add_i64(); - a.set_local(i); - a.br(loopLabel); - }); - }); +// Check if a null funcref is null \u2192 1 +mod.defineFunction('isRefNull', [webasmjs.ValueType.Int32], [], (f, a) => { + a.ref_null(0x70); + a.ref_is_null(); +}).withExport(); - a.get_local(result); +// Check if a real function ref is null \u2192 0 +mod.defineFunction('isFuncNull', [webasmjs.ValueType.Int32], [], (f, a) => { + a.ref_func(double); + a.ref_is_null(); }).withExport(); const instance = await mod.instantiate(); -const { add64, mul64, factorial64 } = instance.instance.exports; +const { isRefNull, isFuncNull } = instance.instance.exports; -log('add64(1000000000000n, 2000000000000n) = ' + add64(1000000000000n, 2000000000000n)); -log('mul64(123456789n, 987654321n) = ' + mul64(123456789n, 987654321n)); +log('ref.null + ref.is_null:'); +log(' null funcref is null: ' + (isRefNull() === 1)); +log(' real func ref is null: ' + (isFuncNull() === 1)); log(''); -log('Factorial with i64 (no overflow up to 20!):'); -for (let n = 0n; n <= 20n; n++) { - log(' ' + n + '! = ' + factorial64(n)); -}` +log('double(21) = ' + instance.instance.exports.double(21));` }, - "type-conversions": { - label: "Type Conversions", - group: "Numeric", - code: `// Type conversions between numeric types -const mod = new webasmjs.ModuleBuilder('conversions'); + "target-system": { + label: "Target System", + group: "Post-MVP", + description: "Choose WebAssembly targets and feature flags.", + target: "mvp", + features: [], + code: `// Target system: control which features are available +// Default is 'latest' \u2014 all features enabled +const modLatest = new webasmjs.ModuleBuilder('latest'); +log('latest features:'); +log(' threads: ' + modLatest.hasFeature('threads')); +log(' simd: ' + modLatest.hasFeature('simd')); +log(' exception-handling: ' + modLatest.hasFeature('exception-handling')); +log(' memory64: ' + modLatest.hasFeature('memory64')); +log(' relaxed-simd: ' + modLatest.hasFeature('relaxed-simd')); -// i32 to f64 -mod.defineFunction('i32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Int32], (f, a) => { +log(''); + +// WebAssembly 2.0 \u2014 only widely-deployed features +const mod2 = new webasmjs.ModuleBuilder('compat', { target: '2.0' }); +log('2.0 features:'); +log(' sign-extend: ' + mod2.hasFeature('sign-extend')); +log(' bulk-memory: ' + mod2.hasFeature('bulk-memory')); +log(' threads: ' + mod2.hasFeature('threads')); +log(' simd: ' + mod2.hasFeature('simd')); + +log(''); + +// MVP with specific features +const modCustom = new webasmjs.ModuleBuilder('custom', { + target: 'mvp', + features: ['simd', 'bulk-memory'], +}); +log('mvp + simd + bulk-memory:'); +log(' simd: ' + modCustom.hasFeature('simd')); +log(' bulk-memory: ' + modCustom.hasFeature('bulk-memory')); +log(' threads: ' + modCustom.hasFeature('threads')); + +log(''); + +// Build a simple module with 2.0 target +mod2.defineFunction('add', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.convert_i32_s_f64(); + a.get_local(f.getParameter(1)); + a.add_i32(); }).withExport(); -// f64 to i32 (truncate) -mod.defineFunction('f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => { - a.get_local(f.getParameter(0)); - a.trunc_f64_s_i32(); +const instance = await mod2.instantiate(); +log('2.0 module works: add(3, 4) = ' + instance.instance.exports.add(3, 4));` + }, + "multi-value": { + label: "Multi-Value Returns", + group: "Post-MVP", + description: "Functions returning multiple values at once.", + target: "2.0", + features: ["multi-value"], + code: `// Multi-value: functions can return more than one value +const mod = new webasmjs.ModuleBuilder('multiValue'); + +// divmod returns both quotient and remainder +mod.defineFunction('divmod', [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const dividend = f.getParameter(0); + const divisor = f.getParameter(1); + + // Push quotient + a.get_local(dividend); + a.get_local(divisor); + a.div_s_i32(); + + // Push remainder + a.get_local(dividend); + a.get_local(divisor); + a.rem_s_i32(); }).withExport(); -// i32 to i64 (sign extend) -mod.defineFunction('i32_to_i64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int32], (f, a) => { - a.get_local(f.getParameter(0)); - a.extend_i32_s_i64(); +const instance = await mod.instantiate(); +const divmod = instance.instance.exports.divmod; + +log('Multi-value returns (quotient, remainder):'); +for (const [a, b] of [[17, 5], [100, 7], [42, 6], [99, 10]]) { + const result = divmod(a, b); + log(' ' + a + ' / ' + b + ' = ' + result); +}` + }, + "mutable-global-export": { + label: "Mutable Global Export", + group: "Post-MVP", + description: "Export a mutable global, read from JavaScript.", + target: "2.0", + features: ["mutable-globals"], + code: `// Mutable global export: JS can read the global's value +const mod = new webasmjs.ModuleBuilder('mutGlobal'); + +const counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0); +mod.exportGlobal(counter, 'counter'); + +mod.defineFunction('increment', null, [], (f, a) => { + a.get_global(counter); + a.const_i32(1); + a.add_i32(); + a.set_global(counter); }).withExport(); -// i64 to i32 (wrap) -mod.defineFunction('i64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int64], (f, a) => { +mod.defineFunction('add', null, [webasmjs.ValueType.Int32], (f, a) => { + a.get_global(counter); a.get_local(f.getParameter(0)); - a.wrap_i64_i32(); + a.add_i32(); + a.set_global(counter); }).withExport(); -// f32 to f64 (promote) -mod.defineFunction('f32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float32], (f, a) => { +const instance = await mod.instantiate(); +const { increment, add, counter: g } = instance.instance.exports; + +log('Initial: ' + g.value); +increment(); +increment(); +increment(); +log('After 3 increments: ' + g.value); +add(10); +log('After add(10): ' + g.value); +add(-5); +log('After add(-5): ' + g.value);` + }, + "tail-call": { + label: "Tail Calls", + group: "Post-MVP", + description: "Tail-recursive factorial \u2014 no stack overflow.", + target: "3.0", + features: ["tail-call"], + code: `// Tail calls: return_call reuses the current frame +const mod = new webasmjs.ModuleBuilder('tailCall'); + +// Tail-recursive helper: fact_helper(n, acc) +const helper = mod.defineFunction('fact_helper', [webasmjs.ValueType.Int64], + [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => { + const n = f.getParameter(0); + const acc = f.getParameter(1); + + // Base case: n <= 1 + a.get_local(n); + a.const_i64(1n); + a.le_s_i64(); + a.if(webasmjs.BlockType.Void, () => { + a.get_local(acc); + a.return(); + }); + + // Tail call: return_call fact_helper(n-1, n*acc) + a.get_local(n); + a.const_i64(1n); + a.sub_i64(); + a.get_local(n); + a.get_local(acc); + a.mul_i64(); + a.return_call(helper); +}); + +// Public entry: factorial(n) +mod.defineFunction('factorial', [webasmjs.ValueType.Int64], + [webasmjs.ValueType.Int64], (f, a) => { a.get_local(f.getParameter(0)); - a.promote_f32_f64(); + a.const_i64(1n); + a.call(helper); }).withExport(); const instance = await mod.instantiate(); -const { i32_to_f64, f64_to_i32, i32_to_i64, i64_to_i32, f32_to_f64 } = instance.instance.exports; +const factorial = instance.instance.exports.factorial; -log('i32(42) \u2192 f64: ' + i32_to_f64(42)); -log('f64(3.14) \u2192 i32: ' + f64_to_i32(3.14)); -log('f64(99.9) \u2192 i32: ' + f64_to_i32(99.9)); -log('i32(42) \u2192 i64: ' + i32_to_i64(42)); -log('i32(-1) \u2192 i64: ' + i32_to_i64(-1)); -log('i64(0x1FFFFFFFFn) \u2192 i32: ' + i64_to_i32(0x1FFFFFFFFn)); -log('f32(3.14) \u2192 f64: ' + f32_to_f64(3.140000104904175));` +log('Tail-recursive factorial (i64):'); +for (let n = 0n; n <= 20n; n++) { + log(' ' + n + '! = ' + factorial(n)); +} +log(''); +log('No stack overflow \u2014 return_call reuses the frame!');` }, - // ─── Algorithms ─── - "bubble-sort": { - label: "Bubble Sort", - group: "Algorithms", - code: `// Bubble sort in WASM memory -const mod = new webasmjs.ModuleBuilder('bubbleSort'); -mod.defineMemory(1); + "shared-memory": { + label: "Shared Memory", + group: "Post-MVP", + description: "Shared memory with atomic load/store/add.", + target: "3.0", + features: ["threads"], + code: `// Shared memory + atomic operations +const mod = new webasmjs.ModuleBuilder('atomics'); + +// Shared memory requires both initial and maximum +const mem = mod.defineMemory(1, 10, true); // shared=true +mod.exportMemory(mem, 'memory'); -// Store i32 at index (index * 4) -mod.defineFunction('set', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { +// Atomic store +mod.defineFunction('atomicStore', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.const_i32(4); - a.mul_i32(); a.get_local(f.getParameter(1)); - a.store_i32(2, 0); + a.atomic_store_i32(2, 0); }).withExport(); -// Load i32 at index -mod.defineFunction('get', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { +// Atomic load +mod.defineFunction('atomicLoad', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.const_i32(4); - a.mul_i32(); - a.load_i32(2, 0); + a.atomic_load_i32(2, 0); }).withExport(); -const setFn = mod._functions[0]; -const getFn = mod._functions[1]; +// Atomic add (returns old value) +mod.defineFunction('atomicAdd', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_add_i32(2, 0); +}).withExport(); -// Bubble sort(length) -mod.defineFunction('sort', null, [webasmjs.ValueType.Int32], (f, a) => { - const len = f.getParameter(0); - const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); - const j = a.declareLocal(webasmjs.ValueType.Int32, 'j'); - const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp'); - const swapped = a.declareLocal(webasmjs.ValueType.Int32, 'swapped'); +// Atomic compare-and-swap +mod.defineFunction('atomicCAS', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // address + a.get_local(f.getParameter(1)); // expected + a.get_local(f.getParameter(2)); // replacement + a.atomic_rmw_cmpxchg_i32(2, 0); +}).withExport(); - a.const_i32(0); - a.set_local(i); +const instance = await mod.instantiate(); +const { atomicStore, atomicLoad, atomicAdd, atomicCAS } = instance.instance.exports; - // Outer loop - a.loop(webasmjs.BlockType.Void, (outerLoop) => { - a.block(webasmjs.BlockType.Void, (outerBreak) => { - a.get_local(i); - a.get_local(len); - a.const_i32(1); - a.sub_i32(); - a.ge_i32(); - a.br_if(outerBreak); +log('=== Atomic Operations ==='); +atomicStore(0, 100); +log('atomicStore(0, 100)'); +log('atomicLoad(0) = ' + atomicLoad(0)); - a.const_i32(0); - a.set_local(swapped); - a.const_i32(0); - a.set_local(j); +log(''); +const old1 = atomicAdd(0, 5); +log('atomicAdd(0, 5) returned old value: ' + old1); +log('atomicLoad(0) = ' + atomicLoad(0)); - // Inner loop - a.loop(webasmjs.BlockType.Void, (innerLoop) => { - a.block(webasmjs.BlockType.Void, (innerBreak) => { - a.get_local(j); - a.get_local(len); - a.const_i32(1); - a.sub_i32(); - a.get_local(i); - a.sub_i32(); - a.ge_i32(); - a.br_if(innerBreak); +const old2 = atomicAdd(0, 10); +log('atomicAdd(0, 10) returned old value: ' + old2); +log('atomicLoad(0) = ' + atomicLoad(0)); - // if arr[j] > arr[j+1], swap - a.get_local(j); - a.call(getFn); - a.get_local(j); - a.const_i32(1); - a.add_i32(); - a.call(getFn); - a.gt_i32(); - a.if(webasmjs.BlockType.Void, () => { - // temp = arr[j] - a.get_local(j); - a.call(getFn); - a.set_local(temp); - // arr[j] = arr[j+1] - a.get_local(j); - a.get_local(j); - a.const_i32(1); - a.add_i32(); - a.call(getFn); - a.call(setFn); - // arr[j+1] = temp - a.get_local(j); - a.const_i32(1); - a.add_i32(); - a.get_local(temp); - a.call(setFn); - a.const_i32(1); - a.set_local(swapped); - }); +log(''); +log('=== Compare-and-Swap ==='); +const cas1 = atomicCAS(0, 115, 200); +log('atomicCAS(0, 115, 200) = ' + cas1 + ' (matched, swapped)'); +log('atomicLoad(0) = ' + atomicLoad(0)); - a.get_local(j); - a.const_i32(1); - a.add_i32(); - a.set_local(j); - a.br(innerLoop); - }); - }); +const cas2 = atomicCAS(0, 999, 300); +log('atomicCAS(0, 999, 300) = ' + cas2 + ' (no match, not swapped)'); +log('atomicLoad(0) = ' + atomicLoad(0));` + }, + "exception-handling": { + label: "Exception Handling", + group: "Post-MVP", + description: "Define tags and throw exceptions from WASM.", + target: "3.0", + features: ["exception-handling"], + code: `// Exception handling: defineTag + throw +const mod = new webasmjs.ModuleBuilder('exceptions', { disableVerification: true }); - // Early exit if no swaps - a.get_local(swapped); - a.eqz_i32(); - a.br_if(outerBreak); +// Define a tag with an i32 payload (like an error code) +const errorTag = mod.defineTag([webasmjs.ValueType.Int32]); - a.get_local(i); - a.const_i32(1); - a.add_i32(); - a.set_local(i); - a.br(outerLoop); - }); +// Throws when input is negative +mod.defineFunction('checkPositive', null, [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(0); + a.lt_s_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.get_local(f.getParameter(0)); + a.throw(errorTag._index); }); }).withExport(); -const instance = await mod.instantiate(); -const { set, get, sort } = instance.instance.exports; +// Show the WAT output with tag and throw +const wat = mod.toString(); +log('=== WAT Output ==='); +log(wat); -const data = [64, 34, 25, 12, 22, 11, 90, 1, 55, 42]; -log('Before: ' + data.join(', ')); +// Compile to bytes +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer));` + }, + "memory64": { + label: "Memory64", + group: "Post-MVP", + description: "64-bit addressed memory for very large address spaces.", + target: "3.0", + features: ["memory64"], + code: `// Memory64: 64-bit addressed memory +const mod = new webasmjs.ModuleBuilder('memory64'); + +// Define a 64-bit addressed memory +const mem = mod.defineMemory(1, 100, false, true); // memory64=true +mod.exportMemory(mem, 'memory'); -data.forEach((v, i) => set(i, v)); -sort(data.length); +// Store: address is i64 for memory64 +mod.defineFunction('store64', null, + [webasmjs.ValueType.Int64, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // i64 address + a.get_local(f.getParameter(1)); // i32 value + a.store_i32(2, 0); +}).withExport(); -const sorted = []; -for (let i = 0; i < data.length; i++) sorted.push(get(i)); -log('After: ' + sorted.join(', '));` +// Load: address is i64 for memory64 +mod.defineFunction('load64', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); // i64 address + a.load_i32(2, 0); +}).withExport(); + +// Show the WAT \u2014 note i64 addresses +const wat = mod.toString(); +log('=== WAT Output (memory64) ==='); +log(wat); + +// Compile +const bytes = mod.toBytes(); +log(''); +log('Module compiled: ' + bytes.length + ' bytes'); +log(''); +log('Note: memory64 uses i64 addresses instead of i32.'); +log('Runtime instantiation requires engine support for memory64.');` }, - "gcd": { - label: "GCD (Euclidean)", - group: "Algorithms", - code: `// Greatest common divisor \u2014 Euclidean algorithm -const mod = new webasmjs.ModuleBuilder('gcd'); + // ─── Debug & Inspection ─── + "debug-names": { + label: "Debug Name Section", + group: "Debug", + description: "Inspect function, local, and global names in the binary.", + target: "mvp", + features: [], + code: `// Inspect the debug name section in the binary +const mod = new webasmjs.ModuleBuilder('debugExample'); -mod.defineFunction('gcd', [webasmjs.ValueType.Int32], +const g = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0); +g.withName('counter'); + +mod.defineFunction('add', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { - const x = f.getParameter(0); - const y = f.getParameter(1); + f.getParameter(0).withName('x'); + f.getParameter(1).withName('y'); + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_i32(); +}).withExport(); + +mod.defineFunction('addThree', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + f.getParameter(0).withName('a'); + f.getParameter(1).withName('b'); + f.getParameter(2).withName('c'); const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp'); + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_i32(); + a.get_local(f.getParameter(2)); + a.add_i32(); +}).withExport(); - a.loop(webasmjs.BlockType.Void, (loopLabel) => { - a.block(webasmjs.BlockType.Void, (breakLabel) => { - a.get_local(y); - a.eqz_i32(); - a.br_if(breakLabel); +const bytes = mod.toBytes(); - // temp = y - a.get_local(y); - a.set_local(temp); - // y = x % y - a.get_local(x); - a.get_local(y); - a.rem_i32_u(); - a.set_local(y); - // x = temp - a.get_local(temp); - a.set_local(x); +log('Binary size: ' + bytes.length + ' bytes'); +log(''); - a.br(loopLabel); - }); - }); +// Read back the name section +const reader = new webasmjs.BinaryReader(bytes); +const info = reader.read(); +const ns = info.nameSection; - a.get_local(x); -}).withExport(); +if (ns) { + log('Module name: ' + ns.moduleName); + log(''); -const instance = await mod.instantiate(); -const { gcd } = instance.instance.exports; + if (ns.functionNames) { + log('Function names:'); + ns.functionNames.forEach((name, idx) => { + log(' [' + idx + '] ' + name); + }); + } -const pairs = [[12, 8], [100, 75], [17, 13], [48, 18], [0, 5], [7, 0], [1071, 462]]; -for (const [a, b] of pairs) { - log('gcd(' + a + ', ' + b + ') = ' + gcd(a, b)); + if (ns.localNames) { + log(''); + log('Local/parameter names:'); + ns.localNames.forEach((locals, funcIdx) => { + const funcName = ns.functionNames?.get(funcIdx) || 'func' + funcIdx; + log(' ' + funcName + ':'); + locals.forEach((name, localIdx) => { + log(' [' + localIdx + '] ' + name); + }); + }); + } + + if (ns.globalNames) { + log(''); + log('Global names:'); + ns.globalNames.forEach((name, idx) => { + log(' [' + idx + '] ' + name); + }); + } +} else { + log('No name section found!'); }` }, - "collatz": { - label: "Collatz Conjecture", - group: "Algorithms", - code: `// Collatz conjecture \u2014 count steps to reach 1 -const mod = new webasmjs.ModuleBuilder('collatz'); + "binary-inspect": { + label: "Binary Inspector", + group: "Debug", + description: "Read back the binary structure \u2014 types, functions, exports.", + target: "mvp", + features: [], + code: `// Inspect the binary structure of a WASM module +const mod = new webasmjs.ModuleBuilder('inspect'); +mod.defineMemory(1); -mod.defineFunction('collatz', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { - const n = f.getParameter(0); - const steps = a.declareLocal(webasmjs.ValueType.Int32, 'steps'); +const counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0); - a.const_i32(0); - a.set_local(steps); +mod.defineFunction('add', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_i32(); +}).withExport(); + +mod.defineFunction('noop', null, [], (f, a) => { + a.nop(); +}).withExport(); + +const bytes = mod.toBytes(); + +log('=== Binary Analysis ==='); +log('Total size: ' + bytes.length + ' bytes'); +log(''); - a.loop(webasmjs.BlockType.Void, (loopLabel) => { - a.block(webasmjs.BlockType.Void, (breakLabel) => { - a.get_local(n); - a.const_i32(1); - a.le_i32(); - a.br_if(breakLabel); +// Read with BinaryReader +const reader = new webasmjs.BinaryReader(bytes); +const info = reader.read(); - a.get_local(steps); - a.const_i32(1); - a.add_i32(); - a.set_local(steps); +log('WASM version: ' + info.version); +log('Types: ' + info.types.length); +info.types.forEach((t, i) => { + const params = t.parameterTypes.map(p => p.name).join(', '); + const results = t.returnTypes.map(r => r.name).join(', '); + log(' [' + i + '] (' + params + ') -> (' + results + ')'); +}); - // if n is odd: n = 3n + 1, else: n = n / 2 - a.get_local(n); - a.const_i32(1); - a.and_i32(); - a.if(webasmjs.BlockType.Void); - // odd: n = 3n + 1 - a.get_local(n); - a.const_i32(3); - a.mul_i32(); - a.const_i32(1); - a.add_i32(); - a.set_local(n); - a.else(); - // even: n = n / 2 - a.get_local(n); - a.const_i32(1); - a.shr_i32_u(); - a.set_local(n); - a.end(); +log('Functions: ' + info.functions.length); +info.functions.forEach((f, i) => { + log(' [' + i + '] type=' + f.typeIndex + ', locals=' + f.locals.length + ', body=' + f.body.length + ' bytes'); +}); - a.br(loopLabel); - }); - }); +log('Memories: ' + info.memories.length); +info.memories.forEach((m, i) => { + log(' [' + i + '] initial=' + m.initial + ' pages (' + (m.initial * 64) + ' KB)'); +}); - a.get_local(steps); -}).withExport(); +log('Globals: ' + info.globals.length); +info.globals.forEach((g, i) => { + log(' [' + i + '] mutable=' + g.mutable); +}); -const instance = await mod.instantiate(); -const { collatz } = instance.instance.exports; +log('Exports: ' + info.exports.length); +info.exports.forEach((e) => { + const kinds = ['function', 'table', 'memory', 'global']; + log(' "' + e.name + '" -> ' + (kinds[e.kind] || 'unknown') + '[' + e.index + ']'); +}); -for (const n of [1, 2, 3, 6, 7, 9, 27, 97, 871]) { - log('collatz(' + n + ') = ' + collatz(n) + ' steps'); -}` +log(''); +log('Valid: ' + WebAssembly.validate(bytes.buffer));` }, - "is-prime": { - label: "Primality Test", - group: "Algorithms", - code: `// Primality test \u2014 trial division -const mod = new webasmjs.ModuleBuilder('prime'); + "wat-roundtrip": { + label: "WAT Roundtrip", + group: "Debug", + description: "Build a module, emit WAT, parse it back, and verify.", + target: "mvp", + features: [], + code: `// Build a module programmatically, inspect WAT, parse it back +const mod = new webasmjs.ModuleBuilder('roundtrip'); -mod.defineFunction('isPrime', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { - const n = f.getParameter(0); - const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); +mod.defineFunction('multiply', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.mul_i32(); +}).withExport(); - // n <= 1 \u2192 not prime - a.get_local(n); - a.const_i32(1); - a.le_i32(); - a.if(webasmjs.BlockType.Void, () => { - a.const_i32(0); - a.return(); - }); +mod.defineFunction('negate', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.const_i32(0); + a.get_local(f.getParameter(0)); + a.sub_i32(); +}).withExport(); - // n <= 3 \u2192 prime - a.get_local(n); - a.const_i32(3); - a.le_i32(); - a.if(webasmjs.BlockType.Void, () => { - a.const_i32(1); - a.return(); - }); +// Get WAT text +const watText = mod.toString(); +log('=== Generated WAT ==='); +log(watText); - // divisible by 2 \u2192 not prime - a.get_local(n); - a.const_i32(2); - a.rem_i32_u(); - a.eqz_i32(); - a.if(webasmjs.BlockType.Void, () => { - a.const_i32(0); - a.return(); - }); +// Parse it back +log(''); +log('=== Parsing WAT back... ==='); +const mod2 = webasmjs.parseWat(watText); - // Trial division from 3 to sqrt(n) - a.const_i32(3); - a.set_local(i); +// Instantiate and test +const instance = await mod2.instantiate(); +const { multiply, negate } = instance.instance.exports; - a.loop(webasmjs.BlockType.Void, (loopLabel) => { - a.block(webasmjs.BlockType.Void, (breakLabel) => { - // if i * i > n, break (is prime) - a.get_local(i); - a.get_local(i); - a.mul_i32(); - a.get_local(n); - a.gt_i32(); - a.br_if(breakLabel); +log('multiply(6, 7) = ' + multiply(6, 7)); +log('multiply(100, -3) = ' + multiply(100, -3)); +log('negate(42) = ' + negate(42)); +log('negate(-10) = ' + negate(-10)); +log(''); +log('Roundtrip successful!');` + }, + "custom-section": { + label: "Custom Section", + group: "Debug", + description: "Add custom metadata to a module and read it back.", + target: "mvp", + features: [], + code: `// Custom section \u2014 embed arbitrary metadata in the binary +const mod = new webasmjs.ModuleBuilder('customSec'); - // if n % i == 0, not prime - a.get_local(n); - a.get_local(i); - a.rem_i32_u(); - a.eqz_i32(); - a.if(webasmjs.BlockType.Void, () => { - a.const_i32(0); - a.return(); - }); +mod.defineFunction('nop', null, [], (f, a) => { + a.nop(); +}).withExport(); - a.get_local(i); - a.const_i32(2); - a.add_i32(); - a.set_local(i); - a.br(loopLabel); - }); - }); +// Add custom sections with metadata +const version = new TextEncoder().encode('1.0.0'); +mod.defineCustomSection('version', new Uint8Array(version)); - a.const_i32(1); -}).withExport(); +const author = new TextEncoder().encode('webasmjs playground'); +mod.defineCustomSection('author', new Uint8Array(author)); -const instance = await mod.instantiate(); -const { isPrime } = instance.instance.exports; +const bytes = mod.toBytes(); +log('Module size: ' + bytes.length + ' bytes'); -log('Prime numbers up to 100:'); -const primes = []; -for (let n = 2; n <= 100; n++) { - if (isPrime(n)) primes.push(n); +// Read it back with BinaryReader +const reader = new webasmjs.BinaryReader(bytes); +const info = reader.read(); + +log(''); +log('Custom sections found:'); +if (info.customSections) { + for (const sec of info.customSections) { + const text = new TextDecoder().decode(sec.data); + log(' "' + sec.name + '" = "' + text + '" (' + sec.data.length + ' bytes)'); + } +} else { + log(' (none found \u2014 BinaryReader may not expose custom sections)'); } -log(primes.join(', ')); + log(''); -log('Testing larger numbers:'); -for (const n of [997, 1000, 7919, 7920, 104729]) { - log(n + ' is ' + (isPrime(n) ? 'prime' : 'not prime')); -}` +log('The binary is still valid WASM:'); +log(' WebAssembly.validate() = ' + WebAssembly.validate(bytes.buffer));` }, - // ─── WAT Parser ─── - "wat-parser": { - label: "WAT Parser", - group: "WAT", - code: `// Parse WAT text and instantiate -const watSource = \` -(module $parsed - (func $add (param i32) (param i32) (result i32) - local.get 0 - local.get 1 - i32.add - ) - (export "add" (func $add)) -) -\`; + "extended-const": { + label: "Extended Constants", + group: "Post-MVP", + description: "Arithmetic in global init expressions with extended-const.", + target: "3.0", + features: ["extended-const"], + code: `// Extended constants: arithmetic in global initializers +const mod = new webasmjs.ModuleBuilder('extConst', { + target: 'mvp', + features: ['extended-const'], +}); -log('Parsing WAT source...'); -const mod = webasmjs.parseWat(watSource); -log('WAT parsed successfully!'); -log(''); +// Base offset as an immutable global +const base = mod.defineGlobal(webasmjs.ValueType.Int32, false, 100); -const instance = await mod.instantiate(); -const add = instance.instance.exports.add; -log('add(3, 4) = ' + add(3, 4)); -log('add(100, 200) = ' + add(100, 200)); -log('add(-5, 10) = ' + add(-5, 10));` - }, - "wat-loop": { - label: "WAT Loop & Branch", - group: "WAT", - code: `// WAT with loop and branch instructions -const watSource = \` -(module $loops - (func $sum (param i32) (result i32) - (local i32) ;; accumulator - (local i32) ;; counter - i32.const 0 - local.set 1 - i32.const 1 - local.set 2 - block $break - loop $continue - local.get 2 - local.get 0 - i32.gt_s - br_if $break +// Computed global: base + 50 (uses i32.add in init expression) +const offset1 = mod.defineGlobal(webasmjs.ValueType.Int32, false, (asm) => { + asm.get_global(base); + asm.const_i32(50); + asm.add_i32(); +}); - local.get 1 - local.get 2 - i32.add - local.set 1 +// Computed global: base * 3 (uses i32.mul in init expression) +const scaled = mod.defineGlobal(webasmjs.ValueType.Int32, false, (asm) => { + asm.get_global(base); + asm.const_i32(3); + asm.mul_i32(); +}); - local.get 2 - i32.const 1 - i32.add - local.set 2 - br $continue - end - end - local.get 1 - ) - (export "sum" (func $sum)) -) -\`; +// Computed global: base * 2 + 7 +const combined = mod.defineGlobal(webasmjs.ValueType.Int32, false, (asm) => { + asm.get_global(base); + asm.const_i32(2); + asm.mul_i32(); + asm.const_i32(7); + asm.add_i32(); +}); + +mod.defineFunction('getBase', [webasmjs.ValueType.Int32], [], (f, a) => { + a.get_global(base); +}).withExport(); + +mod.defineFunction('getOffset1', [webasmjs.ValueType.Int32], [], (f, a) => { + a.get_global(offset1); +}).withExport(); + +mod.defineFunction('getScaled', [webasmjs.ValueType.Int32], [], (f, a) => { + a.get_global(scaled); +}).withExport(); + +mod.defineFunction('getCombined', [webasmjs.ValueType.Int32], [], (f, a) => { + a.get_global(combined); +}).withExport(); -const mod = webasmjs.parseWat(watSource); const instance = await mod.instantiate(); -const sum = instance.instance.exports.sum; +const { getBase, getOffset1, getScaled, getCombined } = instance.instance.exports; -log('Sum from 1 to N:'); -for (const n of [0, 1, 5, 10, 50, 100]) { - log(' sum(' + n + ') = ' + sum(n)); -}` +log('Extended-const: arithmetic in global init expressions'); +log('base = ' + getBase()); +log('base + 50 = ' + getOffset1()); +log('base * 3 = ' + getScaled()); +log('base * 2 + 7 = ' + getCombined());` }, - "wat-memory": { - label: "WAT Memory & Data", - group: "WAT", - code: `// WAT with memory, data segments, and imports -const watSource = \` -(module $memTest - (memory 1) - (func $store (param i32) (param i32) - local.get 0 - local.get 1 - i32.store offset=0 align=4 - ) - (func $load (param i32) (result i32) - local.get 0 - i32.load offset=0 align=4 - ) - (export "store" (func $store)) - (export "load" (func $load)) - (export "mem" (memory 0)) -) -\`; + "multi-memory": { + label: "Multi-Memory", + group: "Post-MVP", + description: "Define and use multiple linear memories in one module.", + target: "3.0", + features: ["multi-memory"], + code: `// Multi-memory: two separate linear memories +const mod = new webasmjs.ModuleBuilder('multiMem', { + target: 'mvp', + features: ['multi-memory'], +}); -const mod = webasmjs.parseWat(watSource); -const instance = await mod.instantiate(); -const { store, load, mem } = instance.instance.exports; +const mem0 = mod.defineMemory(1); +mod.exportMemory(mem0, 'mem0'); +const mem1 = mod.defineMemory(1); +mod.exportMemory(mem1, 'mem1'); -// Store values at various offsets -store(0, 11); -store(4, 22); -store(8, 33); -store(12, 44); +// Store to memory 0 +mod.defineFunction('store0', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0, 0); // memIndex=0 +}).withExport(); -log('Memory contents:'); -for (let addr = 0; addr < 16; addr += 4) { - log(' [' + addr + '] = ' + load(addr)); -} +// Load from memory 0 +mod.defineFunction('load0', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0, 0); // memIndex=0 +}).withExport(); -// Also inspect raw memory -const view = new Uint8Array(mem.buffer); -log(''); -log('Raw bytes [0..15]: ' + Array.from(view.slice(0, 16)).join(', '));` +// Store to memory 1 +mod.defineFunction('store1', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0, 1); // memIndex=1 +}).withExport(); + +// Load from memory 1 +mod.defineFunction('load1', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0, 1); // memIndex=1 +}).withExport(); + +// Show WAT with two memories +const wat = mod.toString(); +log('=== WAT Output ==='); +log(wat); + +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer));` }, - "wat-global": { - label: "WAT Globals & Start", - group: "WAT", - code: `// WAT with globals, start function, and if/else -const watSource = \` -(module $globalDemo - (global $counter (mut i32) (i32.const 0)) + "multi-table": { + label: "Multi-Table", + group: "Post-MVP", + description: "Define multiple function tables and dispatch through each.", + target: "3.0", + features: ["multi-table"], + code: `// Multi-table: two function tables for different dispatch +const mod = new webasmjs.ModuleBuilder('multiTable', { + target: 'mvp', + features: ['multi-table'], +}); - (func $init - i32.const 100 - global.set 0 - ) +const add = mod.defineFunction('add', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_i32(); +}); - (func $inc (result i32) - global.get 0 - i32.const 1 - i32.add - global.set 0 - global.get 0 - ) +const sub = mod.defineFunction('sub', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.sub_i32(); +}); - (func $dec (result i32) - global.get 0 - i32.const 1 - i32.sub - global.set 0 - global.get 0 - ) +const mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.mul_i32(); +}); - (func $getCounter (result i32) - global.get 0 - ) +// Table 0: math operations +const table0 = mod.defineTable(webasmjs.ElementType.AnyFunc, 3); +mod.defineTableSegment(table0, [add, sub, mul], 0); - (start $init) - (export "inc" (func $inc)) - (export "dec" (func $dec)) - (export "getCounter" (func $getCounter)) -) -\`; +// Table 1: just add and mul (different arrangement) +const table1 = mod.defineTable(webasmjs.ElementType.AnyFunc, 2); +mod.defineTableSegment(table1, [mul, add], 0); -const mod = webasmjs.parseWat(watSource); -const instance = await mod.instantiate(); -const { inc, dec, getCounter } = instance.instance.exports; +// Show WAT with two tables +const wat = mod.toString(); +log('=== WAT Output (multi-table) ==='); +log(wat); -log('Initial (set by start): ' + getCounter()); -log('inc() = ' + inc()); -log('inc() = ' + inc()); -log('inc() = ' + inc()); -log('dec() = ' + dec()); -log('Final: ' + getCounter());` +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer));` }, - // ─── SIMD ─── - "simd-vec-add": { - label: "SIMD Vector Add", - group: "SIMD", - code: `// SIMD: add two f32x4 vectors in memory -const mod = new webasmjs.ModuleBuilder('simdAdd', { disableVerification: true }); + "relaxed-simd": { + label: "Relaxed SIMD", + group: "Post-MVP", + description: "Relaxed SIMD operations for performance-sensitive code.", + target: "latest", + features: ["relaxed-simd"], + code: `// Relaxed SIMD: relaxed_madd for fused multiply-add +const mod = new webasmjs.ModuleBuilder('relaxedSimd'); mod.defineMemory(1); -// vec4_add(srcA, srcB, dst) \u2014 adds two 4-float vectors -mod.defineFunction('vec4_add', null, - [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { - a.get_local(f.getParameter(2)); // push dest address first +// relaxed_madd: a * b + c (fused multiply-add, may use FMA instruction) +mod.defineFunction('madd_f32x4', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, + webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(3)); // dest address a.get_local(f.getParameter(0)); - a.load_v128(2, 0); + a.load_v128(2, 0); // load A a.get_local(f.getParameter(1)); - a.load_v128(2, 0); - a.add_f32x4(); - a.store_v128(2, 0); // store expects [addr, value] on stack + a.load_v128(2, 0); // load B + a.get_local(f.getParameter(2)); + a.load_v128(2, 0); // load C + a.relaxed_madd_f32x4(); // A * B + C + a.store_v128(2, 0); }).withExport(); mod.defineFunction('setF32', null, @@ -10161,460 +13502,915 @@ mod.defineFunction('getF32', [webasmjs.ValueType.Float32], a.load_f32(2, 0); }).withExport(); +// Show WAT +const wat = mod.toString(); +log('=== WAT Output (relaxed SIMD) ==='); +log(wat); + +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer));` + }, + "atomic-rmw": { + label: "Atomic RMW Ops", + group: "Post-MVP", + description: "Atomic read-modify-write: sub, and, or, xor, exchange.", + target: "3.0", + features: ["threads"], + code: `// Atomic read-modify-write operations +const mod = new webasmjs.ModuleBuilder('atomicRMW'); + +// Shared memory for atomics +const mem = mod.defineMemory(1, 10, true); +mod.exportMemory(mem, 'memory'); + +// Atomic store +mod.defineFunction('store', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_store_i32(2, 0); +}).withExport(); + +// Atomic load +mod.defineFunction('load', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.atomic_load_i32(2, 0); +}).withExport(); + +// Atomic sub (returns old value) +mod.defineFunction('atomicSub', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_sub_i32(2, 0); +}).withExport(); + +// Atomic AND (returns old value) +mod.defineFunction('atomicAnd', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_and_i32(2, 0); +}).withExport(); + +// Atomic OR (returns old value) +mod.defineFunction('atomicOr', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_or_i32(2, 0); +}).withExport(); + +// Atomic XOR (returns old value) +mod.defineFunction('atomicXor', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_xor_i32(2, 0); +}).withExport(); + +// Atomic exchange (returns old value, stores new) +mod.defineFunction('atomicXchg', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_xchg_i32(2, 0); +}).withExport(); + const instance = await mod.instantiate(); -const { vec4_add, setF32, getF32 } = instance.instance.exports; +const { store, load, atomicSub, atomicAnd, atomicOr, atomicXor, atomicXchg } = instance.instance.exports; -// A = [1, 2, 3, 4] at offset 0 -// B = [10, 20, 30, 40] at offset 16 -for (let i = 0; i < 4; i++) { - setF32(i * 4, i + 1); - setF32(16 + i * 4, (i + 1) * 10); -} +log('=== Atomic Read-Modify-Write ==='); +log('All RMW ops return the OLD value before modification.'); +log(''); -vec4_add(0, 16, 32); +// Sub +store(0, 100); +const oldSub = atomicSub(0, 30); +log('atomicSub(100, 30): old=' + oldSub + ', new=' + load(0)); -log('A = [1, 2, 3, 4]'); -log('B = [10, 20, 30, 40]'); -log('A + B:'); -for (let i = 0; i < 4; i++) { - log(' [' + i + '] = ' + getF32(32 + i * 4)); -}` +// AND +store(0, 0xFF); +const oldAnd = atomicAnd(0, 0x0F); +log('atomicAnd(0xFF, 0x0F): old=0x' + (oldAnd >>> 0).toString(16) + ', new=0x' + (load(0) >>> 0).toString(16)); + +// OR +store(0, 0xF0); +const oldOr = atomicOr(0, 0x0F); +log('atomicOr(0xF0, 0x0F): old=0x' + (oldOr >>> 0).toString(16) + ', new=0x' + (load(0) >>> 0).toString(16)); + +// XOR +store(0, 0xFF); +const oldXor = atomicXor(0, 0xAA); +log('atomicXor(0xFF, 0xAA): old=0x' + (oldXor >>> 0).toString(16) + ', new=0x' + (load(0) >>> 0).toString(16)); + +// Exchange +store(0, 42); +const oldXchg = atomicXchg(0, 99); +log('atomicXchg(42, 99): old=' + oldXchg + ', new=' + load(0));` }, - "simd-dot-product": { - label: "SIMD Dot Product", + "atomic-wait-notify": { + label: "Wait & Notify", + group: "Post-MVP", + description: "Atomic wait/notify primitives and memory fence.", + target: "3.0", + features: ["threads"], + code: `// Atomic wait, notify, and fence \u2014 thread synchronization primitives +const mod = new webasmjs.ModuleBuilder('waitNotify', { disableVerification: true }); + +const mem = mod.defineMemory(1, 10, true); +mod.exportMemory(mem, 'memory'); + +// atomic.wait32(addr, expected, timeout) -> 0=ok, 1=not-equal, 2=timed-out +mod.defineFunction('wait32', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); // address + a.get_local(f.getParameter(1)); // expected value + a.get_local(f.getParameter(2)); // timeout in ns (-1 = infinite) + a.atomic_wait32(2, 0); +}).withExport(); + +// atomic.notify(addr, count) -> number of waiters woken +mod.defineFunction('notify', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // address + a.get_local(f.getParameter(1)); // count of waiters to wake + a.atomic_notify(2, 0); +}).withExport(); + +// atomic.fence \u2014 full memory barrier +mod.defineFunction('fence', null, [], (f, a) => { + a.atomic_fence(0); +}).withExport(); + +// Atomic store for setup +mod.defineFunction('store', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_store_i32(2, 0); +}).withExport(); + +// Show the WAT output +const wat = mod.toString(); +log('=== WAT Output (wait/notify/fence) ==='); +log(wat); + +// Compile and validate +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer)); +log(''); +log('Note: atomic.wait blocks the calling thread until notified.'); +log('In a multi-threaded setup:'); +log(' Thread A: wait32(addr, 0, -1n) // sleep until value changes'); +log(' Thread B: store(addr, 1); notify(addr, 1) // wake thread A'); +log(' fence() ensures memory operations are visible across threads.');` + }, + // ─── Additional SIMD ─── + "simd-integer": { + label: "SIMD Integer Ops", group: "SIMD", - code: `// SIMD dot product: multiply element-wise then sum lanes -const mod = new webasmjs.ModuleBuilder('simdDot', { disableVerification: true }); + description: "Integer SIMD: i32x4 add, sub, mul, comparisons, and lane ops.", + target: "3.0", + features: ["simd"], + code: `// Integer SIMD: i32x4 arithmetic, comparisons, lane extract/replace +const mod = new webasmjs.ModuleBuilder('simdInt'); mod.defineMemory(1); -mod.defineFunction('dot4', [webasmjs.ValueType.Float32], - [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { - const products = a.declareLocal(webasmjs.ValueType.V128, 'products'); +// Add two i32x4 vectors +mod.defineFunction('add_i32x4', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.add_i32x4(); + a.store_v128(2, 0); +}).withExport(); +// Element-wise min (signed) +mod.defineFunction('min_s_i32x4', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); a.get_local(f.getParameter(0)); a.load_v128(2, 0); a.get_local(f.getParameter(1)); a.load_v128(2, 0); - a.mul_f32x4(); - a.set_local(products); + a.min_s_i32x4(); + a.store_v128(2, 0); +}).withExport(); - // Sum all 4 lanes - a.get_local(products); - a.extract_lane_f32x4(0); - a.get_local(products); - a.extract_lane_f32x4(1); - a.add_f32(); - a.get_local(products); - a.extract_lane_f32x4(2); - a.add_f32(); - a.get_local(products); - a.extract_lane_f32x4(3); - a.add_f32(); +// Extract a single lane +mod.defineFunction('extract', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + // Load vector, extract lane based on index using a br_table + // For simplicity, extract lane 0 from the vector at the address + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.extract_lane_i32x4(0); }).withExport(); -mod.defineFunction('setF32', null, - [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => { +// Splat a scalar to all 4 lanes +mod.defineFunction('splat_i32x4', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // dest + a.get_local(f.getParameter(1)); // scalar + a.splat_i32x4(); + a.store_v128(2, 0); +}).withExport(); + +mod.defineFunction('setI32', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); a.get_local(f.getParameter(1)); - a.store_f32(2, 0); + a.store_i32(2, 0); +}).withExport(); + +mod.defineFunction('getI32', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0); }).withExport(); const instance = await mod.instantiate(); -const { dot4, setF32 } = instance.instance.exports; +const { add_i32x4, min_s_i32x4, extract, splat_i32x4, setI32, getI32 } = instance.instance.exports; -const vecA = [1, 2, 3, 4]; -const vecB = [5, 6, 7, 8]; +// A = [10, 20, 30, 40], B = [5, 25, 15, 45] +const a = [10, 20, 30, 40], b = [5, 25, 15, 45]; +for (let i = 0; i < 4; i++) { setI32(i * 4, a[i]); setI32(16 + i * 4, b[i]); } -for (let i = 0; i < 4; i++) { - setF32(i * 4, vecA[i]); - setF32(16 + i * 4, vecB[i]); -} +add_i32x4(0, 16, 32); +log('A = [' + a + ']'); +log('B = [' + b + ']'); +log('A + B = [' + [getI32(32), getI32(36), getI32(40), getI32(44)] + ']'); -log('A = [' + vecA + ']'); -log('B = [' + vecB + ']'); -log('dot(A, B) = ' + dot4(0, 16)); -log('Expected: ' + (1*5 + 2*6 + 3*7 + 4*8));` +min_s_i32x4(0, 16, 48); +log('min(A, B) = [' + [getI32(48), getI32(52), getI32(56), getI32(60)] + ']'); + +log(''); +log('extract lane 0 of A: ' + extract(0, 0)); + +splat_i32x4(64, 7); +log('splat(7) = [' + [getI32(64), getI32(68), getI32(72), getI32(76)] + ']');` }, - "simd-splat-scale": { - label: "SIMD Splat & Scale", + "simd-shuffle": { + label: "SIMD Shuffle & Swizzle", group: "SIMD", - code: `// SIMD splat: broadcast a scalar to all lanes, then multiply -const mod = new webasmjs.ModuleBuilder('simdScale', { disableVerification: true }); + description: "Rearrange vector lanes with shuffle and swizzle.", + target: "3.0", + features: ["simd"], + code: `// SIMD shuffle & swizzle: rearrange bytes across vectors +const mod = new webasmjs.ModuleBuilder('simdShuffle'); mod.defineMemory(1); -// scale_vec4(src, dst, scalar) \u2014 multiply a vector by a scalar -mod.defineFunction('scale_vec4', null, - [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => { - a.get_local(f.getParameter(1)); // push dest address first +// shuffle: pick 16 bytes from two source vectors by index +// Indices 0-15 = first vector, 16-31 = second vector +mod.defineFunction('interleave', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); // dest + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); // vector A + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); // vector B + // Interleave first 4 bytes: A[0], B[0], A[1], B[1], A[2], B[2], A[3], B[3], ... + a.shuffle_i8x16(new Uint8Array([0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23])); + a.store_v128(2, 0); +}).withExport(); + +// Reverse bytes within a vector using shuffle +mod.defineFunction('reverse', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(1)); // dest a.get_local(f.getParameter(0)); a.load_v128(2, 0); - a.get_local(f.getParameter(2)); - a.splat_f32x4(); // broadcast scalar to all 4 lanes - a.mul_f32x4(); - a.store_v128(2, 0); // store expects [addr, value] on stack + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); // same vector for both operands + a.shuffle_i8x16(new Uint8Array([15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])); + a.store_v128(2, 0); }).withExport(); -mod.defineFunction('setF32', null, - [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => { +// swizzle: rearrange bytes using a dynamic index vector +mod.defineFunction('swizzle', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); // dest a.get_local(f.getParameter(0)); + a.load_v128(2, 0); // data a.get_local(f.getParameter(1)); - a.store_f32(2, 0); + a.load_v128(2, 0); // indices + a.swizzle_i8x16(); + a.store_v128(2, 0); }).withExport(); -mod.defineFunction('getF32', [webasmjs.ValueType.Float32], +mod.defineFunction('setByte', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store8_i32(0, 0); +}).withExport(); + +mod.defineFunction('getByte', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.load_f32(2, 0); + a.load8_i32_u(0, 0); }).withExport(); const instance = await mod.instantiate(); -const { scale_vec4, setF32, getF32 } = instance.instance.exports; +const { interleave, reverse, swizzle, setByte, getByte } = instance.instance.exports; -const vec = [2.0, 4.0, 6.0, 8.0]; -for (let i = 0; i < 4; i++) setF32(i * 4, vec[i]); +// Set up: A = [0,1,2,...,15], B = [16,17,...,31] +for (let i = 0; i < 16; i++) { setByte(i, i); setByte(16 + i, 16 + i); } -scale_vec4(0, 16, 3.0); +interleave(0, 16, 32); +const interleaved = []; +for (let i = 0; i < 16; i++) interleaved.push(getByte(32 + i)); +log('A = [0,1,2,...,15]'); +log('B = [16,17,...,31]'); +log('interleave(A, B) = [' + interleaved.join(', ') + ']'); -log('Vector: [' + vec + ']'); -log('Scalar: 3.0'); -log('Scaled:'); +log(''); +reverse(0, 48); +const reversed = []; +for (let i = 0; i < 16; i++) reversed.push(getByte(48 + i)); +log('reverse(A) = [' + reversed.join(', ') + ']'); + +log(''); +// swizzle: use indices [3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12] to reverse each group of 4 for (let i = 0; i < 4; i++) { - log(' [' + i + '] = ' + getF32(16 + i * 4)); -}` + for (let j = 0; j < 4; j++) setByte(64 + i * 4 + j, i * 4 + (3 - j)); +} +swizzle(0, 64, 80); +const swizzled = []; +for (let i = 0; i < 16; i++) swizzled.push(getByte(80 + i)); +log('swizzle(A, reverse-within-groups) = [' + swizzled.join(', ') + ']');` }, - // ─── Bulk Memory ─── - "bulk-memory": { - label: "Bulk Memory Ops", - group: "Bulk Memory", - code: `// Bulk memory: memory.fill and memory.copy -const mod = new webasmjs.ModuleBuilder('bulkMem'); -const mem = mod.defineMemory(1); -mod.exportMemory(mem, 'memory'); + "simd-widen-narrow": { + label: "SIMD Widen & Narrow", + group: "SIMD", + description: "Convert between vector widths \u2014 narrow i16x8 to i8x16, extend i8x16 to i16x8.", + target: "3.0", + features: ["simd"], + code: `// SIMD widening and narrowing: convert between lane sizes +const mod = new webasmjs.ModuleBuilder('simdWidenNarrow'); +mod.defineMemory(1); -// fill(dest, value, length) -mod.defineFunction('fill', null, +// Narrow two i16x8 vectors into one i8x16 (saturating, unsigned) +mod.defineFunction('narrow_u', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); a.get_local(f.getParameter(0)); + a.load_v128(2, 0); a.get_local(f.getParameter(1)); - a.get_local(f.getParameter(2)); - a.memory_fill(0); + a.load_v128(2, 0); + a.narrow_i16x8_u_i8x16(); + a.store_v128(2, 0); }).withExport(); -// copy(dest, src, length) -mod.defineFunction('copy', null, - [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { +// Extend low half of i8x16 to i16x8 (signed) +mod.defineFunction('extend_low_s', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(1)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.extend_low_i8x16_s_i16x8(); + a.store_v128(2, 0); +}).withExport(); + +mod.defineFunction('setByte', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); a.get_local(f.getParameter(1)); - a.get_local(f.getParameter(2)); - a.memory_copy(0, 0); + a.store8_i32(0, 0); }).withExport(); -const instance = await mod.instantiate(); -const { fill, copy, memory } = instance.instance.exports; -const view = new Uint8Array(memory.buffer); +mod.defineFunction('getByte', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load8_i32_u(0, 0); +}).withExport(); -// Fill 8 bytes at offset 0 with 0xAA -fill(0, 0xAA, 8); -log('After fill(0, 0xAA, 8):'); -log(' bytes[0..7] = [' + Array.from(view.slice(0, 8)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']'); +mod.defineFunction('setI16', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store16_i32(1, 0); +}).withExport(); -// Copy those 8 bytes to offset 32 -copy(32, 0, 8); -log(''); -log('After copy(32, 0, 8):'); -log(' bytes[32..39] = [' + Array.from(view.slice(32, 40)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']'); +mod.defineFunction('getI16', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load16_i32_s(1, 0); +}).withExport(); -// Fill a region with incrementing pattern using a loop -fill(64, 0, 16); -for (let i = 0; i < 16; i++) { - view[64 + i] = i * 3; -} +const instance = await mod.instantiate(); +const { narrow_u, extend_low_s, setByte, getByte, setI16, getI16 } = instance.instance.exports; + +// Narrowing: two i16x8 \u2192 one i8x16 (values clamped to 0-255) +// A = [10, 200, 300, 50, 0, 255, 1000, 128] at offset 0 +const i16a = [10, 200, 300, 50, 0, 255, 1000, 128]; +for (let i = 0; i < 8; i++) setI16(i * 2, i16a[i]); +// B = [1, 2, 3, 4, 5, 6, 7, 8] +for (let i = 0; i < 8; i++) setI16(16 + i * 2, i + 1); + +narrow_u(0, 16, 32); +const narrowed = []; +for (let i = 0; i < 16; i++) narrowed.push(getByte(32 + i)); +log('=== Narrowing (i16x8 \u2192 i8x16, unsigned saturating) ==='); +log('A (i16) = [' + i16a + ']'); +log('B (i16) = [1,2,3,4,5,6,7,8]'); +log('narrow_u = [' + narrowed.join(', ') + ']'); +log('(300\u2192255, 1000\u2192255 clamped)'); + +// Widening: i8x16 low half \u2192 i16x8 (signed extend) log(''); -log('Manual pattern at [64..79]:'); -log(' ' + Array.from(view.slice(64, 80)).join(', ')); - -// Copy that pattern further -copy(128, 64, 16); -log('Copied to [128..143]:'); -log(' ' + Array.from(view.slice(128, 144)).join(', '));` - }, - // ─── Post-MVP Features ─── - "sign-extend": { - label: "Sign Extension", - group: "Post-MVP", - code: `// Sign extension: interpret low bits as signed values -const mod = new webasmjs.ModuleBuilder('signExt'); +log('=== Widening (i8x16 \u2192 i16x8, signed) ==='); +const bytes = [5, 200, 127, 128, 0, 255, 1, 100]; // 200=0xC8\u2192-56 signed, 128\u2192-128, 255\u2192-1 +for (let i = 0; i < 8; i++) setByte(48 + i, bytes[i]); +extend_low_s(48, 64); +const widened = []; +for (let i = 0; i < 8; i++) widened.push(getI16(64 + i * 2)); +log('input bytes = [' + bytes + ']'); +log('extend_low_s = [' + widened.join(', ') + ']'); +log('(200\u2192-56, 128\u2192-128, 255\u2192-1 sign-extended)');` + }, + "simd-saturating": { + label: "SIMD Saturating Math", + group: "SIMD", + description: "Saturating add/sub that clamp instead of wrapping.", + target: "3.0", + features: ["simd"], + code: `// SIMD saturating arithmetic: clamp on overflow instead of wrap +const mod = new webasmjs.ModuleBuilder('simdSat'); +mod.defineMemory(1); -// Treat low 8 bits as a signed byte -mod.defineFunction('extend8', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { +// Saturating unsigned add on i8x16 +mod.defineFunction('add_sat_u', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); a.get_local(f.getParameter(0)); - a.extend8_s_i32(); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.add_sat_u_i8x16(); + a.store_v128(2, 0); }).withExport(); -// Treat low 16 bits as a signed i16 -mod.defineFunction('extend16', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { +// Saturating unsigned sub on i8x16 +mod.defineFunction('sub_sat_u', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); a.get_local(f.getParameter(0)); - a.extend16_s_i32(); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.sub_sat_u_i8x16(); + a.store_v128(2, 0); }).withExport(); -const instance = await mod.instantiate(); -const { extend8, extend16 } = instance.instance.exports; - -log('i32.extend8_s:'); -log(' extend8(0x7F) = ' + extend8(0x7F) + ' (127, positive byte)'); -log(' extend8(0x80) = ' + extend8(0x80) + ' (128 \u2192 -128, sign bit set)'); -log(' extend8(0xFF) = ' + extend8(0xFF) + ' (255 \u2192 -1)'); -log(' extend8(0x100) = ' + extend8(0x100) + ' (256 \u2192 0, wraps to low byte)'); -log(''); -log('i32.extend16_s:'); -log(' extend16(0x7FFF) = ' + extend16(0x7FFF) + ' (32767, positive)'); -log(' extend16(0x8000) = ' + extend16(0x8000) + ' (32768 \u2192 -32768)'); -log(' extend16(0xFFFF) = ' + extend16(0xFFFF) + ' (65535 \u2192 -1)');` - }, - "sat-trunc": { - label: "Saturating Truncation", - group: "Post-MVP", - code: `// Saturating truncation: float \u2192 int without trapping on overflow -const mod = new webasmjs.ModuleBuilder('satTrunc'); +// Regular (wrapping) add for comparison +mod.defineFunction('add_wrap', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.add_i8x16(); + a.store_v128(2, 0); +}).withExport(); -// Normal trunc would trap on overflow; saturating clamps instead -mod.defineFunction('sat_f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => { +mod.defineFunction('setByte', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.trunc_sat_f64_s_i32(); + a.get_local(f.getParameter(1)); + a.store8_i32(0, 0); }).withExport(); -mod.defineFunction('sat_f64_to_u32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => { +mod.defineFunction('getByte', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.trunc_sat_f64_u_i32(); + a.load8_i32_u(0, 0); }).withExport(); const instance = await mod.instantiate(); -const { sat_f64_to_i32, sat_f64_to_u32 } = instance.instance.exports; +const { add_sat_u, sub_sat_u, add_wrap, setByte, getByte } = instance.instance.exports; -log('Saturating f64 \u2192 i32 (signed):'); -log(' 42.9 \u2192 ' + sat_f64_to_i32(42.9)); -log(' -42.9 \u2192 ' + sat_f64_to_i32(-42.9)); -log(' 1e20 \u2192 ' + sat_f64_to_i32(1e20) + ' (clamped to i32 max)'); -log(' -1e20 \u2192 ' + sat_f64_to_i32(-1e20) + ' (clamped to i32 min)'); -log(' NaN \u2192 ' + sat_f64_to_i32(NaN) + ' (NaN \u2192 0)'); -log(' Inf \u2192 ' + sat_f64_to_i32(Infinity) + ' (clamped)'); +// A = [200, 100, 255, 0, 128, 50, 250, 10, ...] +const a = [200, 100, 255, 0, 128, 50, 250, 10]; +// B = [100, 200, 10, 5, 128, 250, 50, 0] +const b = [100, 200, 10, 5, 128, 250, 50, 0]; +for (let i = 0; i < 8; i++) { setByte(i, a[i]); setByte(16 + i, b[i]); } +for (let i = 8; i < 16; i++) { setByte(i, 0); setByte(16 + i, 0); } + +add_sat_u(0, 16, 32); +add_wrap(0, 16, 48); + +const satResult = [], wrapResult = []; +for (let i = 0; i < 8; i++) { satResult.push(getByte(32 + i)); wrapResult.push(getByte(48 + i)); } + +log('A = [' + a.join(', ') + ']'); +log('B = [' + b.join(', ') + ']'); log(''); -log('Saturating f64 \u2192 u32 (unsigned, shown as signed i32):'); -log(' 42.9 \u2192 ' + sat_f64_to_u32(42.9)); -log(' -1.0 \u2192 ' + sat_f64_to_u32(-1.0) + ' (negative \u2192 0)'); -log(' 1e20 \u2192 ' + sat_f64_to_u32(1e20) + ' (clamped to u32 max)');` - }, - "ref-types": { - label: "Reference Types", - group: "Post-MVP", - code: `// Reference types: ref.null, ref.is_null, ref.func -const mod = new webasmjs.ModuleBuilder('refTypes'); +log('add_sat_u = [' + satResult.join(', ') + '] (clamped to 255)'); +log('add_wrap = [' + wrapResult.join(', ') + '] (wraps around)'); -const double = mod.defineFunction('double', [webasmjs.ValueType.Int32], - [webasmjs.ValueType.Int32], (f, a) => { - a.get_local(f.getParameter(0)); - a.const_i32(2); - a.mul_i32(); +log(''); +sub_sat_u(0, 16, 64); +const subResult = []; +for (let i = 0; i < 8; i++) subResult.push(getByte(64 + i)); +log('sub_sat_u = [' + subResult.join(', ') + '] (clamped to 0)');` + }, + // ─── Additional Bulk Memory ─── + "passive-data": { + label: "Passive Data Segments", + group: "Bulk Memory", + description: "Lazy-init memory with passive segments and memory.init.", + target: "2.0", + features: ["bulk-memory"], + code: `// Passive data segments: lazy initialization with memory.init +const mod = new webasmjs.ModuleBuilder('passiveData'); +const mem = mod.defineMemory(1); +mod.exportMemory(mem, 'memory'); + +// Passive segment: not placed in memory until memory.init is called +const greeting = new TextEncoder().encode('Hello, WebAssembly!'); +const dataSegment = mod.defineData(new Uint8Array([...greeting])); +// dataSegment is passive because no offset was given + +// Copy passive data into memory: init(destOffset) +mod.defineFunction('init', null, [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // destination offset + a.const_i32(0); // source offset in data segment + a.const_i32(${greeting.length}); // length + a.memory_init(dataSegment._index, 0); }).withExport(); -// Check if a null funcref is null \u2192 1 -mod.defineFunction('isRefNull', [webasmjs.ValueType.Int32], [], (f, a) => { - a.ref_null(0x70); - a.ref_is_null(); +// Drop data segment (free it after init) +mod.defineFunction('drop', null, [], (f, a) => { + a.data_drop(dataSegment._index); }).withExport(); -// Check if a real function ref is null \u2192 0 -mod.defineFunction('isFuncNull', [webasmjs.ValueType.Int32], [], (f, a) => { - a.ref_func(double); - a.ref_is_null(); +// strlen +mod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const ptr = f.getParameter(0); + const len = a.declareLocal(webasmjs.ValueType.Int32, 'len'); + a.const_i32(0); + a.set_local(len); + a.loop(webasmjs.BlockType.Void, (cont) => { + a.block(webasmjs.BlockType.Void, (brk) => { + a.get_local(ptr); + a.get_local(len); + a.add_i32(); + a.load8_i32_u(0, 0); + a.eqz_i32(); + a.br_if(brk); + a.get_local(len); + a.const_i32(1); + a.add_i32(); + a.set_local(len); + a.br(cont); + }); + }); + a.get_local(len); }).withExport(); const instance = await mod.instantiate(); -const { isRefNull, isFuncNull } = instance.instance.exports; +const { init, drop: dataDrop, strlen, memory } = instance.instance.exports; +const view = new Uint8Array(memory.buffer); -log('ref.null + ref.is_null:'); -log(' null funcref is null: ' + (isRefNull() === 1)); -log(' real func ref is null: ' + (isFuncNull() === 1)); +// Memory starts empty (passive segment not yet loaded) +log('Before init: byte[0] = ' + view[0] + ' (empty)'); + +// Load passive data to offset 0 +init(0); +const len = strlen(0); +const str = new TextDecoder().decode(view.slice(0, len)); +log('After init(0): "' + str + '" (length=' + len + ')'); + +// Load the same data at a different offset +init(100); +const str2 = new TextDecoder().decode(view.slice(100, 100 + len)); +log('After init(100): "' + str2 + '"'); + +// Drop the data segment (can no longer init) +dataDrop(); log(''); -log('double(21) = ' + instance.instance.exports.double(21));` +log('Data segment dropped \u2014 passive data freed.'); +try { + init(200); + log('Should not reach here'); +} catch (e) { + log('init after drop: trapped as expected'); +}` }, - // ─── Debug & Inspection ─── - "debug-names": { - label: "Debug Name Section", - group: "Debug", - code: `// Inspect the debug name section in the binary -const mod = new webasmjs.ModuleBuilder('debugExample'); - -const g = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0); -g.withName('counter'); + "bulk-table-ops": { + label: "Bulk Table Operations", + group: "Bulk Memory", + description: "table.copy and table.fill for bulk table manipulation.", + target: "2.0", + features: ["bulk-memory"], + code: `// Bulk table operations: table.fill and table.copy +const mod = new webasmjs.ModuleBuilder('bulkTable'); -mod.defineFunction('add', [webasmjs.ValueType.Int32], +const add = mod.defineFunction('add', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { - f.getParameter(0).withName('x'); - f.getParameter(1).withName('y'); a.get_local(f.getParameter(0)); a.get_local(f.getParameter(1)); a.add_i32(); }).withExport(); -mod.defineFunction('addThree', [webasmjs.ValueType.Int32], - [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { - f.getParameter(0).withName('a'); - f.getParameter(1).withName('b'); - f.getParameter(2).withName('c'); - const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp'); +const mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); a.get_local(f.getParameter(1)); - a.add_i32(); + a.mul_i32(); +}).withExport(); + +// Table with space for 8 entries +const table = mod.defineTable(webasmjs.ElementType.AnyFunc, 8); +mod.defineTableSegment(table, [add, mul], 0); + +// table.fill(start, ref, count) \u2014 fill slots 2-5 with the add function +mod.defineFunction('fillWithAdd', null, [], (f, a) => { + a.const_i32(2); // start index + a.ref_func(add); // function ref + a.const_i32(4); // count + a.table_fill(0); +}).withExport(); + +// table.copy(dest, src, count) \u2014 copy slots 0-1 to slots 6-7 +mod.defineFunction('copySlots', null, [], (f, a) => { + a.const_i32(6); // dest + a.const_i32(0); // src + a.const_i32(2); // count + a.table_copy(0, 0); +}).withExport(); + +// table.size +mod.defineFunction('tableSize', [webasmjs.ValueType.Int32], [], (f, a) => { + a.table_size(0); +}).withExport(); + +// Dispatch through table +mod.defineFunction('dispatch', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(1)); a.get_local(f.getParameter(2)); - a.add_i32(); + a.get_local(f.getParameter(0)); + a.call_indirect(add.funcTypeBuilder); }).withExport(); -const bytes = mod.toBytes(); +const instance = await mod.instantiate(); +const { fillWithAdd, copySlots, tableSize, dispatch } = instance.instance.exports; -log('Binary size: ' + bytes.length + ' bytes'); +log('Table size: ' + tableSize()); log(''); -// Read back the name section -const reader = new webasmjs.BinaryReader(bytes); -const info = reader.read(); -const ns = info.nameSection; +// Initial: [add, mul, ?, ?, ?, ?, ?, ?] +log('Initial: slot 0 (add): dispatch(0, 3, 4) = ' + dispatch(0, 3, 4)); +log('Initial: slot 1 (mul): dispatch(1, 3, 4) = ' + dispatch(1, 3, 4)); -if (ns) { - log('Module name: ' + ns.moduleName); - log(''); +// Fill slots 2-5 with add +fillWithAdd(); +log(''); +log('After table.fill(2, add, 4):'); +log(' slot 2: dispatch(2, 10, 20) = ' + dispatch(2, 10, 20) + ' (add)'); +log(' slot 3: dispatch(3, 10, 20) = ' + dispatch(3, 10, 20) + ' (add)'); - if (ns.functionNames) { - log('Function names:'); - ns.functionNames.forEach((name, idx) => { - log(' [' + idx + '] ' + name); - }); - } +// Copy slots 0-1 to 6-7 +copySlots(); +log(''); +log('After table.copy(6, 0, 2):'); +log(' slot 6: dispatch(6, 5, 6) = ' + dispatch(6, 5, 6) + ' (add, copied from 0)'); +log(' slot 7: dispatch(7, 5, 6) = ' + dispatch(7, 5, 6) + ' (mul, copied from 1)');` + }, + // ─── Additional Post-MVP ─── + "table-ops": { + label: "Table Get/Set/Grow", + group: "Post-MVP", + description: "Dynamic table manipulation with table.get, table.set, table.grow.", + target: "2.0", + features: ["reference-types"], + code: `// Dynamic table operations: get, set, grow +const mod = new webasmjs.ModuleBuilder('tableOps'); - if (ns.localNames) { - log(''); - log('Local/parameter names:'); - ns.localNames.forEach((locals, funcIdx) => { - const funcName = ns.functionNames?.get(funcIdx) || 'func' + funcIdx; - log(' ' + funcName + ':'); - locals.forEach((name, localIdx) => { - log(' [' + localIdx + '] ' + name); - }); - }); - } +const double = mod.defineFunction('double', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(2); + a.mul_i32(); +}).withExport(); - if (ns.globalNames) { - log(''); - log('Global names:'); - ns.globalNames.forEach((name, idx) => { - log(' [' + idx + '] ' + name); - }); - } -} else { - log('No name section found!'); -}` - }, - "binary-inspect": { - label: "Binary Inspector", - group: "Debug", - code: `// Inspect the binary structure of a WASM module -const mod = new webasmjs.ModuleBuilder('inspect'); -mod.defineMemory(1); +const triple = mod.defineFunction('triple', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(3); + a.mul_i32(); +}).withExport(); -const counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0); +const negate = mod.defineFunction('negate', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.const_i32(0); + a.get_local(f.getParameter(0)); + a.sub_i32(); +}).withExport(); -mod.defineFunction('add', [webasmjs.ValueType.Int32], - [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { +// Start with table of size 2 +const table = mod.defineTable(webasmjs.ElementType.AnyFunc, 2); +mod.defineTableSegment(table, [double, triple], 0); + +// table.set: place a function ref at an index +mod.defineFunction('setSlot', null, [webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.get_local(f.getParameter(1)); - a.add_i32(); + a.ref_func(negate); + a.table_set(0); }).withExport(); -mod.defineFunction('noop', null, [], (f, a) => { - a.nop(); +// table.grow: add N slots (returns old size, or -1 on failure) +mod.defineFunction('growTable', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.ref_null(0x70); // fill new slots with null + a.get_local(f.getParameter(0)); + a.table_grow(0); }).withExport(); -const bytes = mod.toBytes(); +// table.size +mod.defineFunction('size', [webasmjs.ValueType.Int32], [], (f, a) => { + a.table_size(0); +}).withExport(); -log('=== Binary Analysis ==='); -log('Total size: ' + bytes.length + ' bytes'); +// Check if a slot is null +mod.defineFunction('isNull', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.table_get(0); + a.ref_is_null(); +}).withExport(); + +// Call through table +mod.defineFunction('call', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(1)); + a.get_local(f.getParameter(0)); + a.call_indirect(double.funcTypeBuilder); +}).withExport(); + +const instance = await mod.instantiate(); +const fn = instance.instance.exports; + +log('Initial size: ' + fn.size()); +log('slot 0 (double): call(0, 5) = ' + fn.call(0, 5)); +log('slot 1 (triple): call(1, 5) = ' + fn.call(1, 5)); + +// Grow table by 3 slots +const oldSize = fn.growTable(3); log(''); +log('growTable(3) returned old size: ' + oldSize); +log('New size: ' + fn.size()); +log('slot 2 is null: ' + (fn.isNull(2) === 1)); -// Read with BinaryReader -const reader = new webasmjs.BinaryReader(bytes); -const info = reader.read(); +// Set slot 2 to negate +fn.setSlot(2); +log(''); +log('After setSlot(2, negate):'); +log('slot 2 is null: ' + (fn.isNull(2) === 1)); +log('slot 2 (negate): call(2, 5) = ' + fn.call(2, 5));` + }, + "try-catch": { + label: "Try/Catch", + group: "Post-MVP", + description: "Full try/catch exception handling with multiple tags.", + target: "3.0", + features: ["exception-handling"], + code: `// Full try/catch exception handling +const mod = new webasmjs.ModuleBuilder('tryCatch', { disableVerification: true }); + +// Define two exception tags with different payloads +const errorTag = mod.defineTag([webasmjs.ValueType.Int32]); // error code +const overflowTag = mod.defineTag([webasmjs.ValueType.Int32]); // overflow value + +// Function that may throw +mod.defineFunction('checkedAdd', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const x = f.getParameter(0); + const y = f.getParameter(1); + const result = a.declareLocal(webasmjs.ValueType.Int32, 'result'); -log('WASM version: ' + info.version); -log('Types: ' + info.types.length); -info.types.forEach((t, i) => { - const params = t.parameterTypes.map(p => p.name).join(', '); - const results = t.returnTypes.map(r => r.name).join(', '); - log(' [' + i + '] (' + params + ') -> (' + results + ')'); -}); + a.get_local(x); + a.get_local(y); + a.add_i32(); + a.set_local(result); -log('Functions: ' + info.functions.length); -info.functions.forEach((f, i) => { - log(' [' + i + '] type=' + f.typeIndex + ', locals=' + f.locals.length + ', body=' + f.body.length + ' bytes'); -}); + // Check for "overflow" (result > 1000 for demo purposes) + a.get_local(result); + a.const_i32(1000); + a.gt_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.get_local(result); + a.throw(overflowTag._index); + }); -log('Memories: ' + info.memories.length); -info.memories.forEach((m, i) => { - log(' [' + i + '] initial=' + m.initial + ' pages (' + (m.initial * 64) + ' KB)'); -}); + // Check for negative input + a.get_local(x); + a.const_i32(0); + a.lt_s_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.const_i32(-1); + a.throw(errorTag._index); + }); -log('Globals: ' + info.globals.length); -info.globals.forEach((g, i) => { - log(' [' + i + '] mutable=' + g.mutable); -}); + a.get_local(result); +}).withExport(); -log('Exports: ' + info.exports.length); -info.exports.forEach((e) => { - const kinds = ['function', 'table', 'memory', 'global']; - log(' "' + e.name + '" -> ' + (kinds[e.kind] || 'unknown') + '[' + e.index + ']'); -}); +// Show the WAT with tags, throw, try/catch +const wat = mod.toString(); +log('=== WAT Output (try/catch) ==='); +log(wat); +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer)); log(''); -log('Valid: ' + WebAssembly.validate(bytes.buffer));` +log('This module defines:'); +log(' - errorTag: thrown when input is negative'); +log(' - overflowTag: thrown when result > 1000'); +log(' - checkedAdd: adds two numbers with validation');` }, - "wat-roundtrip": { - label: "WAT Roundtrip", - group: "Debug", - code: `// Build a module programmatically, inspect WAT, parse it back -const mod = new webasmjs.ModuleBuilder('roundtrip'); + "f32-math": { + label: "f32 Math", + group: "Numeric", + description: "Single-precision float ops \u2014 f32 min, max, abs, neg, sqrt.", + target: "mvp", + features: [], + code: `// f32 math \u2014 single-precision float operations +const mod = new webasmjs.ModuleBuilder('f32math'); + +mod.defineFunction('min', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32, webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.min_f32(); +}).withExport(); -mod.defineFunction('multiply', [webasmjs.ValueType.Int32], - [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { +mod.defineFunction('max', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32, webasmjs.ValueType.Float32], (f, a) => { a.get_local(f.getParameter(0)); a.get_local(f.getParameter(1)); - a.mul_i32(); + a.max_f32(); }).withExport(); -mod.defineFunction('negate', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { - a.const_i32(0); +mod.defineFunction('abs', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32], (f, a) => { a.get_local(f.getParameter(0)); - a.sub_i32(); + a.abs_f32(); }).withExport(); -// Get WAT text -const watText = mod.toString(); -log('=== Generated WAT ==='); -log(watText); +mod.defineFunction('neg', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.neg_f32(); +}).withExport(); -// Parse it back -log(''); -log('=== Parsing WAT back... ==='); -const mod2 = webasmjs.parseWat(watText); +mod.defineFunction('sqrt', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.sqrt_f32(); +}).withExport(); -// Instantiate and test -const instance = await mod2.instantiate(); -const { multiply, negate } = instance.instance.exports; +// Compare: f32 arithmetic vs f64 for precision +mod.defineFunction('addF32', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32, webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_f32(); +}).withExport(); + +mod.defineFunction('addF64', [webasmjs.ValueType.Float64], + [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_f64(); +}).withExport(); + +const instance = await mod.instantiate(); +const { min, max, abs, neg, sqrt, addF32, addF64 } = instance.instance.exports; + +log('=== f32 Operations ==='); +log('min(3.14, 2.71) = ' + min(3.14, 2.71)); +log('max(3.14, 2.71) = ' + max(3.14, 2.71)); +log('abs(-42.5) = ' + abs(-42.5)); +log('neg(3.14) = ' + neg(3.14)); +log('sqrt(2.0) = ' + sqrt(2.0)); +log('sqrt(9.0) = ' + sqrt(9.0)); -log('multiply(6, 7) = ' + multiply(6, 7)); -log('multiply(100, -3) = ' + multiply(100, -3)); -log('negate(42) = ' + negate(42)); -log('negate(-10) = ' + negate(-10)); log(''); -log('Roundtrip successful!');` +log('=== f32 vs f64 Precision ==='); +log('f32: 0.1 + 0.2 = ' + addF32(0.1, 0.2)); +log('f64: 0.1 + 0.2 = ' + addF64(0.1, 0.2)); +log('f32 uses 4 bytes, f64 uses 8 bytes per value.');` } }; var GROUP_ICONS = { @@ -10622,6 +14418,7 @@ log('Roundtrip successful!');` Memory: "\u{1F4BE}", Globals: "\u{1F30D}", Functions: "\u{1F517}", + "Control Flow": "\u{1F500}", Numeric: "\u{1F522}", Algorithms: "\u2699", SIMD: "\u26A1", @@ -10630,6 +14427,12 @@ log('Roundtrip successful!');` WAT: "\u{1F4DD}", Debug: "\u{1F50D}" }; + var TARGET_ORDER = { + mvp: 0, + "2.0": 1, + "3.0": 2, + latest: 3 + }; function getEditor() { return document.getElementById("editor"); } @@ -10639,6 +14442,9 @@ log('Roundtrip successful!');` function getRunOutput() { return document.getElementById("runOutput"); } + function getConsoleOutput() { + return document.getElementById("consoleOutput"); + } function clearOutput(el) { el.textContent = ""; } @@ -10656,10 +14462,70 @@ log('Roundtrip successful!');` getEditor().value = example.code; clearOutput(getWatOutput()); clearOutput(getRunOutput()); + clearOutput(getConsoleOutput()); const label = document.getElementById("currentExample"); if (label) label.textContent = example.label; } } + function switchTab(tabName) { + const tabs = document.querySelectorAll(".tab-bar .tab"); + const panels = document.querySelectorAll(".tab-panel"); + tabs.forEach((tab) => { + tab.classList.toggle("active", tab.dataset.tab === tabName); + }); + panels.forEach((panel) => { + const isTarget = panel.id === (tabName === "wat" ? "watOutput" : "runOutput"); + panel.classList.toggle("active", isTarget); + }); + } + function toggleConsole() { + const drawer = document.getElementById("consoleDrawer"); + drawer.classList.toggle("open"); + } + function clearConsole() { + getConsoleOutput().textContent = ""; + updateConsoleBadge(); + } + var consoleMessageCount = 0; + function updateConsoleBadge() { + const badge = document.getElementById("consoleBadge"); + consoleMessageCount = getConsoleOutput().childElementCount; + badge.textContent = String(consoleMessageCount); + badge.classList.toggle("has-messages", consoleMessageCount > 0); + } + function initResizeHandler() { + const handle = document.getElementById("resizeHandle"); + const main = document.querySelector(".main"); + const editorPane = document.querySelector(".editor-pane"); + const outputPane = document.querySelector(".output-pane"); + let isResizing = false; + handle.addEventListener("mousedown", (e) => { + isResizing = true; + handle.classList.add("active"); + document.body.style.cursor = "col-resize"; + document.body.style.userSelect = "none"; + e.preventDefault(); + }); + document.addEventListener("mousemove", (e) => { + if (!isResizing) return; + const rect = main.getBoundingClientRect(); + const x = e.clientX - rect.left; + const totalWidth = rect.width - 4; + const leftPct = Math.max(20, Math.min(80, x / rect.width * 100)); + editorPane.style.flex = "none"; + outputPane.style.flex = "none"; + editorPane.style.width = leftPct + "%"; + outputPane.style.width = 100 - leftPct + "%"; + }); + document.addEventListener("mouseup", () => { + if (isResizing) { + isResizing = false; + handle.classList.remove("active"); + document.body.style.cursor = ""; + document.body.style.userSelect = ""; + } + }); + } function openExamplePicker() { const existing = document.getElementById("exampleDialog"); if (existing) existing.remove(); @@ -10671,11 +14537,43 @@ log('Roundtrip successful!');` const header = document.createElement("div"); header.className = "dialog-header"; header.innerHTML = "

Examples

"; + const searchRow = document.createElement("div"); + searchRow.className = "dialog-search-row"; const searchInput = document.createElement("input"); searchInput.type = "text"; searchInput.placeholder = "Search examples..."; searchInput.className = "dialog-search"; - header.appendChild(searchInput); + searchRow.appendChild(searchInput); + const filterSelect = document.createElement("select"); + filterSelect.className = "filter-select"; + const allOpt = document.createElement("option"); + allOpt.value = ""; + allOpt.textContent = "All"; + filterSelect.appendChild(allOpt); + const targetGroup = document.createElement("optgroup"); + targetGroup.label = "Target"; + for (const t of ["mvp", "2.0", "3.0", "latest"]) { + const opt = document.createElement("option"); + opt.value = "target:" + t; + opt.textContent = t === "mvp" ? "MVP" : t === "latest" ? "Latest" : "Wasm " + t; + targetGroup.appendChild(opt); + } + filterSelect.appendChild(targetGroup); + const usedFeatures = /* @__PURE__ */ new Set(); + for (const example of Object.values(EXAMPLES)) { + for (const f of example.features) usedFeatures.add(f); + } + const featureGroup = document.createElement("optgroup"); + featureGroup.label = "Feature"; + for (const f of Array.from(usedFeatures).sort()) { + const opt = document.createElement("option"); + opt.value = "feature:" + f; + opt.textContent = f; + featureGroup.appendChild(opt); + } + filterSelect.appendChild(featureGroup); + searchRow.appendChild(filterSelect); + header.appendChild(searchRow); dialog.appendChild(header); const body = document.createElement("div"); body.className = "dialog-body"; @@ -10683,8 +14581,7 @@ log('Roundtrip successful!');` for (const [key, example] of Object.entries(EXAMPLES)) { const group = example.group; if (!groups.has(group)) groups.set(group, []); - const firstComment = example.code.split("\n")[0].replace(/^\/\/\s*/, ""); - groups.get(group).push({ key, label: example.label, desc: firstComment }); + groups.get(group).push({ key, example }); } const allCards = []; const allSections = []; @@ -10704,15 +14601,34 @@ log('Roundtrip successful!');` card.className = "dialog-card"; if (item.key === currentExampleKey) card.classList.add("active"); card.dataset.key = item.key; - card.dataset.search = `${item.label} ${item.desc} ${groupName}`.toLowerCase(); + card.dataset.search = `${item.example.label} ${item.example.description} ${groupName}`.toLowerCase(); + card.dataset.target = item.example.target; + card.dataset.features = item.example.features.join(","); const title = document.createElement("div"); title.className = "dialog-card-title"; - title.textContent = item.label; + title.textContent = item.example.label; card.appendChild(title); const desc = document.createElement("div"); desc.className = "dialog-card-desc"; - desc.textContent = item.desc; + desc.textContent = item.example.description; card.appendChild(desc); + if (item.example.target !== "mvp" || item.example.features.length > 0) { + const meta = document.createElement("div"); + meta.className = "dialog-card-meta"; + if (item.example.target !== "mvp") { + const targetBadge = document.createElement("span"); + targetBadge.className = "card-target"; + targetBadge.textContent = item.example.target; + meta.appendChild(targetBadge); + } + for (const feat of item.example.features) { + const featBadge = document.createElement("span"); + featBadge.className = "card-feature"; + featBadge.textContent = feat; + meta.appendChild(featBadge); + } + card.appendChild(meta); + } card.addEventListener("click", () => { loadExample(item.key); overlay.remove(); @@ -10727,17 +14643,30 @@ log('Roundtrip successful!');` dialog.appendChild(body); overlay.appendChild(dialog); document.body.appendChild(overlay); - searchInput.addEventListener("input", () => { + function applyFilters() { const q = searchInput.value.toLowerCase().trim(); + const filterVal = filterSelect.value; for (const card of allCards) { - const match = !q || card.dataset.search.includes(q); - card.style.display = match ? "" : "none"; + const searchMatch = !q || card.dataset.search.includes(q); + let filterMatch = true; + if (filterVal.startsWith("target:")) { + const selectedTarget = filterVal.slice(7); + const cardTarget = card.dataset.target; + filterMatch = TARGET_ORDER[cardTarget] <= TARGET_ORDER[selectedTarget]; + } else if (filterVal.startsWith("feature:")) { + const selectedFeature = filterVal.slice(8); + const cardFeatures = card.dataset.features ? card.dataset.features.split(",") : []; + filterMatch = cardFeatures.includes(selectedFeature); + } + card.style.display = searchMatch && filterMatch ? "" : "none"; } for (const section of allSections) { const visibleCards = section.querySelectorAll('.dialog-card:not([style*="display: none"])'); section.style.display = visibleCards.length > 0 ? "" : "none"; } - }); + } + searchInput.addEventListener("input", applyFilters); + filterSelect.addEventListener("change", applyFilters); overlay.addEventListener("click", (e) => { if (e.target === overlay) overlay.remove(); }); @@ -10752,6 +14681,7 @@ log('Roundtrip successful!');` } window.webasmjs = { ModuleBuilder, + PackageBuilder, ValueType, BlockType, ElementType, @@ -10762,11 +14692,16 @@ log('Roundtrip successful!');` async function run() { const watEl = getWatOutput(); const runEl = getRunOutput(); + const consoleEl = getConsoleOutput(); clearOutput(watEl); clearOutput(runEl); + clearOutput(consoleEl); const code = getEditor().value; + const drawer = document.getElementById("consoleDrawer"); + drawer.classList.add("open"); const log = (msg) => { - appendOutput(runEl, String(msg)); + appendOutput(consoleEl, String(msg)); + updateConsoleBadge(); }; const OrigModuleBuilder = ModuleBuilder; const patchedClass = class extends OrigModuleBuilder { @@ -10794,11 +14729,23 @@ ${code} } } finally { window.webasmjs.ModuleBuilder = OrigModuleBuilder; + updateConsoleBadge(); } } document.addEventListener("DOMContentLoaded", () => { document.getElementById("examplesBtn").addEventListener("click", openExamplePicker); document.getElementById("runBtn").addEventListener("click", run); + document.querySelectorAll(".tab-bar .tab").forEach((tab) => { + tab.addEventListener("click", () => { + switchTab(tab.dataset.tab); + }); + }); + document.getElementById("consoleToggle").addEventListener("click", toggleConsole); + document.getElementById("consoleClear").addEventListener("click", (e) => { + e.stopPropagation(); + clearConsole(); + }); + initResizeHandler(); getEditor().addEventListener("keydown", (e) => { if ((e.ctrlKey || e.metaKey) && e.key === "Enter") { e.preventDefault(); diff --git a/playground/playground.bundle.js.map b/playground/playground.bundle.js.map index 1246e51..37f56c9 100644 --- a/playground/playground.bundle.js.map +++ b/playground/playground.bundle.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../src/types.ts", "../src/Arg.ts", "../src/BinaryWriter.ts", "../src/BinaryModuleWriter.ts", "../src/BinaryReader.ts", "../src/CustomSectionBuilder.ts", "../src/FunctionParameterBuilder.ts", "../src/LocalBuilder.ts", "../src/GlobalType.ts", "../src/GlobalBuilder.ts", "../src/ImportBuilder.ts", "../src/ImmediateEncoder.ts", "../src/Immediate.ts", "../src/Instruction.ts", "../src/LabelBuilder.ts", "../src/OpCodes.ts", "../src/OpCodeEmitter.ts", "../src/verification/ControlFlowBlock.ts", "../src/verification/VerificationError.ts", "../src/verification/ControlFlowVerifier.ts", "../src/verification/OperandStack.ts", "../src/FuncTypeSignature.ts", "../src/FuncTypeBuilder.ts", "../src/verification/OperandStackVerifier.ts", "../src/AssemblyEmitter.ts", "../src/InitExpressionEmitter.ts", "../src/DataSegmentBuilder.ts", "../src/FunctionEmitter.ts", "../src/FunctionBuilder.ts", "../src/ElementSegmentBuilder.ts", "../src/ExportBuilder.ts", "../src/ResizableLimits.ts", "../src/MemoryType.ts", "../src/MemoryBuilder.ts", "../src/TableType.ts", "../src/TableBuilder.ts", "../src/TextModuleWriter.ts", "../src/ModuleBuilder.ts", "../src/WatParser.ts", "playground.ts"], - "sourcesContent": ["/**\r\n * Language-level type descriptors used in the WASM binary encoding.\r\n * Each type has a name, binary value, and short identifier.\r\n */\r\nexport interface LanguageTypeDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n readonly short: string;\r\n}\r\n\r\nexport const LanguageType = {\r\n Int32: { name: 'i32', value: 0x7f, short: 'i' } as const,\r\n Int64: { name: 'i64', value: 0x7e, short: 'l' } as const,\r\n Float32: { name: 'f32', value: 0x7d, short: 's' } as const,\r\n Float64: { name: 'f64', value: 0x7c, short: 'd' } as const,\r\n AnyFunc: { name: 'anyfunc', value: 0x70, short: 'a' } as const,\r\n Func: { name: 'func', value: 0x60, short: 'f' } as const,\r\n Void: { name: 'void', value: 0x40, short: 'v' } as const,\r\n} as const;\r\n\r\nexport type LanguageTypeKey = keyof typeof LanguageType;\r\n\r\n/**\r\n * WASM value types (i32, i64, f32, f64, v128).\r\n */\r\nexport const ValueType = {\r\n Int32: LanguageType.Int32,\r\n Int64: LanguageType.Int64,\r\n Float32: LanguageType.Float32,\r\n Float64: LanguageType.Float64,\r\n V128: { name: 'v128', value: 0x7b, short: 'v' } as const,\r\n} as const;\r\n\r\nexport type ValueTypeDescriptor = typeof ValueType[keyof typeof ValueType];\r\nexport type ValueTypeKey = keyof typeof ValueType;\r\n\r\n/**\r\n * Block return types (value types + void).\r\n */\r\nexport const BlockType = {\r\n Int32: LanguageType.Int32,\r\n Int64: LanguageType.Int64,\r\n Float32: LanguageType.Float32,\r\n Float64: LanguageType.Float64,\r\n V128: ValueType.V128,\r\n Void: LanguageType.Void,\r\n} as const;\r\n\r\nexport type BlockTypeDescriptor = typeof BlockType[keyof typeof BlockType];\r\n\r\n/**\r\n * Element types for tables.\r\n */\r\nexport const ElementType = {\r\n AnyFunc: LanguageType.AnyFunc,\r\n} as const;\r\n\r\nexport type ElementTypeDescriptor = typeof ElementType[keyof typeof ElementType];\r\n\r\n/**\r\n * Import/export external kinds.\r\n */\r\nexport interface ExternalKindDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n}\r\n\r\nexport const ExternalKind = {\r\n Function: { name: 'Function', value: 0 } as const,\r\n Table: { name: 'Table', value: 1 } as const,\r\n Memory: { name: 'Memory', value: 2 } as const,\r\n Global: { name: 'Global', value: 3 } as const,\r\n} as const;\r\n\r\nexport type ExternalKindType = typeof ExternalKind[keyof typeof ExternalKind];\r\n\r\n/**\r\n * WASM binary section types.\r\n */\r\nexport interface SectionTypeDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n}\r\n\r\nexport const SectionType = {\r\n Type: { name: 'Type', value: 1 } as const,\r\n Import: { name: 'Import', value: 2 } as const,\r\n Function: { name: 'Function', value: 3 } as const,\r\n Table: { name: 'Table', value: 4 } as const,\r\n Memory: { name: 'Memory', value: 5 } as const,\r\n Global: { name: 'Global', value: 6 } as const,\r\n Export: { name: 'Export', value: 7 } as const,\r\n Start: { name: 'Start', value: 8 } as const,\r\n Element: { name: 'Element', value: 9 } as const,\r\n Code: { name: 'Code', value: 10 } as const,\r\n Data: { name: 'Data', value: 11 } as const,\r\n createCustom(name: string): SectionTypeDescriptor {\r\n return { name, value: 0 };\r\n },\r\n} as const;\r\n\r\n/**\r\n * Type form descriptors.\r\n */\r\nexport const TypeForm = {\r\n Func: { name: 'func', value: 0x60 } as const,\r\n Block: { name: 'block', value: 0x40 } as const,\r\n} as const;\r\n\r\n/**\r\n * Immediate operand types for instructions.\r\n */\r\nexport enum ImmediateType {\r\n BlockSignature = 'BlockSignature',\r\n RelativeDepth = 'RelativeDepth',\r\n BranchTable = 'BranchTable',\r\n Function = 'Function',\r\n IndirectFunction = 'IndirectFunction',\r\n Local = 'Local',\r\n Global = 'Global',\r\n Float32 = 'Float32',\r\n Float64 = 'Float64',\r\n VarInt32 = 'VarInt32',\r\n VarInt64 = 'VarInt64',\r\n VarUInt1 = 'VarUInt1',\r\n VarUInt32 = 'VarUInt32',\r\n MemoryImmediate = 'MemoryImmediate',\r\n V128Const = 'V128Const',\r\n LaneIndex = 'LaneIndex',\r\n ShuffleMask = 'ShuffleMask',\r\n}\r\n\r\n/**\r\n * Context types for initialization expressions.\r\n */\r\nexport enum InitExpressionType {\r\n Global = 'Global',\r\n Element = 'Element',\r\n Data = 'Data',\r\n}\r\n\r\n/**\r\n * WASM post-MVP feature extensions.\r\n */\r\nexport type WasmFeature =\r\n | 'sign-extend'\r\n | 'sat-trunc'\r\n | 'bulk-memory'\r\n | 'reference-types'\r\n | 'simd'\r\n | 'multi-value';\r\n\r\n/**\r\n * WASM version targets. Each target enables a set of features.\r\n */\r\nexport type WasmTarget = 'mvp' | '2.0' | 'latest';\r\n\r\n/**\r\n * Options for module building.\r\n */\r\nexport interface ModuleBuilderOptions {\r\n generateNameSection?: boolean;\r\n disableVerification?: boolean;\r\n target?: WasmTarget;\r\n features?: WasmFeature[];\r\n}\r\n\r\n/**\r\n * Opcode definition structure.\r\n */\r\nexport interface OpCodeDef {\r\n readonly value: number;\r\n readonly mnemonic: string;\r\n readonly immediate?: string;\r\n readonly controlFlow?: string;\r\n readonly stackBehavior: string;\r\n readonly popOperands?: readonly string[];\r\n readonly pushOperands?: readonly string[];\r\n readonly prefix?: number;\r\n readonly feature?: WasmFeature;\r\n}\r\n\r\n/**\r\n * Interface for objects that can write themselves to a BinaryWriter.\r\n */\r\nexport interface Writable {\r\n write(writer: import('./BinaryWriter').default): void;\r\n}\r\n", "const formatOrList = (values: string[]): string => {\r\n if (values.length === 1) {\r\n return values[0];\r\n }\r\n\r\n let text = '';\r\n for (let index = 0; index < values.length; index++) {\r\n text += values[index];\r\n if (index === values.length - 2) {\r\n text += ' or ';\r\n } else if (index !== values.length - 1) {\r\n text += ', ';\r\n }\r\n }\r\n\r\n return text;\r\n};\r\n\r\nexport default class Arg {\r\n static notNull(name: string, value: unknown): void {\r\n if (value === null || value === undefined) {\r\n throw new Error(`The parameter ${name} must be specified.`);\r\n }\r\n }\r\n\r\n static notEmpty(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (value === '' || (Array.isArray(value) && value.length === 0)) {\r\n throw new Error(`The parameter ${name} cannot be empty.`);\r\n }\r\n }\r\n\r\n static notEmptyString(name: string, value: unknown): void {\r\n Arg.string(name, value);\r\n if (value === '') {\r\n throw new Error(`The parameter ${name} cannot be empty.`);\r\n }\r\n }\r\n\r\n static string(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (typeof value !== 'string') {\r\n throw new Error(`The parameter ${name} must be a string.`);\r\n }\r\n }\r\n\r\n static number(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (typeof value !== 'number' || isNaN(value)) {\r\n throw new Error(`The parameter ${name} must be a number.`);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static instanceOf(name: string, value: unknown, ...types: (new (...args: any[]) => any)[]): void {\r\n if (!types.some((x) => value instanceof x)) {\r\n throw new Error(\r\n `The parameter ${name} must be a ${formatOrList(types.map((x) => x.name))}.`\r\n );\r\n }\r\n }\r\n}\r\n", "const GrowthRate = 1024;\r\n\r\nexport default class BinaryWriter {\r\n buffer: Uint8Array;\r\n size: number;\r\n\r\n constructor(size: number = 1024) {\r\n this.size = 0;\r\n this.buffer = new Uint8Array(size);\r\n }\r\n\r\n get capacity(): number {\r\n return this.buffer.length;\r\n }\r\n\r\n get length(): number {\r\n return this.size;\r\n }\r\n\r\n get remaining(): number {\r\n return this.buffer.length - this.size;\r\n }\r\n\r\n writeUInt8(value: number): void {\r\n this.writeByte(0xff & value);\r\n }\r\n\r\n writeUInt16(value: number): void {\r\n this.writeByte(value & 0xff);\r\n this.writeByte((value >> 8) & 0xff);\r\n }\r\n\r\n writeUInt32(value: number): void {\r\n this.writeByte(value & 0xff);\r\n this.writeByte((value >> 8) & 0xff);\r\n this.writeByte((value >> 16) & 0xff);\r\n this.writeByte((value >> 24) & 0xff);\r\n }\r\n\r\n writeVarUInt1(value: number): void {\r\n this.writeByte(value > 0 ? 1 : 0);\r\n }\r\n\r\n writeVarUInt7(value: number): void {\r\n this.writeByte(0x7f & value);\r\n }\r\n\r\n writeVarUInt32(value: number): void {\r\n do {\r\n let chunk = value & 0x7f;\r\n value >>>= 7;\r\n if (value !== 0) {\r\n chunk |= 0x80;\r\n }\r\n this.writeByte(chunk);\r\n } while (value !== 0);\r\n }\r\n\r\n writeVarInt7(value: number): void {\r\n this.writeByte(value & 0x7f);\r\n }\r\n\r\n writeVarInt32(value: number): void {\r\n let more = true;\r\n while (more) {\r\n let chunk = value & 0x7f;\r\n value >>= 7;\r\n\r\n if ((value === 0 && (chunk & 0x40) === 0) || (value === -1 && (chunk & 0x40) !== 0)) {\r\n more = false;\r\n } else {\r\n chunk |= 0x80;\r\n }\r\n\r\n this.writeByte(chunk);\r\n }\r\n }\r\n\r\n writeVarInt64(value: number | bigint): void {\r\n if (typeof value === 'number' && Number.isInteger(value)) {\r\n this.writeVarInt32(value);\r\n return;\r\n }\r\n\r\n let bigIntValue = BigInt(value);\r\n let more = true;\r\n\r\n while (more) {\r\n let chunk = Number(bigIntValue & 0x7fn);\r\n bigIntValue = bigIntValue >> 7n;\r\n\r\n if (\r\n (bigIntValue === 0n && (chunk & 0x40) === 0) || (bigIntValue === -1n && (chunk & 0x40) !== 0)\r\n ) {\r\n more = false;\r\n } else {\r\n chunk |= 0x80;\r\n }\r\n\r\n this.writeByte(chunk);\r\n }\r\n }\r\n\r\n writeString(value: string): void {\r\n const encoder = new TextEncoder();\r\n const utfBytes = encoder.encode(value);\r\n this.writeBytes(utfBytes);\r\n }\r\n\r\n writeFloat32(value: number): void {\r\n const array = new Float32Array(1);\r\n array[0] = value;\r\n this.writeBytes(new Uint8Array(array.buffer));\r\n }\r\n\r\n writeFloat64(value: number): void {\r\n const array = new Float64Array(1);\r\n array[0] = value;\r\n this.writeBytes(new Uint8Array(array.buffer));\r\n }\r\n\r\n writeByte(data: number): void {\r\n this.requireCapacity(1);\r\n this.buffer[this.size++] = data;\r\n }\r\n\r\n writeBytes(array: BinaryWriter | Uint8Array): void {\r\n let innerArray: Uint8Array;\r\n if (array instanceof BinaryWriter) {\r\n innerArray = array.toArray();\r\n } else if (array instanceof Uint8Array) {\r\n innerArray = array;\r\n } else {\r\n throw new Error('Invalid argument, must be a Uint8Array or BinaryWriter');\r\n }\r\n\r\n this.requireCapacity(innerArray.length);\r\n this.buffer.set(innerArray, this.size);\r\n this.size += innerArray.length;\r\n }\r\n\r\n requireCapacity(size: number): void {\r\n const remaining = this.remaining;\r\n if (remaining >= size) {\r\n return;\r\n }\r\n\r\n const needed = this.size + size;\r\n const grown = this.buffer.length + GrowthRate;\r\n const newSize = Math.max(needed, grown);\r\n\r\n const newBuffer = new Uint8Array(newSize);\r\n newBuffer.set(this.buffer, 0);\r\n this.buffer = newBuffer;\r\n }\r\n\r\n toArray(): Uint8Array {\r\n const array = new Uint8Array(this.size);\r\n array.set(this.buffer.subarray(0, this.size), 0);\r\n return array;\r\n }\r\n}\r\n", "import { SectionType, SectionTypeDescriptor } from './types';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport ModuleBuilder from './ModuleBuilder';\r\nimport CustomSectionBuilder from './CustomSectionBuilder';\r\n\r\nconst MagicHeader = 0x6d736100;\r\nconst Version = 1;\r\n\r\nexport default class BinaryModuleWriter {\r\n moduleBuilder: ModuleBuilder;\r\n\r\n constructor(moduleBuilder: ModuleBuilder) {\r\n this.moduleBuilder = moduleBuilder;\r\n }\r\n\r\n static writeSectionHeader(\r\n writer: BinaryWriter,\r\n section: SectionTypeDescriptor,\r\n length: number\r\n ): void {\r\n writer.writeVarUInt7(section.value);\r\n writer.writeVarUInt32(length);\r\n }\r\n\r\n static writeSection(\r\n writer: BinaryWriter,\r\n sectionType: SectionTypeDescriptor,\r\n sectionItems: { write(writer: BinaryWriter): void }[]\r\n ): void {\r\n if (sectionItems.length === 0) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(sectionItems.length);\r\n sectionItems.forEach((x) => {\r\n x.write(sectionWriter);\r\n });\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, sectionType, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n static writeCustomSection(writer: BinaryWriter, section: CustomSectionBuilder): void {\r\n section.write(writer);\r\n }\r\n\r\n writeTypeSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Type, this.moduleBuilder._types);\r\n }\r\n\r\n writeImportSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Import, this.moduleBuilder._imports);\r\n }\r\n\r\n writeFunctionSection(writer: BinaryWriter): void {\r\n if (this.moduleBuilder._functions.length === 0) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._functions.length);\r\n for (let index = 0; index < this.moduleBuilder._functions.length; index++) {\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._functions[index].funcTypeBuilder.index);\r\n }\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, SectionType.Function, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeTableSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Table, this.moduleBuilder._tables);\r\n }\r\n\r\n writeMemorySection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Memory, this.moduleBuilder._memories);\r\n }\r\n\r\n writeGlobalSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Global, this.moduleBuilder._globals);\r\n }\r\n\r\n writeExportSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Export, this.moduleBuilder._exports);\r\n }\r\n\r\n writeStartSection(writer: BinaryWriter): void {\r\n if (!this.moduleBuilder._startFunction) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._startFunction._index);\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, SectionType.Start, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeElementSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Element, this.moduleBuilder._elements);\r\n }\r\n\r\n writeCodeSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Code, this.moduleBuilder._functions);\r\n }\r\n\r\n writeDataSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Data, this.moduleBuilder._data);\r\n }\r\n\r\n writeNameSection(writer: BinaryWriter): void {\r\n const mod = this.moduleBuilder;\r\n const nameWriter = new BinaryWriter();\r\n\r\n // Sub-section 0: module name\r\n const moduleNameWriter = new BinaryWriter();\r\n moduleNameWriter.writeVarUInt32(mod._name.length);\r\n moduleNameWriter.writeString(mod._name);\r\n nameWriter.writeVarUInt7(0);\r\n nameWriter.writeVarUInt32(moduleNameWriter.length);\r\n nameWriter.writeBytes(moduleNameWriter);\r\n\r\n // Sub-section 1: function names\r\n const allFunctions = [\r\n ...mod._imports.filter((x) => x.externalKind.value === 0),\r\n ...mod._functions,\r\n ];\r\n if (allFunctions.length > 0) {\r\n const funcNameWriter = new BinaryWriter();\r\n funcNameWriter.writeVarUInt32(allFunctions.length);\r\n allFunctions.forEach((f, i) => {\r\n const name = 'name' in f ? f.name : `${f.moduleName}.${f.fieldName}`;\r\n funcNameWriter.writeVarUInt32(i);\r\n funcNameWriter.writeVarUInt32(name.length);\r\n funcNameWriter.writeString(name);\r\n });\r\n nameWriter.writeVarUInt7(1);\r\n nameWriter.writeVarUInt32(funcNameWriter.length);\r\n nameWriter.writeBytes(funcNameWriter);\r\n }\r\n\r\n // Sub-section 2: local names (parameters + locals per function)\r\n const functionsWithNames = mod._functions.filter((f) => {\r\n if (!f.functionEmitter) return false;\r\n const hasNamedParam = f.parameters.some((p) => p.name !== null);\r\n const hasNamedLocal = f.functionEmitter._locals.some((l) => l.name !== null);\r\n return hasNamedParam || hasNamedLocal;\r\n });\r\n if (functionsWithNames.length > 0) {\r\n const localNameWriter = new BinaryWriter();\r\n localNameWriter.writeVarUInt32(functionsWithNames.length);\r\n functionsWithNames.forEach((f) => {\r\n localNameWriter.writeVarUInt32(f._index);\r\n const namedEntries: { index: number; name: string }[] = [];\r\n f.parameters.forEach((p, i) => {\r\n if (p.name !== null) {\r\n namedEntries.push({ index: i, name: p.name });\r\n }\r\n });\r\n if (f.functionEmitter) {\r\n f.functionEmitter._locals.forEach((l) => {\r\n if (l.name !== null) {\r\n namedEntries.push({ index: l.index, name: l.name });\r\n }\r\n });\r\n }\r\n localNameWriter.writeVarUInt32(namedEntries.length);\r\n namedEntries.forEach((entry) => {\r\n localNameWriter.writeVarUInt32(entry.index);\r\n localNameWriter.writeVarUInt32(entry.name.length);\r\n localNameWriter.writeString(entry.name);\r\n });\r\n });\r\n nameWriter.writeVarUInt7(2);\r\n nameWriter.writeVarUInt32(localNameWriter.length);\r\n nameWriter.writeBytes(localNameWriter);\r\n }\r\n\r\n // Sub-section 7: global names\r\n const namedGlobals: { index: number; name: string }[] = [];\r\n mod._imports.forEach((imp) => {\r\n if (imp.externalKind.value === 3) {\r\n namedGlobals.push({ index: imp.index, name: `${imp.moduleName}.${imp.fieldName}` });\r\n }\r\n });\r\n mod._globals.forEach((g) => {\r\n if (g.name !== null) {\r\n namedGlobals.push({ index: g._index, name: g.name });\r\n }\r\n });\r\n if (namedGlobals.length > 0) {\r\n const globalNameWriter = new BinaryWriter();\r\n globalNameWriter.writeVarUInt32(namedGlobals.length);\r\n namedGlobals.forEach((entry) => {\r\n globalNameWriter.writeVarUInt32(entry.index);\r\n globalNameWriter.writeVarUInt32(entry.name.length);\r\n globalNameWriter.writeString(entry.name);\r\n });\r\n nameWriter.writeVarUInt7(7);\r\n nameWriter.writeVarUInt32(globalNameWriter.length);\r\n nameWriter.writeBytes(globalNameWriter);\r\n }\r\n\r\n // Write as custom section with name \"name\"\r\n const sectionWriter = new BinaryWriter();\r\n const sectionName = 'name';\r\n sectionWriter.writeVarUInt32(sectionName.length);\r\n sectionWriter.writeString(sectionName);\r\n sectionWriter.writeBytes(nameWriter);\r\n\r\n writer.writeVarUInt7(0); // custom section id\r\n writer.writeVarUInt32(sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeCustomSections(writer: BinaryWriter): void {\r\n // Write user-defined custom sections (excluding \"name\" which is reserved)\r\n this.moduleBuilder._customSections.forEach((x) => {\r\n BinaryModuleWriter.writeCustomSection(writer, x);\r\n });\r\n\r\n // Auto-generate name section if enabled and not user-provided\r\n if (this.moduleBuilder._options.generateNameSection) {\r\n this.writeNameSection(writer);\r\n }\r\n }\r\n\r\n write(): Uint8Array {\r\n const writer = new BinaryWriter();\r\n writer.writeUInt32(MagicHeader);\r\n writer.writeUInt32(Version);\r\n\r\n this.writeTypeSection(writer);\r\n this.writeImportSection(writer);\r\n this.writeFunctionSection(writer);\r\n this.writeTableSection(writer);\r\n this.writeMemorySection(writer);\r\n this.writeGlobalSection(writer);\r\n this.writeExportSection(writer);\r\n this.writeStartSection(writer);\r\n this.writeElementSection(writer);\r\n this.writeCodeSection(writer);\r\n this.writeDataSection(writer);\r\n this.writeCustomSections(writer);\r\n\r\n return writer.toArray();\r\n }\r\n}\r\n", "import {\r\n SectionType,\r\n SectionTypeDescriptor,\r\n ExternalKind,\r\n ValueType,\r\n ElementType,\r\n ValueTypeDescriptor,\r\n ImmediateType,\r\n LanguageType,\r\n} from './types';\r\n\r\nexport interface ModuleInfo {\r\n version: number;\r\n types: FuncTypeInfo[];\r\n imports: ImportInfo[];\r\n functions: FunctionInfo[];\r\n tables: TableInfo[];\r\n memories: MemoryInfo[];\r\n globals: GlobalInfo[];\r\n exports: ExportInfo[];\r\n start: number | null;\r\n elements: ElementInfo[];\r\n data: DataInfo[];\r\n customSections: CustomSectionInfo[];\r\n nameSection?: NameSectionInfo;\r\n}\r\n\r\nexport interface FuncTypeInfo {\r\n parameterTypes: ValueTypeDescriptor[];\r\n returnTypes: ValueTypeDescriptor[];\r\n}\r\n\r\nexport interface ImportInfo {\r\n moduleName: string;\r\n fieldName: string;\r\n kind: number;\r\n typeIndex?: number;\r\n tableType?: { elementType: number; initial: number; maximum: number | null };\r\n memoryType?: { initial: number; maximum: number | null };\r\n globalType?: { valueType: number; mutable: boolean };\r\n}\r\n\r\nexport interface FunctionInfo {\r\n typeIndex: number;\r\n locals: { count: number; type: number }[];\r\n body: Uint8Array;\r\n}\r\n\r\nexport interface TableInfo {\r\n elementType: number;\r\n initial: number;\r\n maximum: number | null;\r\n}\r\n\r\nexport interface MemoryInfo {\r\n initial: number;\r\n maximum: number | null;\r\n}\r\n\r\nexport interface GlobalInfo {\r\n valueType: number;\r\n mutable: boolean;\r\n initExpr: Uint8Array;\r\n}\r\n\r\nexport interface ExportInfo {\r\n name: string;\r\n kind: number;\r\n index: number;\r\n}\r\n\r\nexport interface ElementInfo {\r\n tableIndex: number;\r\n offsetExpr: Uint8Array;\r\n functionIndices: number[];\r\n}\r\n\r\nexport interface DataInfo {\r\n memoryIndex: number;\r\n offsetExpr: Uint8Array;\r\n data: Uint8Array;\r\n}\r\n\r\nexport interface CustomSectionInfo {\r\n name: string;\r\n data: Uint8Array;\r\n}\r\n\r\nexport interface NameSectionInfo {\r\n moduleName?: string;\r\n functionNames?: Map;\r\n localNames?: Map>;\r\n globalNames?: Map;\r\n}\r\n\r\nconst MagicHeader = 0x6d736100;\r\n\r\nexport default class BinaryReader {\r\n buffer: Uint8Array;\r\n offset: number;\r\n\r\n constructor(buffer: Uint8Array) {\r\n this.buffer = buffer;\r\n this.offset = 0;\r\n }\r\n\r\n read(): ModuleInfo {\r\n const magic = this.readUInt32();\r\n if (magic !== MagicHeader) {\r\n throw new Error(`Invalid WASM magic header: 0x${magic.toString(16)}`);\r\n }\r\n\r\n const version = this.readUInt32();\r\n if (version !== 1) {\r\n throw new Error(`Unsupported WASM version: ${version}`);\r\n }\r\n\r\n const module: ModuleInfo = {\r\n version,\r\n types: [],\r\n imports: [],\r\n functions: [],\r\n tables: [],\r\n memories: [],\r\n globals: [],\r\n exports: [],\r\n start: null,\r\n elements: [],\r\n data: [],\r\n customSections: [],\r\n };\r\n\r\n // Track function type indices separately (function section only stores type indices)\r\n const functionTypeIndices: number[] = [];\r\n\r\n while (this.offset < this.buffer.length) {\r\n const sectionId = this.readVarUInt7();\r\n const sectionSize = this.readVarUInt32();\r\n const sectionEnd = this.offset + sectionSize;\r\n\r\n switch (sectionId) {\r\n case 0: // Custom\r\n this.readCustomSection(module, sectionEnd);\r\n break;\r\n case 1: // Type\r\n this.readTypeSection(module);\r\n break;\r\n case 2: // Import\r\n this.readImportSection(module);\r\n break;\r\n case 3: // Function\r\n this.readFunctionSection(functionTypeIndices);\r\n break;\r\n case 4: // Table\r\n this.readTableSection(module);\r\n break;\r\n case 5: // Memory\r\n this.readMemorySection(module);\r\n break;\r\n case 6: // Global\r\n this.readGlobalSection(module);\r\n break;\r\n case 7: // Export\r\n this.readExportSection(module);\r\n break;\r\n case 8: // Start\r\n module.start = this.readVarUInt32();\r\n break;\r\n case 9: // Element\r\n this.readElementSection(module);\r\n break;\r\n case 10: // Code\r\n this.readCodeSection(module, functionTypeIndices);\r\n break;\r\n case 11: // Data\r\n this.readDataSection(module);\r\n break;\r\n default:\r\n // Skip unknown section\r\n this.offset = sectionEnd;\r\n break;\r\n }\r\n\r\n this.offset = sectionEnd;\r\n }\r\n\r\n return module;\r\n }\r\n\r\n private readCustomSection(module: ModuleInfo, sectionEnd: number): void {\r\n const nameLen = this.readVarUInt32();\r\n const name = this.readString(nameLen);\r\n\r\n if (name === 'name') {\r\n module.nameSection = this.readNameSection(sectionEnd);\r\n return;\r\n }\r\n\r\n const remaining = sectionEnd - this.offset;\r\n const data = this.readBytes(remaining);\r\n module.customSections.push({ name, data });\r\n }\r\n\r\n private readNameSection(sectionEnd: number): NameSectionInfo {\r\n const info: NameSectionInfo = {};\r\n\r\n while (this.offset < sectionEnd) {\r\n const subsectionId = this.readVarUInt7();\r\n const subsectionSize = this.readVarUInt32();\r\n const subsectionEnd = this.offset + subsectionSize;\r\n\r\n switch (subsectionId) {\r\n case 0: { // module name\r\n const len = this.readVarUInt32();\r\n info.moduleName = this.readString(len);\r\n break;\r\n }\r\n case 1: { // function names\r\n const count = this.readVarUInt32();\r\n info.functionNames = new Map();\r\n for (let i = 0; i < count; i++) {\r\n const index = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n info.functionNames.set(index, this.readString(len));\r\n }\r\n break;\r\n }\r\n case 2: { // local names\r\n const funcCount = this.readVarUInt32();\r\n info.localNames = new Map();\r\n for (let i = 0; i < funcCount; i++) {\r\n const funcIndex = this.readVarUInt32();\r\n const localCount = this.readVarUInt32();\r\n const locals = new Map();\r\n for (let j = 0; j < localCount; j++) {\r\n const localIndex = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n locals.set(localIndex, this.readString(len));\r\n }\r\n info.localNames.set(funcIndex, locals);\r\n }\r\n break;\r\n }\r\n case 7: { // global names\r\n const count = this.readVarUInt32();\r\n info.globalNames = new Map();\r\n for (let i = 0; i < count; i++) {\r\n const index = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n info.globalNames.set(index, this.readString(len));\r\n }\r\n break;\r\n }\r\n default:\r\n // Skip unknown subsections\r\n this.offset = subsectionEnd;\r\n break;\r\n }\r\n\r\n this.offset = subsectionEnd;\r\n }\r\n\r\n return info;\r\n }\r\n\r\n private readTypeSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const form = this.readVarInt7(); // 0x60 = func\r\n const paramCount = this.readVarUInt32();\r\n const parameterTypes: ValueTypeDescriptor[] = [];\r\n for (let j = 0; j < paramCount; j++) {\r\n parameterTypes.push(this.readValueType());\r\n }\r\n const returnCount = this.readVarUInt32();\r\n const returnTypes: ValueTypeDescriptor[] = [];\r\n for (let j = 0; j < returnCount; j++) {\r\n returnTypes.push(this.readValueType());\r\n }\r\n module.types.push({ parameterTypes, returnTypes });\r\n }\r\n }\r\n\r\n private readImportSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const moduleNameLen = this.readVarUInt32();\r\n const moduleName = this.readString(moduleNameLen);\r\n const fieldNameLen = this.readVarUInt32();\r\n const fieldName = this.readString(fieldNameLen);\r\n const kind = this.readUInt8();\r\n\r\n const imp: ImportInfo = { moduleName, fieldName, kind };\r\n\r\n switch (kind) {\r\n case 0: // Function\r\n imp.typeIndex = this.readVarUInt32();\r\n break;\r\n case 1: { // Table\r\n const elementType = this.readVarInt7();\r\n const { initial, maximum } = this.readResizableLimits();\r\n imp.tableType = { elementType, initial, maximum };\r\n break;\r\n }\r\n case 2: { // Memory\r\n const { initial, maximum } = this.readResizableLimits();\r\n imp.memoryType = { initial, maximum };\r\n break;\r\n }\r\n case 3: { // Global\r\n const valueType = this.readVarInt7();\r\n const mutable = this.readVarUInt1() === 1;\r\n imp.globalType = { valueType, mutable };\r\n break;\r\n }\r\n }\r\n\r\n module.imports.push(imp);\r\n }\r\n }\r\n\r\n private readFunctionSection(functionTypeIndices: number[]): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n functionTypeIndices.push(this.readVarUInt32());\r\n }\r\n }\r\n\r\n private readTableSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const elementType = this.readVarInt7();\r\n const { initial, maximum } = this.readResizableLimits();\r\n module.tables.push({ elementType, initial, maximum });\r\n }\r\n }\r\n\r\n private readMemorySection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const { initial, maximum } = this.readResizableLimits();\r\n module.memories.push({ initial, maximum });\r\n }\r\n }\r\n\r\n private readGlobalSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const valueType = this.readVarInt7();\r\n const mutable = this.readVarUInt1() === 1;\r\n const initExpr = this.readInitExpr();\r\n module.globals.push({ valueType, mutable, initExpr });\r\n }\r\n }\r\n\r\n private readExportSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const nameLen = this.readVarUInt32();\r\n const name = this.readString(nameLen);\r\n const kind = this.readUInt8();\r\n const index = this.readVarUInt32();\r\n module.exports.push({ name, kind, index });\r\n }\r\n }\r\n\r\n private readElementSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const tableIndex = this.readVarUInt32();\r\n const offsetExpr = this.readInitExpr();\r\n const numElems = this.readVarUInt32();\r\n const functionIndices: number[] = [];\r\n for (let j = 0; j < numElems; j++) {\r\n functionIndices.push(this.readVarUInt32());\r\n }\r\n module.elements.push({ tableIndex, offsetExpr, functionIndices });\r\n }\r\n }\r\n\r\n private readCodeSection(module: ModuleInfo, functionTypeIndices: number[]): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const bodySize = this.readVarUInt32();\r\n const bodyEnd = this.offset + bodySize;\r\n\r\n const localCount = this.readVarUInt32();\r\n const locals: { count: number; type: number }[] = [];\r\n for (let j = 0; j < localCount; j++) {\r\n const lCount = this.readVarUInt32();\r\n const type = this.readVarInt7();\r\n locals.push({ count: lCount, type });\r\n }\r\n\r\n const bodyLength = bodyEnd - this.offset;\r\n const body = this.readBytes(bodyLength);\r\n\r\n module.functions.push({\r\n typeIndex: functionTypeIndices[i],\r\n locals,\r\n body,\r\n });\r\n\r\n this.offset = bodyEnd;\r\n }\r\n }\r\n\r\n private readDataSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const memoryIndex = this.readVarUInt32();\r\n const offsetExpr = this.readInitExpr();\r\n const dataSize = this.readVarUInt32();\r\n const data = this.readBytes(dataSize);\r\n module.data.push({ memoryIndex, offsetExpr, data });\r\n }\r\n }\r\n\r\n private readInitExpr(): Uint8Array {\r\n const start = this.offset;\r\n // Read until we hit 0x0b (end opcode)\r\n while (this.offset < this.buffer.length) {\r\n const byte = this.buffer[this.offset++];\r\n if (byte === 0x0b) {\r\n break;\r\n }\r\n // Skip over immediate operands for known init expression opcodes\r\n switch (byte) {\r\n case 0x41: // i32.const\r\n this.readVarInt32();\r\n break;\r\n case 0x42: // i64.const\r\n this.readVarInt64();\r\n break;\r\n case 0x43: // f32.const\r\n this.offset += 4;\r\n break;\r\n case 0x44: // f64.const\r\n this.offset += 8;\r\n break;\r\n case 0x23: // global.get\r\n this.readVarUInt32();\r\n break;\r\n }\r\n }\r\n return this.buffer.slice(start, this.offset);\r\n }\r\n\r\n private readResizableLimits(): { initial: number; maximum: number | null } {\r\n const flags = this.readVarUInt1();\r\n const initial = this.readVarUInt32();\r\n const maximum = flags === 1 ? this.readVarUInt32() : null;\r\n return { initial, maximum };\r\n }\r\n\r\n private readValueType(): ValueTypeDescriptor {\r\n const value = this.readVarInt7();\r\n // Value types are signed: -1=i32, -2=i64, -3=f32, -4=f64\r\n switch (value) {\r\n case -1: return ValueType.Int32;\r\n case -2: return ValueType.Int64;\r\n case -3: return ValueType.Float32;\r\n case -4: return ValueType.Float64;\r\n default:\r\n throw new Error(`Unknown value type: 0x${(value & 0xff).toString(16)}`);\r\n }\r\n }\r\n\r\n // --- Primitive readers ---\r\n\r\n private readUInt8(): number {\r\n return this.buffer[this.offset++];\r\n }\r\n\r\n private readUInt32(): number {\r\n const value =\r\n this.buffer[this.offset] |\r\n (this.buffer[this.offset + 1] << 8) |\r\n (this.buffer[this.offset + 2] << 16) |\r\n (this.buffer[this.offset + 3] << 24);\r\n this.offset += 4;\r\n return value >>> 0;\r\n }\r\n\r\n private readVarUInt1(): number {\r\n return this.buffer[this.offset++] & 1;\r\n }\r\n\r\n private readVarUInt7(): number {\r\n return this.buffer[this.offset++] & 0x7f;\r\n }\r\n\r\n private readVarUInt32(): number {\r\n let result = 0;\r\n let shift = 0;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= (byte & 0x7f) << shift;\r\n shift += 7;\r\n } while (byte & 0x80);\r\n return result >>> 0;\r\n }\r\n\r\n private readVarInt7(): number {\r\n const byte = this.buffer[this.offset++];\r\n return byte & 0x40 ? byte | 0xffffff80 : byte & 0x7f;\r\n }\r\n\r\n private readVarInt32(): number {\r\n let result = 0;\r\n let shift = 0;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= (byte & 0x7f) << shift;\r\n shift += 7;\r\n } while (byte & 0x80);\r\n if (shift < 32 && byte & 0x40) {\r\n result |= -(1 << shift);\r\n }\r\n return result;\r\n }\r\n\r\n private readVarInt64(): bigint {\r\n let result = 0n;\r\n let shift = 0n;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= BigInt(byte & 0x7f) << shift;\r\n shift += 7n;\r\n } while (byte & 0x80);\r\n if (shift < 64n && byte & 0x40) {\r\n result |= -(1n << shift);\r\n }\r\n return result;\r\n }\r\n\r\n private readString(length: number): string {\r\n const bytes = this.buffer.slice(this.offset, this.offset + length);\r\n this.offset += length;\r\n return new TextDecoder().decode(bytes);\r\n }\r\n\r\n private readBytes(length: number): Uint8Array {\r\n const bytes = this.buffer.slice(this.offset, this.offset + length);\r\n this.offset += length;\r\n return bytes;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { SectionType, SectionTypeDescriptor } from './types';\r\n\r\nexport default class CustomSectionBuilder {\r\n name: string;\r\n type: SectionTypeDescriptor;\r\n _data: Uint8Array;\r\n\r\n constructor(name: string, data?: Uint8Array) {\r\n this.name = name;\r\n this.type = SectionType.createCustom(name);\r\n this._data = data || new Uint8Array(0);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.name.length);\r\n sectionWriter.writeString(this.name);\r\n if (this._data.length > 0) {\r\n sectionWriter.writeBytes(this._data);\r\n }\r\n\r\n writer.writeVarUInt7(0); // custom section id\r\n writer.writeVarUInt32(sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FunctionParameterBuilder {\r\n name: string | null;\r\n valueType: ValueTypeDescriptor;\r\n index: number;\r\n\r\n constructor(valueType: ValueTypeDescriptor, index: number) {\r\n this.name = null;\r\n this.valueType = valueType;\r\n this.index = index;\r\n }\r\n\r\n withName(name: string): this {\r\n this.name = name;\r\n return this;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class LocalBuilder {\r\n index: number;\r\n valueType: ValueTypeDescriptor;\r\n name: string | null;\r\n count: number;\r\n\r\n constructor(valueType: ValueTypeDescriptor, name: string | null, index: number, count: number) {\r\n this.index = index;\r\n this.valueType = valueType;\r\n this.name = name;\r\n this.count = count;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.count);\r\n writer.writeVarInt7(this.valueType.value);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class GlobalType {\r\n private _valueType: ValueTypeDescriptor;\r\n private _mutable: boolean;\r\n\r\n constructor(valueType: ValueTypeDescriptor, mutable: boolean) {\r\n this._valueType = valueType;\r\n this._mutable = mutable;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n return this._valueType;\r\n }\r\n\r\n get mutable(): boolean {\r\n return this._mutable;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarInt7(this._valueType.value);\r\n writer.writeVarUInt1(this._mutable ? 1 : 0);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import GlobalType from './GlobalType';\r\nimport { InitExpressionType, ValueType, ValueTypeDescriptor } from './types';\r\nimport InitExpressionEmitter from './InitExpressionEmitter';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class GlobalBuilder {\r\n _globalType: GlobalType;\r\n _index: number;\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n _moduleBuilder: ModuleBuilder;\r\n name: string | null = null;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._globalType = new GlobalType(valueType, mutable);\r\n this._index = index;\r\n }\r\n\r\n withName(name: string): this {\r\n this.name = name;\r\n return this;\r\n }\r\n\r\n get globalType(): GlobalType {\r\n return this._globalType;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n return this._globalType.valueType;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Global,\r\n this.valueType\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n value(value: number | bigint | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number' || typeof value === 'bigint') {\r\n this.createInitEmitter((asm) => {\r\n const vt = this.valueType;\r\n if (vt === ValueType.Int32) {\r\n asm.const_i32(Number(value));\r\n } else if (vt === ValueType.Int64) {\r\n asm.const_i64(BigInt(value));\r\n } else if (vt === ValueType.Float32) {\r\n asm.const_f32(Number(value));\r\n } else if (vt === ValueType.Float64) {\r\n asm.const_f64(Number(value));\r\n } else {\r\n throw new Error(`Unsupported global value type: ${vt.name}`);\r\n }\r\n });\r\n } else {\r\n throw new Error('Unsupported global value.');\r\n }\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportGlobal(this, name);\r\n return this;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n this._globalType.write(writer);\r\n this._initExpressionEmitter.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ExternalKind, ExternalKindType } from './types';\r\nimport GlobalType from './GlobalType';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport MemoryType from './MemoryType';\r\nimport TableType from './TableType';\r\n\r\nexport default class ImportBuilder {\r\n moduleName: string;\r\n fieldName: string;\r\n externalKind: ExternalKindType;\r\n data: FuncTypeBuilder | GlobalType | MemoryType | TableType;\r\n index: number;\r\n\r\n constructor(\r\n moduleName: string,\r\n fieldName: string,\r\n externalKind: ExternalKindType,\r\n data: FuncTypeBuilder | GlobalType | MemoryType | TableType,\r\n index: number\r\n ) {\r\n this.moduleName = moduleName;\r\n this.fieldName = fieldName;\r\n this.externalKind = externalKind;\r\n this.data = data;\r\n this.index = index;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.moduleName.length);\r\n writer.writeString(this.moduleName);\r\n writer.writeVarUInt32(this.fieldName.length);\r\n writer.writeString(this.fieldName);\r\n writer.writeUInt8(this.externalKind.value);\r\n switch (this.externalKind) {\r\n case ExternalKind.Function:\r\n writer.writeVarUInt32((this.data as FuncTypeBuilder).index);\r\n break;\r\n\r\n case ExternalKind.Global:\r\n case ExternalKind.Memory:\r\n case ExternalKind.Table:\r\n (this.data as GlobalType | MemoryType | TableType).write(writer);\r\n break;\r\n\r\n default:\r\n throw new Error('Unknown external kind.');\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport { ExternalKind, BlockTypeDescriptor } from './types';\r\n\r\nexport default class ImmediateEncoder {\r\n static encodeBlockSignature(writer: BinaryWriter, blockType: BlockTypeDescriptor): void {\r\n writer.writeVarInt7(blockType.value);\r\n }\r\n\r\n static encodeRelativeDepth(writer: BinaryWriter, label: any, depth: number): void {\r\n const relativeDepth = depth - label.block.depth;\r\n writer.writeVarInt7(relativeDepth);\r\n }\r\n\r\n static encodeBranchTable(\r\n writer: BinaryWriter,\r\n defaultLabel: number,\r\n labels: number[]\r\n ): void {\r\n writer.writeVarUInt32(labels.length);\r\n labels.forEach((x) => {\r\n writer.writeVarUInt32(x);\r\n });\r\n writer.writeVarUInt32(defaultLabel);\r\n }\r\n\r\n static encodeFunction(writer: BinaryWriter, func: FunctionBuilder | ImportBuilder | number): void {\r\n let functionIndex = 0;\r\n if (func instanceof ImportBuilder) {\r\n functionIndex = func.index;\r\n } else if (typeof func === 'object' && func !== null && '_index' in func) {\r\n functionIndex = (func as FunctionBuilder)._index;\r\n } else if (typeof func === 'number') {\r\n functionIndex = func;\r\n } else {\r\n throw new Error(\r\n 'Function argument must either be the index of the function or a FunctionBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(functionIndex);\r\n }\r\n\r\n static encodeIndirectFunction(writer: BinaryWriter, funcType: FuncTypeBuilder): void {\r\n writer.writeVarUInt32(funcType.index);\r\n writer.writeVarUInt1(0);\r\n }\r\n\r\n static encodeLocal(\r\n writer: BinaryWriter,\r\n local: LocalBuilder | FunctionParameterBuilder | number\r\n ): void {\r\n Arg.notNull('local', local);\r\n\r\n let localIndex = 0;\r\n if (local instanceof LocalBuilder) {\r\n localIndex = local.index;\r\n } else if (local instanceof FunctionParameterBuilder) {\r\n localIndex = local.index;\r\n } else if (typeof local === 'number') {\r\n localIndex = local;\r\n } else {\r\n throw new Error(\r\n 'Local argument must either be the index of the local variable or a LocalBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(localIndex);\r\n }\r\n\r\n static encodeGlobal(\r\n writer: BinaryWriter,\r\n global: GlobalBuilder | ImportBuilder | number\r\n ): void {\r\n Arg.notNull('global', global);\r\n\r\n let globalIndex = 0;\r\n if (global instanceof GlobalBuilder) {\r\n globalIndex = global._index;\r\n } else if (global instanceof ImportBuilder) {\r\n if (global.externalKind !== ExternalKind.Global) {\r\n throw new Error('Import external kind must be global.');\r\n }\r\n globalIndex = global.index;\r\n } else if (typeof global === 'number') {\r\n globalIndex = global;\r\n } else {\r\n throw new Error(\r\n 'Global argument must either be the index of the global variable, GlobalBuilder, or an ImportBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(globalIndex);\r\n }\r\n\r\n static encodeFloat32(writer: BinaryWriter, value: number): void {\r\n writer.writeFloat32(value);\r\n }\r\n\r\n static encodeFloat64(writer: BinaryWriter, value: number): void {\r\n writer.writeFloat64(value);\r\n }\r\n\r\n static encodeVarInt32(writer: BinaryWriter, value: number): void {\r\n writer.writeVarInt32(value);\r\n }\r\n\r\n static encodeVarInt64(writer: BinaryWriter, value: number | bigint): void {\r\n writer.writeVarInt64(value);\r\n }\r\n\r\n static encodeVarUInt32(writer: BinaryWriter, value: number): void {\r\n writer.writeVarUInt32(value);\r\n }\r\n\r\n static encodeVarUInt1(writer: BinaryWriter, value: number): void {\r\n writer.writeVarUInt1(value);\r\n }\r\n\r\n static encodeMemoryImmediate(\r\n writer: BinaryWriter,\r\n alignment: number,\r\n offset: number\r\n ): void {\r\n writer.writeVarUInt32(alignment);\r\n writer.writeVarUInt32(offset);\r\n }\r\n\r\n static encodeV128Const(writer: BinaryWriter, bytes: Uint8Array): void {\r\n for (let i = 0; i < 16; i++) {\r\n writer.writeByte(bytes[i]);\r\n }\r\n }\r\n\r\n static encodeLaneIndex(writer: BinaryWriter, index: number): void {\r\n writer.writeByte(index);\r\n }\r\n\r\n static encodeShuffleMask(writer: BinaryWriter, mask: Uint8Array): void {\r\n for (let i = 0; i < 16; i++) {\r\n writer.writeByte(mask[i]);\r\n }\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport { ImmediateType } from './types';\r\nimport ImmediateEncoder from './ImmediateEncoder';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class Immediate {\r\n type: ImmediateType;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n values: any[];\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constructor(type: ImmediateType, values: any[]) {\r\n Arg.notNull('type', type);\r\n Arg.notNull('values', values);\r\n this.type = type;\r\n this.values = values;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createBlockSignature(blockType: any): Immediate {\r\n return new Immediate(ImmediateType.BlockSignature, [blockType]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createBranchTable(defaultLabel: any, labels: any[], depth: number): Immediate {\r\n const relativeDepths = labels.map((x) => {\r\n return depth - x.block.depth;\r\n });\r\n const defaultLabelDepth = depth - defaultLabel.block.depth;\r\n return new Immediate(ImmediateType.BranchTable, [defaultLabelDepth, relativeDepths]);\r\n }\r\n\r\n static createFloat32(value: number): Immediate {\r\n return new Immediate(ImmediateType.Float32, [value]);\r\n }\r\n\r\n static createFloat64(value: number): Immediate {\r\n return new Immediate(ImmediateType.Float64, [value]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createFunction(functionBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.Function, [functionBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createGlobal(globalBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.Global, [globalBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createIndirectFunction(functionTypeBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.IndirectFunction, [functionTypeBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createLocal(local: any): Immediate {\r\n return new Immediate(ImmediateType.Local, [local]);\r\n }\r\n\r\n static createMemoryImmediate(alignment: number, offset: number): Immediate {\r\n return new Immediate(ImmediateType.MemoryImmediate, [alignment, offset]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createRelativeDepth(label: any, depth: number): Immediate {\r\n return new Immediate(ImmediateType.RelativeDepth, [label, depth]);\r\n }\r\n\r\n static createVarUInt1(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarUInt1, [value]);\r\n }\r\n\r\n static createVarInt32(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarInt32, [value]);\r\n }\r\n\r\n static createVarInt64(value: number | bigint): Immediate {\r\n return new Immediate(ImmediateType.VarInt64, [value]);\r\n }\r\n\r\n static createVarUInt32(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarUInt32, [value]);\r\n }\r\n\r\n static createV128Const(bytes: Uint8Array): Immediate {\r\n if (bytes.length !== 16) {\r\n throw new Error('V128 constant must be exactly 16 bytes.');\r\n }\r\n return new Immediate(ImmediateType.V128Const, [bytes]);\r\n }\r\n\r\n static createLaneIndex(index: number): Immediate {\r\n return new Immediate(ImmediateType.LaneIndex, [index]);\r\n }\r\n\r\n static createShuffleMask(mask: Uint8Array): Immediate {\r\n if (mask.length !== 16) {\r\n throw new Error('Shuffle mask must be exactly 16 bytes.');\r\n }\r\n return new Immediate(ImmediateType.ShuffleMask, [mask]);\r\n }\r\n\r\n writeBytes(writer: BinaryWriter): void {\r\n switch (this.type) {\r\n case ImmediateType.BlockSignature:\r\n ImmediateEncoder.encodeBlockSignature(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.BranchTable:\r\n ImmediateEncoder.encodeBranchTable(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.Float32:\r\n ImmediateEncoder.encodeFloat32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Float64:\r\n ImmediateEncoder.encodeFloat64(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Function:\r\n ImmediateEncoder.encodeFunction(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Global:\r\n ImmediateEncoder.encodeGlobal(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.IndirectFunction:\r\n ImmediateEncoder.encodeIndirectFunction(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Local:\r\n ImmediateEncoder.encodeLocal(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.MemoryImmediate:\r\n ImmediateEncoder.encodeMemoryImmediate(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.RelativeDepth:\r\n ImmediateEncoder.encodeRelativeDepth(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.VarInt32:\r\n ImmediateEncoder.encodeVarInt32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarInt64:\r\n ImmediateEncoder.encodeVarInt64(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarUInt1:\r\n ImmediateEncoder.encodeVarUInt1(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarUInt32:\r\n ImmediateEncoder.encodeVarUInt32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.V128Const:\r\n ImmediateEncoder.encodeV128Const(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.LaneIndex:\r\n ImmediateEncoder.encodeLaneIndex(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.ShuffleMask:\r\n ImmediateEncoder.encodeShuffleMask(writer, this.values[0]);\r\n break;\r\n\r\n default:\r\n throw new Error('Cannot encode unknown operand type.');\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.writeBytes(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport Immediate from './Immediate';\r\nimport { OpCodeDef } from './types';\r\n\r\nexport default class Instruction {\r\n opCode: OpCodeDef;\r\n immediate: Immediate | null;\r\n\r\n constructor(opCode: OpCodeDef, immediate: Immediate | null) {\r\n Arg.notNull('opCode', opCode);\r\n this.opCode = opCode;\r\n this.immediate = immediate;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (this.opCode.prefix !== undefined) {\r\n writer.writeByte(this.opCode.prefix);\r\n writer.writeVarUInt32(this.opCode.value);\r\n } else {\r\n writer.writeByte(this.opCode.value);\r\n }\r\n if (this.immediate) {\r\n this.immediate.writeBytes(writer);\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import type ControlFlowBlock from './verification/ControlFlowBlock';\r\n\r\nexport default class LabelBuilder {\r\n resolved: boolean;\r\n block: ControlFlowBlock | null;\r\n\r\n constructor() {\r\n this.resolved = false;\r\n this.block = null;\r\n }\r\n\r\n get isResolved(): boolean {\r\n return this.resolved;\r\n }\r\n\r\n resolve(block: ControlFlowBlock): void {\r\n this.block = block;\r\n this.resolved = true;\r\n }\r\n\r\n reference(block: ControlFlowBlock): void {\r\n if (this.isResolved) {\r\n throw new Error('Cannot add a reference to a label that has been resolved.');\r\n }\r\n this.block = block;\r\n }\r\n}\r\n", "import type { OpCodeDef } from './types';\n\nconst OpCodes = {\n \"unreachable\": {\n value: 0,\n mnemonic: \"unreachable\",\n stackBehavior: \"None\",\n },\n \"nop\": {\n value: 1,\n mnemonic: \"nop\",\n stackBehavior: \"None\",\n },\n \"block\": {\n value: 2,\n mnemonic: \"block\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"None\",\n },\n \"loop\": {\n value: 3,\n mnemonic: \"loop\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"None\",\n },\n \"if\": {\n value: 4,\n mnemonic: \"if\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"else\": {\n value: 5,\n mnemonic: \"else\",\n stackBehavior: \"None\",\n },\n \"end\": {\n value: 11,\n mnemonic: \"end\",\n controlFlow: \"Pop\",\n stackBehavior: \"None\",\n },\n \"br\": {\n value: 12,\n mnemonic: \"br\",\n immediate: \"RelativeDepth\",\n stackBehavior: \"None\",\n },\n \"br_if\": {\n value: 13,\n mnemonic: \"br_if\",\n immediate: \"RelativeDepth\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"br_table\": {\n value: 14,\n mnemonic: \"br_table\",\n immediate: \"BranchTable\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"return\": {\n value: 15,\n mnemonic: \"return\",\n stackBehavior: \"None\",\n },\n \"call\": {\n value: 16,\n mnemonic: \"call\",\n immediate: \"Function\",\n stackBehavior: \"PopPush\",\n popOperands: [] as const,\n pushOperands: [] as const,\n },\n \"call_indirect\": {\n value: 17,\n mnemonic: \"call_indirect\",\n immediate: \"IndirectFunction\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [] as const,\n },\n \"drop\": {\n value: 26,\n mnemonic: \"drop\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"select\": {\n value: 27,\n mnemonic: \"select\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Any\",\"Any\"] as const,\n pushOperands: [\"Any\"] as const,\n },\n \"get_local\": {\n value: 32,\n mnemonic: \"local.get\",\n immediate: \"Local\",\n stackBehavior: \"Push\",\n pushOperands: [\"Any\"] as const,\n },\n \"set_local\": {\n value: 33,\n mnemonic: \"local.set\",\n immediate: \"Local\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"tee_local\": {\n value: 34,\n mnemonic: \"local.tee\",\n immediate: \"Local\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Any\"] as const,\n pushOperands: [\"Any\"] as const,\n },\n \"get_global\": {\n value: 35,\n mnemonic: \"global.get\",\n immediate: \"Global\",\n stackBehavior: \"Push\",\n pushOperands: [\"Any\"] as const,\n },\n \"set_global\": {\n value: 36,\n mnemonic: \"global.set\",\n immediate: \"Global\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"i32_load\": {\n value: 40,\n mnemonic: \"i32.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_load\": {\n value: 41,\n mnemonic: \"i64.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_load\": {\n value: 42,\n mnemonic: \"f32.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_load\": {\n value: 43,\n mnemonic: \"f64.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_load8_s\": {\n value: 44,\n mnemonic: \"i32.load8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load8_u\": {\n value: 45,\n mnemonic: \"i32.load8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load16_s\": {\n value: 46,\n mnemonic: \"i32.load16_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load16_u\": {\n value: 47,\n mnemonic: \"i32.load16_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_load8_s\": {\n value: 48,\n mnemonic: \"i64.load8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load8_u\": {\n value: 49,\n mnemonic: \"i64.load8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load16_s\": {\n value: 50,\n mnemonic: \"i64.load16_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load16_u\": {\n value: 51,\n mnemonic: \"i64.load16_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load32_s\": {\n value: 52,\n mnemonic: \"i64.load32_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load32_u\": {\n value: 53,\n mnemonic: \"i64.load32_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i32_store\": {\n value: 54,\n mnemonic: \"i32.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i64_store\": {\n value: 55,\n mnemonic: \"i64.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"f32_store\": {\n value: 56,\n mnemonic: \"f32.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Float32\"] as const,\n },\n \"f64_store\": {\n value: 57,\n mnemonic: \"f64.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Float64\"] as const,\n },\n \"i32_store8\": {\n value: 58,\n mnemonic: \"i32.store8\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i32_store16\": {\n value: 59,\n mnemonic: \"i32.store16\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i64_store8\": {\n value: 60,\n mnemonic: \"i64.store8\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"i64_store16\": {\n value: 61,\n mnemonic: \"i64.store16\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"i64_store32\": {\n value: 62,\n mnemonic: \"i64.store32\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"mem_size\": {\n value: 63,\n mnemonic: \"memory.size\",\n immediate: \"VarUInt1\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n },\n \"mem_grow\": {\n value: 64,\n mnemonic: \"memory.grow\",\n immediate: \"VarUInt1\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_const\": {\n value: 65,\n mnemonic: \"i32.const\",\n immediate: \"VarInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_const\": {\n value: 66,\n mnemonic: \"i64.const\",\n immediate: \"VarInt64\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_const\": {\n value: 67,\n mnemonic: \"f32.const\",\n immediate: \"Float32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_const\": {\n value: 68,\n mnemonic: \"f64.const\",\n immediate: \"Float64\",\n stackBehavior: \"Push\",\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_eqz\": {\n value: 69,\n mnemonic: \"i32.eqz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_eq\": {\n value: 70,\n mnemonic: \"i32.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ne\": {\n value: 71,\n mnemonic: \"i32.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_lt_s\": {\n value: 72,\n mnemonic: \"i32.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_lt_u\": {\n value: 73,\n mnemonic: \"i32.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_gt_s\": {\n value: 74,\n mnemonic: \"i32.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_gt_u\": {\n value: 75,\n mnemonic: \"i32.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_le_s\": {\n value: 76,\n mnemonic: \"i32.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_le_u\": {\n value: 77,\n mnemonic: \"i32.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ge_s\": {\n value: 78,\n mnemonic: \"i32.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ge_u\": {\n value: 79,\n mnemonic: \"i32.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_eqz\": {\n value: 80,\n mnemonic: \"i64.eqz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_eq\": {\n value: 81,\n mnemonic: \"i64.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ne\": {\n value: 82,\n mnemonic: \"i64.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_lt_s\": {\n value: 83,\n mnemonic: \"i64.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_lt_u\": {\n value: 84,\n mnemonic: \"i64.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_gt_s\": {\n value: 85,\n mnemonic: \"i64.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_gt_u\": {\n value: 86,\n mnemonic: \"i64.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_le_s\": {\n value: 87,\n mnemonic: \"i64.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_le_u\": {\n value: 88,\n mnemonic: \"i64.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ge_s\": {\n value: 89,\n mnemonic: \"i64.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ge_u\": {\n value: 90,\n mnemonic: \"i64.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_eq\": {\n value: 91,\n mnemonic: \"f32.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_ne\": {\n value: 92,\n mnemonic: \"f32.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_lt\": {\n value: 93,\n mnemonic: \"f32.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_gt\": {\n value: 94,\n mnemonic: \"f32.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_le\": {\n value: 95,\n mnemonic: \"f32.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_ge\": {\n value: 96,\n mnemonic: \"f32.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_eq\": {\n value: 97,\n mnemonic: \"f64.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_ne\": {\n value: 98,\n mnemonic: \"f64.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_lt\": {\n value: 99,\n mnemonic: \"f64.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_gt\": {\n value: 100,\n mnemonic: \"f64.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_le\": {\n value: 101,\n mnemonic: \"f64.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_ge\": {\n value: 102,\n mnemonic: \"f64.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_clz\": {\n value: 103,\n mnemonic: \"i32.clz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ctz\": {\n value: 104,\n mnemonic: \"i32.ctz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_popcnt\": {\n value: 105,\n mnemonic: \"i32.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_add\": {\n value: 106,\n mnemonic: \"i32.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_sub\": {\n value: 107,\n mnemonic: \"i32.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_mul\": {\n value: 108,\n mnemonic: \"i32.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_div_s\": {\n value: 109,\n mnemonic: \"i32.div_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_div_u\": {\n value: 110,\n mnemonic: \"i32.div_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rem_s\": {\n value: 111,\n mnemonic: \"i32.rem_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rem_u\": {\n value: 112,\n mnemonic: \"i32.rem_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_and\": {\n value: 113,\n mnemonic: \"i32.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_or\": {\n value: 114,\n mnemonic: \"i32.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_xor\": {\n value: 115,\n mnemonic: \"i32.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shl\": {\n value: 116,\n mnemonic: \"i32.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shr_s\": {\n value: 117,\n mnemonic: \"i32.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shr_u\": {\n value: 118,\n mnemonic: \"i32.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rotl\": {\n value: 119,\n mnemonic: \"i32.rotl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rotr\": {\n value: 120,\n mnemonic: \"i32.rotr\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_clz\": {\n value: 121,\n mnemonic: \"i64.clz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_ctz\": {\n value: 122,\n mnemonic: \"i64.ctz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_popcnt\": {\n value: 123,\n mnemonic: \"i64.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_add\": {\n value: 124,\n mnemonic: \"i64.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_sub\": {\n value: 125,\n mnemonic: \"i64.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_mul\": {\n value: 126,\n mnemonic: \"i64.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_div_s\": {\n value: 127,\n mnemonic: \"i64.div_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_div_u\": {\n value: 128,\n mnemonic: \"i64.div_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rem_s\": {\n value: 129,\n mnemonic: \"i64.rem_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rem_u\": {\n value: 130,\n mnemonic: \"i64.rem_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_and\": {\n value: 131,\n mnemonic: \"i64.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_or\": {\n value: 132,\n mnemonic: \"i64.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_xor\": {\n value: 133,\n mnemonic: \"i64.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shl\": {\n value: 134,\n mnemonic: \"i64.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shr_s\": {\n value: 135,\n mnemonic: \"i64.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shr_u\": {\n value: 136,\n mnemonic: \"i64.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rotl\": {\n value: 137,\n mnemonic: \"i64.rotl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rotr\": {\n value: 138,\n mnemonic: \"i64.rotr\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_abs\": {\n value: 139,\n mnemonic: \"f32.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_neg\": {\n value: 140,\n mnemonic: \"f32.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_ceil\": {\n value: 141,\n mnemonic: \"f32.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_floor\": {\n value: 142,\n mnemonic: \"f32.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_trunc\": {\n value: 143,\n mnemonic: \"f32.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_nearest\": {\n value: 144,\n mnemonic: \"f32.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_sqrt\": {\n value: 145,\n mnemonic: \"f32.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_add\": {\n value: 146,\n mnemonic: \"f32.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_sub\": {\n value: 147,\n mnemonic: \"f32.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_mul\": {\n value: 148,\n mnemonic: \"f32.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_div\": {\n value: 149,\n mnemonic: \"f32.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_min\": {\n value: 150,\n mnemonic: \"f32.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_max\": {\n value: 151,\n mnemonic: \"f32.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_copysign\": {\n value: 152,\n mnemonic: \"f32.copysign\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_abs\": {\n value: 153,\n mnemonic: \"f64.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_neg\": {\n value: 154,\n mnemonic: \"f64.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_ceil\": {\n value: 155,\n mnemonic: \"f64.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_floor\": {\n value: 156,\n mnemonic: \"f64.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_trunc\": {\n value: 157,\n mnemonic: \"f64.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_nearest\": {\n value: 158,\n mnemonic: \"f64.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_sqrt\": {\n value: 159,\n mnemonic: \"f64.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_add\": {\n value: 160,\n mnemonic: \"f64.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_sub\": {\n value: 161,\n mnemonic: \"f64.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_mul\": {\n value: 162,\n mnemonic: \"f64.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_div\": {\n value: 163,\n mnemonic: \"f64.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_min\": {\n value: 164,\n mnemonic: \"f64.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_max\": {\n value: 165,\n mnemonic: \"f64.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_copysign\": {\n value: 166,\n mnemonic: \"f64.copysign\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_wrap_i64\": {\n value: 167,\n mnemonic: \"i32.wrap_i64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f32_s\": {\n value: 168,\n mnemonic: \"i32.trunc_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f32_u\": {\n value: 169,\n mnemonic: \"i32.trunc_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f64_s\": {\n value: 170,\n mnemonic: \"i32.trunc_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f64_u\": {\n value: 171,\n mnemonic: \"i32.trunc_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_extend_i32_s\": {\n value: 172,\n mnemonic: \"i64.extend_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_extend_i32_u\": {\n value: 173,\n mnemonic: \"i64.extend_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f32_s\": {\n value: 174,\n mnemonic: \"i64.trunc_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f32_u\": {\n value: 175,\n mnemonic: \"i64.trunc_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f64_s\": {\n value: 176,\n mnemonic: \"i64.trunc_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f64_u\": {\n value: 177,\n mnemonic: \"i64.trunc_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_convert_i32_s\": {\n value: 178,\n mnemonic: \"f32.convert_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i32_u\": {\n value: 179,\n mnemonic: \"f32.convert_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i64_s\": {\n value: 180,\n mnemonic: \"f32.convert_i64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i64_u\": {\n value: 181,\n mnemonic: \"f32.convert_i64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_demote_f64\": {\n value: 182,\n mnemonic: \"f32.demote_f64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_convert_i32_s\": {\n value: 183,\n mnemonic: \"f64.convert_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i32_u\": {\n value: 184,\n mnemonic: \"f64.convert_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i64_s\": {\n value: 185,\n mnemonic: \"f64.convert_i64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i64_u\": {\n value: 186,\n mnemonic: \"f64.convert_i64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_promote_f32\": {\n value: 187,\n mnemonic: \"f64.promote_f32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_reinterpret_f32\": {\n value: 188,\n mnemonic: \"i32.reinterpret_f32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_reinterpret_f64\": {\n value: 189,\n mnemonic: \"i64.reinterpret_f64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_reinterpret_i32\": {\n value: 190,\n mnemonic: \"f32.reinterpret_i32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_reinterpret_i64\": {\n value: 191,\n mnemonic: \"f64.reinterpret_i64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_extend8_s\": {\n value: 192,\n mnemonic: \"i32.extend8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"sign-extend\",\n },\n \"i32_extend16_s\": {\n value: 193,\n mnemonic: \"i32.extend16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend8_s\": {\n value: 194,\n mnemonic: \"i64.extend8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend16_s\": {\n value: 195,\n mnemonic: \"i64.extend16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend32_s\": {\n value: 196,\n mnemonic: \"i64.extend32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i32_trunc_sat_f32_s\": {\n value: 0,\n mnemonic: \"i32.trunc_sat_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f32_u\": {\n value: 1,\n mnemonic: \"i32.trunc_sat_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f64_s\": {\n value: 2,\n mnemonic: \"i32.trunc_sat_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f64_u\": {\n value: 3,\n mnemonic: \"i32.trunc_sat_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f32_s\": {\n value: 4,\n mnemonic: \"i64.trunc_sat_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f32_u\": {\n value: 5,\n mnemonic: \"i64.trunc_sat_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f64_s\": {\n value: 6,\n mnemonic: \"i64.trunc_sat_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f64_u\": {\n value: 7,\n mnemonic: \"i64.trunc_sat_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"memory_init\": {\n value: 8,\n mnemonic: \"memory.init\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"data_drop\": {\n value: 9,\n mnemonic: \"data.drop\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"memory_copy\": {\n value: 10,\n mnemonic: \"memory.copy\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"memory_fill\": {\n value: 11,\n mnemonic: \"memory.fill\",\n immediate: \"VarUInt1\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_init\": {\n value: 12,\n mnemonic: \"table.init\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"elem_drop\": {\n value: 13,\n mnemonic: \"elem.drop\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_copy\": {\n value: 14,\n mnemonic: \"table.copy\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_grow\": {\n value: 15,\n mnemonic: \"table.grow\",\n immediate: \"VarUInt32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"table_size\": {\n value: 16,\n mnemonic: \"table.size\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"table_fill\": {\n value: 17,\n mnemonic: \"table.fill\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"ref_null\": {\n value: 208,\n mnemonic: \"ref.null\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"ref_is_null\": {\n value: 209,\n mnemonic: \"ref.is_null\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"ref_func\": {\n value: 210,\n mnemonic: \"ref.func\",\n immediate: \"Function\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"table_get\": {\n value: 37,\n mnemonic: \"table.get\",\n immediate: \"VarUInt32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"table_set\": {\n value: 38,\n mnemonic: \"table.set\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"v128_load\": {\n value: 0,\n mnemonic: \"v128.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8x8_s\": {\n value: 1,\n mnemonic: \"v128.load8x8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8x8_u\": {\n value: 2,\n mnemonic: \"v128.load8x8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16x4_s\": {\n value: 3,\n mnemonic: \"v128.load16x4_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16x4_u\": {\n value: 4,\n mnemonic: \"v128.load16x4_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32x2_s\": {\n value: 5,\n mnemonic: \"v128.load32x2_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32x2_u\": {\n value: 6,\n mnemonic: \"v128.load32x2_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8_splat\": {\n value: 7,\n mnemonic: \"v128.load8_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16_splat\": {\n value: 8,\n mnemonic: \"v128.load16_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_splat\": {\n value: 9,\n mnemonic: \"v128.load32_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_splat\": {\n value: 10,\n mnemonic: \"v128.load64_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store\": {\n value: 11,\n mnemonic: \"v128.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_const\": {\n value: 12,\n mnemonic: \"v128.const\",\n immediate: \"V128Const\",\n stackBehavior: \"Push\",\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shuffle\": {\n value: 13,\n mnemonic: \"i8x16.shuffle\",\n immediate: \"ShuffleMask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_swizzle\": {\n value: 14,\n mnemonic: \"i8x16.swizzle\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_splat\": {\n value: 15,\n mnemonic: \"i8x16.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_splat\": {\n value: 16,\n mnemonic: \"i16x8.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_splat\": {\n value: 17,\n mnemonic: \"i32x4.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_splat\": {\n value: 18,\n mnemonic: \"i64x2.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_splat\": {\n value: 19,\n mnemonic: \"f32x4.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_splat\": {\n value: 20,\n mnemonic: \"f64x2.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_extract_lane_s\": {\n value: 21,\n mnemonic: \"i8x16.extract_lane_s\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_extract_lane_u\": {\n value: 22,\n mnemonic: \"i8x16.extract_lane_u\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_replace_lane\": {\n value: 23,\n mnemonic: \"i8x16.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extract_lane_s\": {\n value: 24,\n mnemonic: \"i16x8.extract_lane_s\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extract_lane_u\": {\n value: 25,\n mnemonic: \"i16x8.extract_lane_u\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_replace_lane\": {\n value: 26,\n mnemonic: \"i16x8.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extract_lane\": {\n value: 27,\n mnemonic: \"i32x4.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_replace_lane\": {\n value: 28,\n mnemonic: \"i32x4.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extract_lane\": {\n value: 29,\n mnemonic: \"i64x2.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_replace_lane\": {\n value: 30,\n mnemonic: \"i64x2.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_extract_lane\": {\n value: 31,\n mnemonic: \"f32x4.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Float32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_replace_lane\": {\n value: 32,\n mnemonic: \"f32x4.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Float32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_extract_lane\": {\n value: 33,\n mnemonic: \"f64x2.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Float64\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_replace_lane\": {\n value: 34,\n mnemonic: \"f64x2.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Float64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_eq\": {\n value: 35,\n mnemonic: \"i8x16.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ne\": {\n value: 36,\n mnemonic: \"i8x16.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_lt_s\": {\n value: 37,\n mnemonic: \"i8x16.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_lt_u\": {\n value: 38,\n mnemonic: \"i8x16.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_gt_s\": {\n value: 39,\n mnemonic: \"i8x16.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_gt_u\": {\n value: 40,\n mnemonic: \"i8x16.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_le_s\": {\n value: 41,\n mnemonic: \"i8x16.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_le_u\": {\n value: 42,\n mnemonic: \"i8x16.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ge_s\": {\n value: 43,\n mnemonic: \"i8x16.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ge_u\": {\n value: 44,\n mnemonic: \"i8x16.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_eq\": {\n value: 45,\n mnemonic: \"i16x8.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ne\": {\n value: 46,\n mnemonic: \"i16x8.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_lt_s\": {\n value: 47,\n mnemonic: \"i16x8.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_lt_u\": {\n value: 48,\n mnemonic: \"i16x8.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_gt_s\": {\n value: 49,\n mnemonic: \"i16x8.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_gt_u\": {\n value: 50,\n mnemonic: \"i16x8.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_le_s\": {\n value: 51,\n mnemonic: \"i16x8.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_le_u\": {\n value: 52,\n mnemonic: \"i16x8.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ge_s\": {\n value: 53,\n mnemonic: \"i16x8.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ge_u\": {\n value: 54,\n mnemonic: \"i16x8.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_eq\": {\n value: 55,\n mnemonic: \"i32x4.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ne\": {\n value: 56,\n mnemonic: \"i32x4.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_lt_s\": {\n value: 57,\n mnemonic: \"i32x4.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_lt_u\": {\n value: 58,\n mnemonic: \"i32x4.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_gt_s\": {\n value: 59,\n mnemonic: \"i32x4.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_gt_u\": {\n value: 60,\n mnemonic: \"i32x4.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_le_s\": {\n value: 61,\n mnemonic: \"i32x4.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_le_u\": {\n value: 62,\n mnemonic: \"i32x4.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ge_s\": {\n value: 63,\n mnemonic: \"i32x4.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ge_u\": {\n value: 64,\n mnemonic: \"i32x4.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_eq\": {\n value: 65,\n mnemonic: \"f32x4.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ne\": {\n value: 66,\n mnemonic: \"f32x4.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_lt\": {\n value: 67,\n mnemonic: \"f32x4.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_gt\": {\n value: 68,\n mnemonic: \"f32x4.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_le\": {\n value: 69,\n mnemonic: \"f32x4.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ge\": {\n value: 70,\n mnemonic: \"f32x4.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_eq\": {\n value: 71,\n mnemonic: \"f64x2.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ne\": {\n value: 72,\n mnemonic: \"f64x2.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_lt\": {\n value: 73,\n mnemonic: \"f64x2.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_gt\": {\n value: 74,\n mnemonic: \"f64x2.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_le\": {\n value: 75,\n mnemonic: \"f64x2.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ge\": {\n value: 76,\n mnemonic: \"f64x2.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_not\": {\n value: 77,\n mnemonic: \"v128.not\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_and\": {\n value: 78,\n mnemonic: \"v128.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_andnot\": {\n value: 79,\n mnemonic: \"v128.andnot\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_or\": {\n value: 80,\n mnemonic: \"v128.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_xor\": {\n value: 81,\n mnemonic: \"v128.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_bitselect\": {\n value: 82,\n mnemonic: \"v128.bitselect\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_any_true\": {\n value: 83,\n mnemonic: \"v128.any_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8_lane\": {\n value: 84,\n mnemonic: \"v128.load8_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16_lane\": {\n value: 85,\n mnemonic: \"v128.load16_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_lane\": {\n value: 86,\n mnemonic: \"v128.load32_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_lane\": {\n value: 87,\n mnemonic: \"v128.load64_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store8_lane\": {\n value: 88,\n mnemonic: \"v128.store8_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store16_lane\": {\n value: 89,\n mnemonic: \"v128.store16_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store32_lane\": {\n value: 90,\n mnemonic: \"v128.store32_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store64_lane\": {\n value: 91,\n mnemonic: \"v128.store64_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_zero\": {\n value: 92,\n mnemonic: \"v128.load32_zero\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_zero\": {\n value: 93,\n mnemonic: \"v128.load64_zero\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f32x4_s\": {\n value: 94,\n mnemonic: \"i32x4.trunc_sat_f32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f32x4_u\": {\n value: 95,\n mnemonic: \"i32x4.trunc_sat_f32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_abs\": {\n value: 96,\n mnemonic: \"i8x16.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_neg\": {\n value: 97,\n mnemonic: \"i8x16.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_popcnt\": {\n value: 98,\n mnemonic: \"i8x16.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_all_true\": {\n value: 99,\n mnemonic: \"i8x16.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_bitmask\": {\n value: 100,\n mnemonic: \"i8x16.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_narrow_i16x8_s\": {\n value: 101,\n mnemonic: \"i8x16.narrow_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_narrow_i16x8_u\": {\n value: 102,\n mnemonic: \"i8x16.narrow_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ceil\": {\n value: 103,\n mnemonic: \"f32x4.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_floor\": {\n value: 104,\n mnemonic: \"f32x4.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_trunc\": {\n value: 105,\n mnemonic: \"f32x4.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_nearest\": {\n value: 106,\n mnemonic: \"f32x4.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shl\": {\n value: 107,\n mnemonic: \"i8x16.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shr_s\": {\n value: 108,\n mnemonic: \"i8x16.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shr_u\": {\n value: 109,\n mnemonic: \"i8x16.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add\": {\n value: 110,\n mnemonic: \"i8x16.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add_sat_s\": {\n value: 111,\n mnemonic: \"i8x16.add_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add_sat_u\": {\n value: 112,\n mnemonic: \"i8x16.add_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub\": {\n value: 113,\n mnemonic: \"i8x16.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub_sat_s\": {\n value: 114,\n mnemonic: \"i8x16.sub_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub_sat_u\": {\n value: 115,\n mnemonic: \"i8x16.sub_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ceil\": {\n value: 116,\n mnemonic: \"f64x2.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_floor\": {\n value: 117,\n mnemonic: \"f64x2.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_min_s\": {\n value: 118,\n mnemonic: \"i8x16.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_min_u\": {\n value: 119,\n mnemonic: \"i8x16.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_max_s\": {\n value: 120,\n mnemonic: \"i8x16.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_max_u\": {\n value: 121,\n mnemonic: \"i8x16.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_trunc\": {\n value: 122,\n mnemonic: \"f64x2.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_avgr_u\": {\n value: 123,\n mnemonic: \"i8x16.avgr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extadd_pairwise_i8x16_s\": {\n value: 124,\n mnemonic: \"i16x8.extadd_pairwise_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extadd_pairwise_i8x16_u\": {\n value: 125,\n mnemonic: \"i16x8.extadd_pairwise_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extadd_pairwise_i16x8_s\": {\n value: 126,\n mnemonic: \"i32x4.extadd_pairwise_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extadd_pairwise_i16x8_u\": {\n value: 127,\n mnemonic: \"i32x4.extadd_pairwise_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_abs\": {\n value: 128,\n mnemonic: \"i16x8.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_neg\": {\n value: 129,\n mnemonic: \"i16x8.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_q15mulr_sat_s\": {\n value: 130,\n mnemonic: \"i16x8.q15mulr_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_all_true\": {\n value: 131,\n mnemonic: \"i16x8.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_bitmask\": {\n value: 132,\n mnemonic: \"i16x8.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_narrow_i32x4_s\": {\n value: 133,\n mnemonic: \"i16x8.narrow_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_narrow_i32x4_u\": {\n value: 134,\n mnemonic: \"i16x8.narrow_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_low_i8x16_s\": {\n value: 135,\n mnemonic: \"i16x8.extend_low_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_high_i8x16_s\": {\n value: 136,\n mnemonic: \"i16x8.extend_high_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_low_i8x16_u\": {\n value: 137,\n mnemonic: \"i16x8.extend_low_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_high_i8x16_u\": {\n value: 138,\n mnemonic: \"i16x8.extend_high_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shl\": {\n value: 139,\n mnemonic: \"i16x8.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shr_s\": {\n value: 140,\n mnemonic: \"i16x8.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shr_u\": {\n value: 141,\n mnemonic: \"i16x8.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add\": {\n value: 142,\n mnemonic: \"i16x8.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add_sat_s\": {\n value: 143,\n mnemonic: \"i16x8.add_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add_sat_u\": {\n value: 144,\n mnemonic: \"i16x8.add_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub\": {\n value: 145,\n mnemonic: \"i16x8.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub_sat_s\": {\n value: 146,\n mnemonic: \"i16x8.sub_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub_sat_u\": {\n value: 147,\n mnemonic: \"i16x8.sub_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_nearest\": {\n value: 148,\n mnemonic: \"f64x2.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_mul\": {\n value: 149,\n mnemonic: \"i16x8.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_min_s\": {\n value: 150,\n mnemonic: \"i16x8.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_min_u\": {\n value: 151,\n mnemonic: \"i16x8.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_max_s\": {\n value: 152,\n mnemonic: \"i16x8.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_max_u\": {\n value: 153,\n mnemonic: \"i16x8.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_avgr_u\": {\n value: 155,\n mnemonic: \"i16x8.avgr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_low_i8x16_s\": {\n value: 156,\n mnemonic: \"i16x8.extmul_low_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_high_i8x16_s\": {\n value: 157,\n mnemonic: \"i16x8.extmul_high_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_low_i8x16_u\": {\n value: 158,\n mnemonic: \"i16x8.extmul_low_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_high_i8x16_u\": {\n value: 159,\n mnemonic: \"i16x8.extmul_high_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_abs\": {\n value: 160,\n mnemonic: \"i32x4.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_neg\": {\n value: 161,\n mnemonic: \"i32x4.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_all_true\": {\n value: 163,\n mnemonic: \"i32x4.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_bitmask\": {\n value: 164,\n mnemonic: \"i32x4.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_low_i16x8_s\": {\n value: 167,\n mnemonic: \"i32x4.extend_low_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_high_i16x8_s\": {\n value: 168,\n mnemonic: \"i32x4.extend_high_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_low_i16x8_u\": {\n value: 169,\n mnemonic: \"i32x4.extend_low_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_high_i16x8_u\": {\n value: 170,\n mnemonic: \"i32x4.extend_high_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shl\": {\n value: 171,\n mnemonic: \"i32x4.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shr_s\": {\n value: 172,\n mnemonic: \"i32x4.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shr_u\": {\n value: 173,\n mnemonic: \"i32x4.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_add\": {\n value: 174,\n mnemonic: \"i32x4.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_convert_i32x4_s\": {\n value: 175,\n mnemonic: \"f32x4.convert_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_convert_i32x4_u\": {\n value: 176,\n mnemonic: \"f32x4.convert_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_sub\": {\n value: 177,\n mnemonic: \"i32x4.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_mul\": {\n value: 181,\n mnemonic: \"i32x4.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_min_s\": {\n value: 182,\n mnemonic: \"i32x4.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_min_u\": {\n value: 183,\n mnemonic: \"i32x4.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_max_s\": {\n value: 184,\n mnemonic: \"i32x4.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_max_u\": {\n value: 185,\n mnemonic: \"i32x4.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_dot_i16x8_s\": {\n value: 186,\n mnemonic: \"i32x4.dot_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_low_i16x8_s\": {\n value: 188,\n mnemonic: \"i32x4.extmul_low_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_high_i16x8_s\": {\n value: 189,\n mnemonic: \"i32x4.extmul_high_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_low_i16x8_u\": {\n value: 190,\n mnemonic: \"i32x4.extmul_low_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_high_i16x8_u\": {\n value: 191,\n mnemonic: \"i32x4.extmul_high_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_abs\": {\n value: 192,\n mnemonic: \"i64x2.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_neg\": {\n value: 193,\n mnemonic: \"i64x2.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_all_true\": {\n value: 195,\n mnemonic: \"i64x2.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_bitmask\": {\n value: 196,\n mnemonic: \"i64x2.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_low_i32x4_s\": {\n value: 199,\n mnemonic: \"i64x2.extend_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_high_i32x4_s\": {\n value: 200,\n mnemonic: \"i64x2.extend_high_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_low_i32x4_u\": {\n value: 201,\n mnemonic: \"i64x2.extend_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_high_i32x4_u\": {\n value: 202,\n mnemonic: \"i64x2.extend_high_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shl\": {\n value: 203,\n mnemonic: \"i64x2.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shr_s\": {\n value: 204,\n mnemonic: \"i64x2.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shr_u\": {\n value: 205,\n mnemonic: \"i64x2.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_add\": {\n value: 206,\n mnemonic: \"i64x2.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_sub\": {\n value: 209,\n mnemonic: \"i64x2.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_mul\": {\n value: 213,\n mnemonic: \"i64x2.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_eq\": {\n value: 214,\n mnemonic: \"i64x2.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_ne\": {\n value: 215,\n mnemonic: \"i64x2.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_lt_s\": {\n value: 216,\n mnemonic: \"i64x2.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_gt_s\": {\n value: 217,\n mnemonic: \"i64x2.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_le_s\": {\n value: 218,\n mnemonic: \"i64x2.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_ge_s\": {\n value: 219,\n mnemonic: \"i64x2.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_low_i32x4_s\": {\n value: 220,\n mnemonic: \"i64x2.extmul_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_high_i32x4_s\": {\n value: 221,\n mnemonic: \"i64x2.extmul_high_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_low_i32x4_u\": {\n value: 222,\n mnemonic: \"i64x2.extmul_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_high_i32x4_u\": {\n value: 223,\n mnemonic: \"i64x2.extmul_high_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_abs\": {\n value: 224,\n mnemonic: \"f32x4.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_neg\": {\n value: 225,\n mnemonic: \"f32x4.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_sqrt\": {\n value: 227,\n mnemonic: \"f32x4.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_add\": {\n value: 228,\n mnemonic: \"f32x4.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_sub\": {\n value: 229,\n mnemonic: \"f32x4.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_mul\": {\n value: 230,\n mnemonic: \"f32x4.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_div\": {\n value: 231,\n mnemonic: \"f32x4.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_min\": {\n value: 232,\n mnemonic: \"f32x4.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_max\": {\n value: 233,\n mnemonic: \"f32x4.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_pmin\": {\n value: 234,\n mnemonic: \"f32x4.pmin\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_pmax\": {\n value: 235,\n mnemonic: \"f32x4.pmax\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_abs\": {\n value: 236,\n mnemonic: \"f64x2.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_neg\": {\n value: 237,\n mnemonic: \"f64x2.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_sqrt\": {\n value: 239,\n mnemonic: \"f64x2.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_add\": {\n value: 240,\n mnemonic: \"f64x2.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_sub\": {\n value: 241,\n mnemonic: \"f64x2.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_mul\": {\n value: 242,\n mnemonic: \"f64x2.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_div\": {\n value: 243,\n mnemonic: \"f64x2.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_min\": {\n value: 244,\n mnemonic: \"f64x2.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_max\": {\n value: 245,\n mnemonic: \"f64x2.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_pmin\": {\n value: 246,\n mnemonic: \"f64x2.pmin\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_pmax\": {\n value: 247,\n mnemonic: \"f64x2.pmax\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f64x2_s_zero\": {\n value: 248,\n mnemonic: \"i32x4.trunc_sat_f64x2_s_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f64x2_u_zero\": {\n value: 249,\n mnemonic: \"i32x4.trunc_sat_f64x2_u_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_convert_low_i32x4_s\": {\n value: 250,\n mnemonic: \"f64x2.convert_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_convert_low_i32x4_u\": {\n value: 251,\n mnemonic: \"f64x2.convert_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_demote_f64x2_zero\": {\n value: 252,\n mnemonic: \"f32x4.demote_f64x2_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_promote_low_f32x4\": {\n value: 253,\n mnemonic: \"f64x2.promote_low_f32x4\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n} as const satisfies Record;\n\nexport default OpCodes;\n", "import OpCodes from './OpCodes';\n\nexport default abstract class OpCodeEmitter {\n unreachable(): any {\n return this.emit(OpCodes.unreachable);\n }\n\n nop(): any {\n return this.emit(OpCodes.nop);\n }\n\n block(blockType: any, label?: any): any {\n return this.emit(OpCodes.block, blockType, label);\n }\n\n loop(blockType: any, label?: any): any {\n return this.emit(OpCodes.loop, blockType, label);\n }\n\n if(blockType: any, label?: any): any {\n return this.emit(OpCodes.if, blockType, label);\n }\n\n else(): any {\n return this.emit(OpCodes.else);\n }\n\n end(): any {\n return this.emit(OpCodes.end);\n }\n\n br(labelBuilder: any): any {\n return this.emit(OpCodes.br, labelBuilder);\n }\n\n br_if(labelBuilder: any): any {\n return this.emit(OpCodes.br_if, labelBuilder);\n }\n\n br_table(defaultLabelBuilder: any, ...labelBuilders: any[]): any {\n return this.emit(OpCodes.br_table, defaultLabelBuilder, labelBuilders);\n }\n\n return(): any {\n return this.emit(OpCodes.return);\n }\n\n call(functionBuilder: any): any {\n return this.emit(OpCodes.call, functionBuilder);\n }\n\n call_indirect(funcTypeBuilder: any): any {\n return this.emit(OpCodes.call_indirect, funcTypeBuilder);\n }\n\n drop(): any {\n return this.emit(OpCodes.drop);\n }\n\n select(): any {\n return this.emit(OpCodes.select);\n }\n\n get_local(local: any): any {\n return this.emit(OpCodes.get_local, local);\n }\n\n set_local(local: any): any {\n return this.emit(OpCodes.set_local, local);\n }\n\n tee_local(local: any): any {\n return this.emit(OpCodes.tee_local, local);\n }\n\n get_global(global: any): any {\n return this.emit(OpCodes.get_global, global);\n }\n\n set_global(global: any): any {\n return this.emit(OpCodes.set_global, global);\n }\n\n load_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load, alignment, offset);\n }\n\n load_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load, alignment, offset);\n }\n\n load_f32(alignment: number, offset: number): any {\n return this.emit(OpCodes.f32_load, alignment, offset);\n }\n\n load_f64(alignment: number, offset: number): any {\n return this.emit(OpCodes.f64_load, alignment, offset);\n }\n\n load8_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load8_s, alignment, offset);\n }\n\n load8_i32_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load8_u, alignment, offset);\n }\n\n load16_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load16_s, alignment, offset);\n }\n\n load16_i32_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load16_u, alignment, offset);\n }\n\n load8_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load8_s, alignment, offset);\n }\n\n load8_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load8_u, alignment, offset);\n }\n\n load16_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load16_s, alignment, offset);\n }\n\n load16_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load16_u, alignment, offset);\n }\n\n load32_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load32_s, alignment, offset);\n }\n\n load32_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load32_u, alignment, offset);\n }\n\n store_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store, alignment, offset);\n }\n\n store_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store, alignment, offset);\n }\n\n store_f32(alignment: number, offset: number): any {\n return this.emit(OpCodes.f32_store, alignment, offset);\n }\n\n store_f64(alignment: number, offset: number): any {\n return this.emit(OpCodes.f64_store, alignment, offset);\n }\n\n store8_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store8, alignment, offset);\n }\n\n store16_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store16, alignment, offset);\n }\n\n store8_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store8, alignment, offset);\n }\n\n store16_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store16, alignment, offset);\n }\n\n store32_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store32, alignment, offset);\n }\n\n mem_size(varUInt1: number): any {\n return this.emit(OpCodes.mem_size, varUInt1);\n }\n\n mem_grow(varUInt1: number): any {\n return this.emit(OpCodes.mem_grow, varUInt1);\n }\n\n const_i32(varInt32: number): any {\n return this.emit(OpCodes.i32_const, varInt32);\n }\n\n const_i64(varInt64: number | bigint): any {\n return this.emit(OpCodes.i64_const, varInt64);\n }\n\n const_f32(float32: number): any {\n return this.emit(OpCodes.f32_const, float32);\n }\n\n const_f64(float64: number): any {\n return this.emit(OpCodes.f64_const, float64);\n }\n\n eqz_i32(): any {\n return this.emit(OpCodes.i32_eqz);\n }\n\n eq_i32(): any {\n return this.emit(OpCodes.i32_eq);\n }\n\n ne_i32(): any {\n return this.emit(OpCodes.i32_ne);\n }\n\n lt_i32(): any {\n return this.emit(OpCodes.i32_lt_s);\n }\n\n lt_i32_u(): any {\n return this.emit(OpCodes.i32_lt_u);\n }\n\n gt_i32(): any {\n return this.emit(OpCodes.i32_gt_s);\n }\n\n gt_i32_u(): any {\n return this.emit(OpCodes.i32_gt_u);\n }\n\n le_i32(): any {\n return this.emit(OpCodes.i32_le_s);\n }\n\n le_i32_u(): any {\n return this.emit(OpCodes.i32_le_u);\n }\n\n ge_i32(): any {\n return this.emit(OpCodes.i32_ge_s);\n }\n\n ge_i32_u(): any {\n return this.emit(OpCodes.i32_ge_u);\n }\n\n eqz_i64(): any {\n return this.emit(OpCodes.i64_eqz);\n }\n\n eq_i64(): any {\n return this.emit(OpCodes.i64_eq);\n }\n\n ne_i64(): any {\n return this.emit(OpCodes.i64_ne);\n }\n\n lt_i64(): any {\n return this.emit(OpCodes.i64_lt_s);\n }\n\n lt_i64_u(): any {\n return this.emit(OpCodes.i64_lt_u);\n }\n\n gt_i64(): any {\n return this.emit(OpCodes.i64_gt_s);\n }\n\n gt_i64_u(): any {\n return this.emit(OpCodes.i64_gt_u);\n }\n\n le_i64(): any {\n return this.emit(OpCodes.i64_le_s);\n }\n\n le_i64_u(): any {\n return this.emit(OpCodes.i64_le_u);\n }\n\n ge_i64(): any {\n return this.emit(OpCodes.i64_ge_s);\n }\n\n ge_i64_u(): any {\n return this.emit(OpCodes.i64_ge_u);\n }\n\n eq_f32(): any {\n return this.emit(OpCodes.f32_eq);\n }\n\n ne_f32(): any {\n return this.emit(OpCodes.f32_ne);\n }\n\n lt_f32(): any {\n return this.emit(OpCodes.f32_lt);\n }\n\n gt_f32(): any {\n return this.emit(OpCodes.f32_gt);\n }\n\n le_f32(): any {\n return this.emit(OpCodes.f32_le);\n }\n\n ge_f32(): any {\n return this.emit(OpCodes.f32_ge);\n }\n\n eq_f64(): any {\n return this.emit(OpCodes.f64_eq);\n }\n\n ne_f64(): any {\n return this.emit(OpCodes.f64_ne);\n }\n\n lt_f64(): any {\n return this.emit(OpCodes.f64_lt);\n }\n\n gt_f64(): any {\n return this.emit(OpCodes.f64_gt);\n }\n\n le_f64(): any {\n return this.emit(OpCodes.f64_le);\n }\n\n ge_f64(): any {\n return this.emit(OpCodes.f64_ge);\n }\n\n clz_i32(): any {\n return this.emit(OpCodes.i32_clz);\n }\n\n ctz_i32(): any {\n return this.emit(OpCodes.i32_ctz);\n }\n\n popcnt_i32(): any {\n return this.emit(OpCodes.i32_popcnt);\n }\n\n add_i32(): any {\n return this.emit(OpCodes.i32_add);\n }\n\n sub_i32(): any {\n return this.emit(OpCodes.i32_sub);\n }\n\n mul_i32(): any {\n return this.emit(OpCodes.i32_mul);\n }\n\n div_i32(): any {\n return this.emit(OpCodes.i32_div_s);\n }\n\n div_i32_u(): any {\n return this.emit(OpCodes.i32_div_u);\n }\n\n rem_i32(): any {\n return this.emit(OpCodes.i32_rem_s);\n }\n\n rem_i32_u(): any {\n return this.emit(OpCodes.i32_rem_u);\n }\n\n and_i32(): any {\n return this.emit(OpCodes.i32_and);\n }\n\n or_i32(): any {\n return this.emit(OpCodes.i32_or);\n }\n\n xor_i32(): any {\n return this.emit(OpCodes.i32_xor);\n }\n\n shl_i32(): any {\n return this.emit(OpCodes.i32_shl);\n }\n\n shr_i32(): any {\n return this.emit(OpCodes.i32_shr_s);\n }\n\n shr_i32_u(): any {\n return this.emit(OpCodes.i32_shr_u);\n }\n\n rotl_i32(): any {\n return this.emit(OpCodes.i32_rotl);\n }\n\n rotr_i32(): any {\n return this.emit(OpCodes.i32_rotr);\n }\n\n clz_i64(): any {\n return this.emit(OpCodes.i64_clz);\n }\n\n ctz_i64(): any {\n return this.emit(OpCodes.i64_ctz);\n }\n\n popcnt_i64(): any {\n return this.emit(OpCodes.i64_popcnt);\n }\n\n add_i64(): any {\n return this.emit(OpCodes.i64_add);\n }\n\n sub_i64(): any {\n return this.emit(OpCodes.i64_sub);\n }\n\n mul_i64(): any {\n return this.emit(OpCodes.i64_mul);\n }\n\n div_i64(): any {\n return this.emit(OpCodes.i64_div_s);\n }\n\n div_i64_u(): any {\n return this.emit(OpCodes.i64_div_u);\n }\n\n rem_i64(): any {\n return this.emit(OpCodes.i64_rem_s);\n }\n\n rem_i64_u(): any {\n return this.emit(OpCodes.i64_rem_u);\n }\n\n and_i64(): any {\n return this.emit(OpCodes.i64_and);\n }\n\n or_i64(): any {\n return this.emit(OpCodes.i64_or);\n }\n\n xor_i64(): any {\n return this.emit(OpCodes.i64_xor);\n }\n\n shl_i64(): any {\n return this.emit(OpCodes.i64_shl);\n }\n\n shr_i64(): any {\n return this.emit(OpCodes.i64_shr_s);\n }\n\n shr_i64_u(): any {\n return this.emit(OpCodes.i64_shr_u);\n }\n\n rotl_i64(): any {\n return this.emit(OpCodes.i64_rotl);\n }\n\n rotr_i64(): any {\n return this.emit(OpCodes.i64_rotr);\n }\n\n abs_f32(): any {\n return this.emit(OpCodes.f32_abs);\n }\n\n neg_f32(): any {\n return this.emit(OpCodes.f32_neg);\n }\n\n ceil_f32(): any {\n return this.emit(OpCodes.f32_ceil);\n }\n\n floor_f32(): any {\n return this.emit(OpCodes.f32_floor);\n }\n\n trunc_f32(): any {\n return this.emit(OpCodes.f32_trunc);\n }\n\n nearest_f32(): any {\n return this.emit(OpCodes.f32_nearest);\n }\n\n sqrt_f32(): any {\n return this.emit(OpCodes.f32_sqrt);\n }\n\n add_f32(): any {\n return this.emit(OpCodes.f32_add);\n }\n\n sub_f32(): any {\n return this.emit(OpCodes.f32_sub);\n }\n\n mul_f32(): any {\n return this.emit(OpCodes.f32_mul);\n }\n\n div_f32(): any {\n return this.emit(OpCodes.f32_div);\n }\n\n min_f32(): any {\n return this.emit(OpCodes.f32_min);\n }\n\n max_f32(): any {\n return this.emit(OpCodes.f32_max);\n }\n\n copysign_f32(): any {\n return this.emit(OpCodes.f32_copysign);\n }\n\n abs_f64(): any {\n return this.emit(OpCodes.f64_abs);\n }\n\n neg_f64(): any {\n return this.emit(OpCodes.f64_neg);\n }\n\n ceil_f64(): any {\n return this.emit(OpCodes.f64_ceil);\n }\n\n floor_f64(): any {\n return this.emit(OpCodes.f64_floor);\n }\n\n trunc_f64(): any {\n return this.emit(OpCodes.f64_trunc);\n }\n\n nearest_f64(): any {\n return this.emit(OpCodes.f64_nearest);\n }\n\n sqrt_f64(): any {\n return this.emit(OpCodes.f64_sqrt);\n }\n\n add_f64(): any {\n return this.emit(OpCodes.f64_add);\n }\n\n sub_f64(): any {\n return this.emit(OpCodes.f64_sub);\n }\n\n mul_f64(): any {\n return this.emit(OpCodes.f64_mul);\n }\n\n div_f64(): any {\n return this.emit(OpCodes.f64_div);\n }\n\n min_f64(): any {\n return this.emit(OpCodes.f64_min);\n }\n\n max_f64(): any {\n return this.emit(OpCodes.f64_max);\n }\n\n copysign_f64(): any {\n return this.emit(OpCodes.f64_copysign);\n }\n\n wrap_i64_i32(): any {\n return this.emit(OpCodes.i32_wrap_i64);\n }\n\n trunc_f32_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_f32_s);\n }\n\n trunc_f32_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_f32_u);\n }\n\n trunc_f64_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_f64_s);\n }\n\n trunc_f64_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_f64_u);\n }\n\n extend_i32_s_i64(): any {\n return this.emit(OpCodes.i64_extend_i32_s);\n }\n\n extend_i32_u_i64(): any {\n return this.emit(OpCodes.i64_extend_i32_u);\n }\n\n trunc_f32_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_f32_s);\n }\n\n trunc_f32_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_f32_u);\n }\n\n trunc_f64_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_f64_s);\n }\n\n trunc_f64_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_f64_u);\n }\n\n convert_i32_s_f32(): any {\n return this.emit(OpCodes.f32_convert_i32_s);\n }\n\n convert_i32_u_f32(): any {\n return this.emit(OpCodes.f32_convert_i32_u);\n }\n\n convert_i64_s_f32(): any {\n return this.emit(OpCodes.f32_convert_i64_s);\n }\n\n convert_i64_u_f32(): any {\n return this.emit(OpCodes.f32_convert_i64_u);\n }\n\n demote_f64_f32(): any {\n return this.emit(OpCodes.f32_demote_f64);\n }\n\n convert_i32_s_f64(): any {\n return this.emit(OpCodes.f64_convert_i32_s);\n }\n\n convert_i32_u_f64(): any {\n return this.emit(OpCodes.f64_convert_i32_u);\n }\n\n convert_i64_s_f64(): any {\n return this.emit(OpCodes.f64_convert_i64_s);\n }\n\n convert_i64_u_f64(): any {\n return this.emit(OpCodes.f64_convert_i64_u);\n }\n\n promote_f32_f64(): any {\n return this.emit(OpCodes.f64_promote_f32);\n }\n\n reinterpret_f32_i32(): any {\n return this.emit(OpCodes.i32_reinterpret_f32);\n }\n\n reinterpret_f64_i64(): any {\n return this.emit(OpCodes.i64_reinterpret_f64);\n }\n\n reinterpret_i32_f32(): any {\n return this.emit(OpCodes.f32_reinterpret_i32);\n }\n\n reinterpret_i64_f64(): any {\n return this.emit(OpCodes.f64_reinterpret_i64);\n }\n\n extend8_s_i32(): any {\n return this.emit(OpCodes.i32_extend8_s);\n }\n\n extend16_s_i32(): any {\n return this.emit(OpCodes.i32_extend16_s);\n }\n\n extend8_s_i64(): any {\n return this.emit(OpCodes.i64_extend8_s);\n }\n\n extend16_s_i64(): any {\n return this.emit(OpCodes.i64_extend16_s);\n }\n\n extend32_s_i64(): any {\n return this.emit(OpCodes.i64_extend32_s);\n }\n\n trunc_sat_f32_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f32_s);\n }\n\n trunc_sat_f32_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f32_u);\n }\n\n trunc_sat_f64_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f64_s);\n }\n\n trunc_sat_f64_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f64_u);\n }\n\n trunc_sat_f32_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f32_s);\n }\n\n trunc_sat_f32_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f32_u);\n }\n\n trunc_sat_f64_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f64_s);\n }\n\n trunc_sat_f64_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f64_u);\n }\n\n memory_init(alignment: number, offset: number): any {\n return this.emit(OpCodes.memory_init, alignment, offset);\n }\n\n data_drop(varUInt32: number): any {\n return this.emit(OpCodes.data_drop, varUInt32);\n }\n\n memory_copy(alignment: number, offset: number): any {\n return this.emit(OpCodes.memory_copy, alignment, offset);\n }\n\n memory_fill(varUInt1: number): any {\n return this.emit(OpCodes.memory_fill, varUInt1);\n }\n\n table_init(alignment: number, offset: number): any {\n return this.emit(OpCodes.table_init, alignment, offset);\n }\n\n elem_drop(varUInt32: number): any {\n return this.emit(OpCodes.elem_drop, varUInt32);\n }\n\n table_copy(alignment: number, offset: number): any {\n return this.emit(OpCodes.table_copy, alignment, offset);\n }\n\n table_grow(varUInt32: number): any {\n return this.emit(OpCodes.table_grow, varUInt32);\n }\n\n table_size(varUInt32: number): any {\n return this.emit(OpCodes.table_size, varUInt32);\n }\n\n table_fill(varUInt32: number): any {\n return this.emit(OpCodes.table_fill, varUInt32);\n }\n\n ref_null(varUInt32: number): any {\n return this.emit(OpCodes.ref_null, varUInt32);\n }\n\n ref_is_null(): any {\n return this.emit(OpCodes.ref_is_null);\n }\n\n ref_func(functionBuilder: any): any {\n return this.emit(OpCodes.ref_func, functionBuilder);\n }\n\n table_get(varUInt32: number): any {\n return this.emit(OpCodes.table_get, varUInt32);\n }\n\n table_set(varUInt32: number): any {\n return this.emit(OpCodes.table_set, varUInt32);\n }\n\n load_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load, alignment, offset);\n }\n\n load8x8_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8x8_s, alignment, offset);\n }\n\n load8x8_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8x8_u, alignment, offset);\n }\n\n load16x4_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16x4_s, alignment, offset);\n }\n\n load16x4_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16x4_u, alignment, offset);\n }\n\n load32x2_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32x2_s, alignment, offset);\n }\n\n load32x2_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32x2_u, alignment, offset);\n }\n\n load8_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8_splat, alignment, offset);\n }\n\n load16_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16_splat, alignment, offset);\n }\n\n load32_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_splat, alignment, offset);\n }\n\n load64_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_splat, alignment, offset);\n }\n\n store_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store, alignment, offset);\n }\n\n const_v128(bytes: Uint8Array): any {\n return this.emit(OpCodes.v128_const, bytes);\n }\n\n shuffle_i8x16(mask: Uint8Array): any {\n return this.emit(OpCodes.i8x16_shuffle, mask);\n }\n\n swizzle_i8x16(): any {\n return this.emit(OpCodes.i8x16_swizzle);\n }\n\n splat_i8x16(): any {\n return this.emit(OpCodes.i8x16_splat);\n }\n\n splat_i16x8(): any {\n return this.emit(OpCodes.i16x8_splat);\n }\n\n splat_i32x4(): any {\n return this.emit(OpCodes.i32x4_splat);\n }\n\n splat_i64x2(): any {\n return this.emit(OpCodes.i64x2_splat);\n }\n\n splat_f32x4(): any {\n return this.emit(OpCodes.f32x4_splat);\n }\n\n splat_f64x2(): any {\n return this.emit(OpCodes.f64x2_splat);\n }\n\n extract_lane_s_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_extract_lane_s, laneIndex);\n }\n\n extract_lane_u_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_extract_lane_u, laneIndex);\n }\n\n replace_lane_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_replace_lane, laneIndex);\n }\n\n extract_lane_s_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_extract_lane_s, laneIndex);\n }\n\n extract_lane_u_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_extract_lane_u, laneIndex);\n }\n\n replace_lane_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_replace_lane, laneIndex);\n }\n\n extract_lane_i32x4(laneIndex: number): any {\n return this.emit(OpCodes.i32x4_extract_lane, laneIndex);\n }\n\n replace_lane_i32x4(laneIndex: number): any {\n return this.emit(OpCodes.i32x4_replace_lane, laneIndex);\n }\n\n extract_lane_i64x2(laneIndex: number): any {\n return this.emit(OpCodes.i64x2_extract_lane, laneIndex);\n }\n\n replace_lane_i64x2(laneIndex: number): any {\n return this.emit(OpCodes.i64x2_replace_lane, laneIndex);\n }\n\n extract_lane_f32x4(laneIndex: number): any {\n return this.emit(OpCodes.f32x4_extract_lane, laneIndex);\n }\n\n replace_lane_f32x4(laneIndex: number): any {\n return this.emit(OpCodes.f32x4_replace_lane, laneIndex);\n }\n\n extract_lane_f64x2(laneIndex: number): any {\n return this.emit(OpCodes.f64x2_extract_lane, laneIndex);\n }\n\n replace_lane_f64x2(laneIndex: number): any {\n return this.emit(OpCodes.f64x2_replace_lane, laneIndex);\n }\n\n eq_i8x16(): any {\n return this.emit(OpCodes.i8x16_eq);\n }\n\n ne_i8x16(): any {\n return this.emit(OpCodes.i8x16_ne);\n }\n\n lt_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_lt_s);\n }\n\n lt_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_lt_u);\n }\n\n gt_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_gt_s);\n }\n\n gt_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_gt_u);\n }\n\n le_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_le_s);\n }\n\n le_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_le_u);\n }\n\n ge_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_ge_s);\n }\n\n ge_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_ge_u);\n }\n\n eq_i16x8(): any {\n return this.emit(OpCodes.i16x8_eq);\n }\n\n ne_i16x8(): any {\n return this.emit(OpCodes.i16x8_ne);\n }\n\n lt_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_lt_s);\n }\n\n lt_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_lt_u);\n }\n\n gt_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_gt_s);\n }\n\n gt_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_gt_u);\n }\n\n le_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_le_s);\n }\n\n le_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_le_u);\n }\n\n ge_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_ge_s);\n }\n\n ge_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_ge_u);\n }\n\n eq_i32x4(): any {\n return this.emit(OpCodes.i32x4_eq);\n }\n\n ne_i32x4(): any {\n return this.emit(OpCodes.i32x4_ne);\n }\n\n lt_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_lt_s);\n }\n\n lt_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_lt_u);\n }\n\n gt_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_gt_s);\n }\n\n gt_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_gt_u);\n }\n\n le_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_le_s);\n }\n\n le_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_le_u);\n }\n\n ge_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_ge_s);\n }\n\n ge_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_ge_u);\n }\n\n eq_f32x4(): any {\n return this.emit(OpCodes.f32x4_eq);\n }\n\n ne_f32x4(): any {\n return this.emit(OpCodes.f32x4_ne);\n }\n\n lt_f32x4(): any {\n return this.emit(OpCodes.f32x4_lt);\n }\n\n gt_f32x4(): any {\n return this.emit(OpCodes.f32x4_gt);\n }\n\n le_f32x4(): any {\n return this.emit(OpCodes.f32x4_le);\n }\n\n ge_f32x4(): any {\n return this.emit(OpCodes.f32x4_ge);\n }\n\n eq_f64x2(): any {\n return this.emit(OpCodes.f64x2_eq);\n }\n\n ne_f64x2(): any {\n return this.emit(OpCodes.f64x2_ne);\n }\n\n lt_f64x2(): any {\n return this.emit(OpCodes.f64x2_lt);\n }\n\n gt_f64x2(): any {\n return this.emit(OpCodes.f64x2_gt);\n }\n\n le_f64x2(): any {\n return this.emit(OpCodes.f64x2_le);\n }\n\n ge_f64x2(): any {\n return this.emit(OpCodes.f64x2_ge);\n }\n\n not_v128(): any {\n return this.emit(OpCodes.v128_not);\n }\n\n and_v128(): any {\n return this.emit(OpCodes.v128_and);\n }\n\n andnot_v128(): any {\n return this.emit(OpCodes.v128_andnot);\n }\n\n or_v128(): any {\n return this.emit(OpCodes.v128_or);\n }\n\n xor_v128(): any {\n return this.emit(OpCodes.v128_xor);\n }\n\n bitselect_v128(): any {\n return this.emit(OpCodes.v128_bitselect);\n }\n\n any_true_v128(): any {\n return this.emit(OpCodes.v128_any_true);\n }\n\n load8_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8_lane, alignment, offset);\n }\n\n load16_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16_lane, alignment, offset);\n }\n\n load32_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_lane, alignment, offset);\n }\n\n load64_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_lane, alignment, offset);\n }\n\n store8_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store8_lane, alignment, offset);\n }\n\n store16_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store16_lane, alignment, offset);\n }\n\n store32_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store32_lane, alignment, offset);\n }\n\n store64_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store64_lane, alignment, offset);\n }\n\n load32_zero_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_zero, alignment, offset);\n }\n\n load64_zero_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_zero, alignment, offset);\n }\n\n trunc_sat_f32x4_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f32x4_s);\n }\n\n trunc_sat_f32x4_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f32x4_u);\n }\n\n abs_i8x16(): any {\n return this.emit(OpCodes.i8x16_abs);\n }\n\n neg_i8x16(): any {\n return this.emit(OpCodes.i8x16_neg);\n }\n\n popcnt_i8x16(): any {\n return this.emit(OpCodes.i8x16_popcnt);\n }\n\n all_true_i8x16(): any {\n return this.emit(OpCodes.i8x16_all_true);\n }\n\n bitmask_i8x16(): any {\n return this.emit(OpCodes.i8x16_bitmask);\n }\n\n narrow_i16x8_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_narrow_i16x8_s);\n }\n\n narrow_i16x8_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_narrow_i16x8_u);\n }\n\n ceil_f32x4(): any {\n return this.emit(OpCodes.f32x4_ceil);\n }\n\n floor_f32x4(): any {\n return this.emit(OpCodes.f32x4_floor);\n }\n\n trunc_f32x4(): any {\n return this.emit(OpCodes.f32x4_trunc);\n }\n\n nearest_f32x4(): any {\n return this.emit(OpCodes.f32x4_nearest);\n }\n\n shl_i8x16(): any {\n return this.emit(OpCodes.i8x16_shl);\n }\n\n shr_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_shr_s);\n }\n\n shr_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_shr_u);\n }\n\n add_i8x16(): any {\n return this.emit(OpCodes.i8x16_add);\n }\n\n add_sat_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_add_sat_s);\n }\n\n add_sat_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_add_sat_u);\n }\n\n sub_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub);\n }\n\n sub_sat_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub_sat_s);\n }\n\n sub_sat_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub_sat_u);\n }\n\n ceil_f64x2(): any {\n return this.emit(OpCodes.f64x2_ceil);\n }\n\n floor_f64x2(): any {\n return this.emit(OpCodes.f64x2_floor);\n }\n\n min_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_min_s);\n }\n\n min_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_min_u);\n }\n\n max_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_max_s);\n }\n\n max_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_max_u);\n }\n\n trunc_f64x2(): any {\n return this.emit(OpCodes.f64x2_trunc);\n }\n\n avgr_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_avgr_u);\n }\n\n extadd_pairwise_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extadd_pairwise_i8x16_s);\n }\n\n extadd_pairwise_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extadd_pairwise_i8x16_u);\n }\n\n extadd_pairwise_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extadd_pairwise_i16x8_s);\n }\n\n extadd_pairwise_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extadd_pairwise_i16x8_u);\n }\n\n abs_i16x8(): any {\n return this.emit(OpCodes.i16x8_abs);\n }\n\n neg_i16x8(): any {\n return this.emit(OpCodes.i16x8_neg);\n }\n\n q15mulr_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_q15mulr_sat_s);\n }\n\n all_true_i16x8(): any {\n return this.emit(OpCodes.i16x8_all_true);\n }\n\n bitmask_i16x8(): any {\n return this.emit(OpCodes.i16x8_bitmask);\n }\n\n narrow_i32x4_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_narrow_i32x4_s);\n }\n\n narrow_i32x4_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_narrow_i32x4_u);\n }\n\n extend_low_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_low_i8x16_s);\n }\n\n extend_high_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_high_i8x16_s);\n }\n\n extend_low_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_low_i8x16_u);\n }\n\n extend_high_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_high_i8x16_u);\n }\n\n shl_i16x8(): any {\n return this.emit(OpCodes.i16x8_shl);\n }\n\n shr_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_shr_s);\n }\n\n shr_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_shr_u);\n }\n\n add_i16x8(): any {\n return this.emit(OpCodes.i16x8_add);\n }\n\n add_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_add_sat_s);\n }\n\n add_sat_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_add_sat_u);\n }\n\n sub_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub);\n }\n\n sub_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub_sat_s);\n }\n\n sub_sat_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub_sat_u);\n }\n\n nearest_f64x2(): any {\n return this.emit(OpCodes.f64x2_nearest);\n }\n\n mul_i16x8(): any {\n return this.emit(OpCodes.i16x8_mul);\n }\n\n min_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_min_s);\n }\n\n min_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_min_u);\n }\n\n max_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_max_s);\n }\n\n max_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_max_u);\n }\n\n avgr_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_avgr_u);\n }\n\n extmul_low_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_low_i8x16_s);\n }\n\n extmul_high_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_high_i8x16_s);\n }\n\n extmul_low_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_low_i8x16_u);\n }\n\n extmul_high_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_high_i8x16_u);\n }\n\n abs_i32x4(): any {\n return this.emit(OpCodes.i32x4_abs);\n }\n\n neg_i32x4(): any {\n return this.emit(OpCodes.i32x4_neg);\n }\n\n all_true_i32x4(): any {\n return this.emit(OpCodes.i32x4_all_true);\n }\n\n bitmask_i32x4(): any {\n return this.emit(OpCodes.i32x4_bitmask);\n }\n\n extend_low_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_low_i16x8_s);\n }\n\n extend_high_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_high_i16x8_s);\n }\n\n extend_low_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_low_i16x8_u);\n }\n\n extend_high_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_high_i16x8_u);\n }\n\n shl_i32x4(): any {\n return this.emit(OpCodes.i32x4_shl);\n }\n\n shr_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_shr_s);\n }\n\n shr_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_shr_u);\n }\n\n add_i32x4(): any {\n return this.emit(OpCodes.i32x4_add);\n }\n\n convert_i32x4_s_f32x4(): any {\n return this.emit(OpCodes.f32x4_convert_i32x4_s);\n }\n\n convert_i32x4_u_f32x4(): any {\n return this.emit(OpCodes.f32x4_convert_i32x4_u);\n }\n\n sub_i32x4(): any {\n return this.emit(OpCodes.i32x4_sub);\n }\n\n mul_i32x4(): any {\n return this.emit(OpCodes.i32x4_mul);\n }\n\n min_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_min_s);\n }\n\n min_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_min_u);\n }\n\n max_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_max_s);\n }\n\n max_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_max_u);\n }\n\n dot_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_dot_i16x8_s);\n }\n\n extmul_low_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_low_i16x8_s);\n }\n\n extmul_high_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_high_i16x8_s);\n }\n\n extmul_low_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_low_i16x8_u);\n }\n\n extmul_high_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_high_i16x8_u);\n }\n\n abs_i64x2(): any {\n return this.emit(OpCodes.i64x2_abs);\n }\n\n neg_i64x2(): any {\n return this.emit(OpCodes.i64x2_neg);\n }\n\n all_true_i64x2(): any {\n return this.emit(OpCodes.i64x2_all_true);\n }\n\n bitmask_i64x2(): any {\n return this.emit(OpCodes.i64x2_bitmask);\n }\n\n extend_low_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_low_i32x4_s);\n }\n\n extend_high_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_high_i32x4_s);\n }\n\n extend_low_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_low_i32x4_u);\n }\n\n extend_high_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_high_i32x4_u);\n }\n\n shl_i64x2(): any {\n return this.emit(OpCodes.i64x2_shl);\n }\n\n shr_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_shr_s);\n }\n\n shr_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_shr_u);\n }\n\n add_i64x2(): any {\n return this.emit(OpCodes.i64x2_add);\n }\n\n sub_i64x2(): any {\n return this.emit(OpCodes.i64x2_sub);\n }\n\n mul_i64x2(): any {\n return this.emit(OpCodes.i64x2_mul);\n }\n\n eq_i64x2(): any {\n return this.emit(OpCodes.i64x2_eq);\n }\n\n ne_i64x2(): any {\n return this.emit(OpCodes.i64x2_ne);\n }\n\n lt_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_lt_s);\n }\n\n gt_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_gt_s);\n }\n\n le_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_le_s);\n }\n\n ge_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_ge_s);\n }\n\n extmul_low_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_low_i32x4_s);\n }\n\n extmul_high_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_high_i32x4_s);\n }\n\n extmul_low_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_low_i32x4_u);\n }\n\n extmul_high_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_high_i32x4_u);\n }\n\n abs_f32x4(): any {\n return this.emit(OpCodes.f32x4_abs);\n }\n\n neg_f32x4(): any {\n return this.emit(OpCodes.f32x4_neg);\n }\n\n sqrt_f32x4(): any {\n return this.emit(OpCodes.f32x4_sqrt);\n }\n\n add_f32x4(): any {\n return this.emit(OpCodes.f32x4_add);\n }\n\n sub_f32x4(): any {\n return this.emit(OpCodes.f32x4_sub);\n }\n\n mul_f32x4(): any {\n return this.emit(OpCodes.f32x4_mul);\n }\n\n div_f32x4(): any {\n return this.emit(OpCodes.f32x4_div);\n }\n\n min_f32x4(): any {\n return this.emit(OpCodes.f32x4_min);\n }\n\n max_f32x4(): any {\n return this.emit(OpCodes.f32x4_max);\n }\n\n pmin_f32x4(): any {\n return this.emit(OpCodes.f32x4_pmin);\n }\n\n pmax_f32x4(): any {\n return this.emit(OpCodes.f32x4_pmax);\n }\n\n abs_f64x2(): any {\n return this.emit(OpCodes.f64x2_abs);\n }\n\n neg_f64x2(): any {\n return this.emit(OpCodes.f64x2_neg);\n }\n\n sqrt_f64x2(): any {\n return this.emit(OpCodes.f64x2_sqrt);\n }\n\n add_f64x2(): any {\n return this.emit(OpCodes.f64x2_add);\n }\n\n sub_f64x2(): any {\n return this.emit(OpCodes.f64x2_sub);\n }\n\n mul_f64x2(): any {\n return this.emit(OpCodes.f64x2_mul);\n }\n\n div_f64x2(): any {\n return this.emit(OpCodes.f64x2_div);\n }\n\n min_f64x2(): any {\n return this.emit(OpCodes.f64x2_min);\n }\n\n max_f64x2(): any {\n return this.emit(OpCodes.f64x2_max);\n }\n\n pmin_f64x2(): any {\n return this.emit(OpCodes.f64x2_pmin);\n }\n\n pmax_f64x2(): any {\n return this.emit(OpCodes.f64x2_pmax);\n }\n\n trunc_sat_f64x2_s_zero_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f64x2_s_zero);\n }\n\n trunc_sat_f64x2_u_zero_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f64x2_u_zero);\n }\n\n convert_low_i32x4_s_f64x2(): any {\n return this.emit(OpCodes.f64x2_convert_low_i32x4_s);\n }\n\n convert_low_i32x4_u_f64x2(): any {\n return this.emit(OpCodes.f64x2_convert_low_i32x4_u);\n }\n\n demote_f64x2_zero_f32x4(): any {\n return this.emit(OpCodes.f32x4_demote_f64x2_zero);\n }\n\n promote_low_f32x4_f64x2(): any {\n return this.emit(OpCodes.f64x2_promote_low_f32x4);\n }\n\n abstract emit(opCode: any, ...args: any[]): any;\n}\n", "import { BlockTypeDescriptor } from '../types';\r\nimport OperandStack from './OperandStack';\r\n\r\nexport default class ControlFlowBlock {\r\n stack: OperandStack;\r\n blockType: BlockTypeDescriptor;\r\n parent: ControlFlowBlock | null;\r\n index: number;\r\n depth: number;\r\n childrenCount: number;\r\n isLoop: boolean;\r\n\r\n constructor(\r\n stack: OperandStack,\r\n blockType: BlockTypeDescriptor,\r\n parent: ControlFlowBlock | null,\r\n index: number,\r\n depth: number,\r\n childrenCount: number,\r\n isLoop: boolean = false\r\n ) {\r\n this.stack = stack;\r\n this.blockType = blockType;\r\n this.parent = parent;\r\n this.index = index;\r\n this.depth = depth;\r\n this.childrenCount = childrenCount;\r\n this.isLoop = isLoop;\r\n }\r\n\r\n canReference(block: ControlFlowBlock): boolean {\r\n if (this.depth > block.depth) {\r\n return false;\r\n }\r\n\r\n let potentialMatch: ControlFlowBlock = block;\r\n for (let index = 0; index < block.depth - this.depth; index++) {\r\n potentialMatch = potentialMatch.parent!;\r\n }\r\n\r\n return potentialMatch === this;\r\n }\r\n\r\n findParent(other: ControlFlowBlock): ControlFlowBlock | null {\r\n let potentialParent: ControlFlowBlock;\r\n let potentialMatch: ControlFlowBlock;\r\n\r\n if (other.depth > this.depth) {\r\n potentialParent = this;\r\n potentialMatch = other;\r\n } else {\r\n potentialParent = other;\r\n potentialMatch = this;\r\n }\r\n\r\n for (let index = 0; index < Math.abs(potentialParent.depth - potentialMatch.depth); index++) {\r\n potentialMatch = potentialMatch.parent!;\r\n }\r\n\r\n return potentialParent === potentialMatch ? potentialParent : null;\r\n }\r\n}\r\n", "export default class VerificationError extends Error {\r\n constructor(message?: string) {\r\n super(message);\r\n this.name = 'VerificationError';\r\n }\r\n}\r\n", "import { BlockType, BlockTypeDescriptor } from '../types';\r\nimport ControlFlowBlock from './ControlFlowBlock';\r\nimport LabelBuilder from '../LabelBuilder';\r\nimport OperandStack from './OperandStack';\r\nimport VerificationError from './VerificationError';\r\n\r\nexport default class ControlFlowVerifier {\r\n _stack: LabelBuilder[] = [];\r\n _unresolvedLabels: LabelBuilder[] = [];\r\n _disableVerification: boolean;\r\n\r\n constructor(disableVerification: boolean) {\r\n this._disableVerification = disableVerification;\r\n }\r\n\r\n get size(): number {\r\n return this._stack.length;\r\n }\r\n\r\n push(\r\n operandStack: OperandStack,\r\n blockType: BlockTypeDescriptor,\r\n label: LabelBuilder | null = null,\r\n isLoop: boolean = false\r\n ): LabelBuilder {\r\n const current = this.peek();\r\n if (label) {\r\n if (!this._disableVerification && label.isResolved) {\r\n throw new VerificationError(\r\n 'Cannot use a label that has already been associated with another block.'\r\n );\r\n }\r\n\r\n const labelIndex = this._unresolvedLabels.findIndex((x) => x === label);\r\n if (labelIndex === -1) {\r\n throw new VerificationError('The label was not created for this function.');\r\n }\r\n\r\n if (\r\n !this._disableVerification &&\r\n label.block &&\r\n current &&\r\n !current.block!.canReference(label.block)\r\n ) {\r\n throw new VerificationError(\r\n 'Label has been referenced by an instruction in an enclosing block that ' +\r\n 'cannot branch to the current enclosing block.'\r\n );\r\n }\r\n\r\n this._unresolvedLabels.splice(labelIndex, 1);\r\n } else {\r\n label = new LabelBuilder();\r\n }\r\n\r\n const block = !current\r\n ? new ControlFlowBlock(operandStack, BlockType.Void, null, 0, 0, 0)\r\n : new ControlFlowBlock(\r\n operandStack,\r\n blockType,\r\n current.block!,\r\n current.block!.childrenCount++,\r\n current.block!.depth + 1,\r\n 0,\r\n isLoop\r\n );\r\n\r\n label.resolve(block);\r\n this._stack.push(label);\r\n return label;\r\n }\r\n\r\n pop(): void {\r\n if (this._stack.length === 0) {\r\n throw new VerificationError('Cannot end the block, the stack is empty.');\r\n }\r\n this._stack.pop();\r\n }\r\n\r\n peek(): LabelBuilder | null {\r\n return this._stack.length === 0 ? null : this._stack[this._stack.length - 1];\r\n }\r\n\r\n defineLabel(): LabelBuilder {\r\n const label = new LabelBuilder();\r\n this._unresolvedLabels.push(label);\r\n return label;\r\n }\r\n\r\n reference(label: LabelBuilder): void {\r\n if (this._disableVerification) {\r\n return;\r\n }\r\n\r\n const current = this.peek();\r\n if (label.isResolved) {\r\n if (!current || !label.block!.canReference(current.block!)) {\r\n throw new VerificationError(\r\n 'The label cannot be referenced by the current enclosing block.'\r\n );\r\n }\r\n } else {\r\n if (!this._unresolvedLabels.find((x) => x === label)) {\r\n throw new VerificationError('The label was not created for this function.');\r\n }\r\n\r\n if (!label.block) {\r\n throw new VerificationError('Label has not been associated with any block.');\r\n }\r\n\r\n const potentialParent = label.block.findParent(current!.block!);\r\n if (!potentialParent) {\r\n throw new VerificationError('The reference to this label is invalid.');\r\n }\r\n\r\n label.reference(potentialParent);\r\n }\r\n }\r\n\r\n verify(): void {\r\n if (this._disableVerification) {\r\n return;\r\n }\r\n\r\n if (this._unresolvedLabels.some((x) => x.block)) {\r\n throw new VerificationError('The function contains unresolved labels.');\r\n }\r\n\r\n if (this._stack.length === 1) {\r\n throw new VerificationError('Function is missing closing end instruction.');\r\n } else if (this._stack.length !== 0) {\r\n throw new VerificationError(\r\n `Function has ${this._stack.length} control structures ` +\r\n 'that are not closed. Every block, if, and loop must have a corresponding end instruction.'\r\n );\r\n }\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from '../types';\r\n\r\nexport default class OperandStack {\r\n static Empty: OperandStack = (() => {\r\n const operandStack = Object.create(OperandStack.prototype) as OperandStack;\r\n operandStack._valueType = null!;\r\n operandStack._previous = null;\r\n operandStack._length = 0;\r\n return operandStack;\r\n })();\r\n\r\n _previous: OperandStack | null;\r\n _length: number;\r\n _valueType: ValueTypeDescriptor;\r\n\r\n constructor(valueType: ValueTypeDescriptor, previous: OperandStack | null = null) {\r\n this._valueType = valueType;\r\n this._previous = previous;\r\n this._length = this._previous ? this._previous._length + 1 : 1;\r\n }\r\n\r\n get length(): number {\r\n return this._length;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n if (this.isEmpty) {\r\n throw new Error('The stack is empty.');\r\n }\r\n return this._valueType;\r\n }\r\n\r\n get isEmpty(): boolean {\r\n return this._length === 0;\r\n }\r\n\r\n push(valueType: ValueTypeDescriptor): OperandStack {\r\n return new OperandStack(valueType, this);\r\n }\r\n\r\n pop(): OperandStack {\r\n if (this.isEmpty) {\r\n throw new Error('The stack is empty.');\r\n }\r\n return this._previous!;\r\n }\r\n\r\n peek(): OperandStack | null {\r\n return this._previous;\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FuncTypeSignature {\r\n static empty = new FuncTypeSignature([], []);\r\n\r\n returnTypes: ValueTypeDescriptor[];\r\n parameterTypes: ValueTypeDescriptor[];\r\n\r\n constructor(returnTypes: ValueTypeDescriptor[], parameterTypes: ValueTypeDescriptor[]) {\r\n this.returnTypes = returnTypes;\r\n this.parameterTypes = parameterTypes;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { TypeForm, ValueTypeDescriptor } from './types';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\n\r\nexport default class FuncTypeBuilder {\r\n key: string;\r\n index: number;\r\n returnTypes: ValueTypeDescriptor[];\r\n parameterTypes: ValueTypeDescriptor[];\r\n\r\n constructor(\r\n key: string,\r\n returnTypes: ValueTypeDescriptor[],\r\n parameterTypes: ValueTypeDescriptor[],\r\n index: number\r\n ) {\r\n this.key = key;\r\n this.returnTypes = returnTypes;\r\n this.parameterTypes = parameterTypes;\r\n this.index = index;\r\n }\r\n\r\n get typeForm() {\r\n return TypeForm.Func;\r\n }\r\n\r\n static createKey(returnTypes: ValueTypeDescriptor[], parameterTypes: ValueTypeDescriptor[]): string {\r\n let key = '(';\r\n returnTypes.forEach((x, i) => {\r\n key += x.short;\r\n if (i !== returnTypes.length - 1) {\r\n key += ', ';\r\n }\r\n });\r\n\r\n key += ')(';\r\n parameterTypes.forEach((x, i) => {\r\n key += x.short;\r\n if (i !== parameterTypes.length - 1) {\r\n key += ', ';\r\n }\r\n });\r\n\r\n key += ')';\r\n return key;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarInt7(TypeForm.Func.value);\r\n writer.writeVarUInt32(this.parameterTypes.length);\r\n this.parameterTypes.forEach((x) => {\r\n writer.writeVarInt7(x.value);\r\n });\r\n\r\n writer.writeVarUInt1(this.returnTypes.length);\r\n this.returnTypes.forEach((x) => {\r\n writer.writeVarInt7(x.value);\r\n });\r\n }\r\n\r\n toSignature(): FuncTypeSignature {\r\n return new FuncTypeSignature(this.returnTypes, this.parameterTypes);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import OperandStack from './OperandStack';\r\nimport OpCodes from '../OpCodes';\r\nimport { ValueType, BlockType, ImmediateType, ValueTypeDescriptor, BlockTypeDescriptor, OpCodeDef } from '../types';\r\nimport { OperandStackBehavior, OperandStackType, ControlFlowType } from './types';\r\nimport Immediate from '../Immediate';\r\nimport ControlFlowBlock from './ControlFlowBlock';\r\nimport type FunctionBuilder from '../FunctionBuilder';\r\nimport ImportBuilder from '../ImportBuilder';\r\nimport FuncTypeBuilder from '../FuncTypeBuilder';\r\nimport LocalBuilder from '../LocalBuilder';\r\nimport GlobalBuilder from '../GlobalBuilder';\r\nimport FunctionParameterBuilder from '../FunctionParameterBuilder';\r\nimport FuncTypeSignature from '../FuncTypeSignature';\r\nimport VerificationError from './VerificationError';\r\n\r\nexport default class OperandStackVerifier {\r\n _operandStack: OperandStack;\r\n _instructionCount: number;\r\n _funcType: FuncTypeSignature;\r\n\r\n constructor(funcType: FuncTypeSignature) {\r\n this._operandStack = OperandStack.Empty;\r\n this._instructionCount = 0;\r\n this._funcType = funcType;\r\n }\r\n\r\n get stack(): OperandStack {\r\n return this._operandStack;\r\n }\r\n\r\n verifyInstruction(\r\n controlBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null\r\n ): void {\r\n let modifiedStack = this._operandStack;\r\n if (opCode.stackBehavior !== OperandStackBehavior.None) {\r\n modifiedStack = this._verifyStack(controlBlock, opCode, immediate);\r\n }\r\n\r\n if (opCode.controlFlow === ControlFlowType.Pop) {\r\n this._verifyControlFlowPop(controlBlock, modifiedStack);\r\n } else if (opCode === (OpCodes as any).return) {\r\n modifiedStack = this._verifyReturnValues(modifiedStack, true);\r\n }\r\n\r\n if (immediate && immediate.type === ImmediateType.RelativeDepth) {\r\n this._verifyBranch(modifiedStack, immediate);\r\n }\r\n\r\n this._operandStack = modifiedStack;\r\n this._instructionCount++;\r\n }\r\n\r\n verifyElse(controlBlock: ControlFlowBlock): void {\r\n if (controlBlock.blockType !== BlockType.Void) {\r\n // Non-void if block: the true branch must have the result on stack\r\n if (this._operandStack.isEmpty) {\r\n throw new VerificationError(\r\n `else: expected ${(controlBlock.blockType as BlockTypeDescriptor).name} on the stack from the if-branch but the stack is empty.`\r\n );\r\n }\r\n const expectedType = controlBlock.blockType as ValueTypeDescriptor;\r\n if (this._operandStack.valueType !== expectedType) {\r\n throw new VerificationError(\r\n `else: expected ${expectedType.name} on the stack but found ${this._operandStack.valueType.name}.`\r\n );\r\n }\r\n const stackAfterPop = this._operandStack.pop();\r\n if (stackAfterPop !== controlBlock.stack) {\r\n throw new VerificationError(\r\n 'else: stack (minus result value) does not match the if-block entry stack.'\r\n );\r\n }\r\n } else {\r\n // Void if block: stack must match entry\r\n if (this._operandStack !== controlBlock.stack) {\r\n throw new VerificationError(\r\n 'else: stack does not match the if-block entry stack.'\r\n );\r\n }\r\n }\r\n // Reset stack for else branch\r\n this._operandStack = controlBlock.stack;\r\n }\r\n\r\n _verifyBranch(stack: OperandStack, immediate: Immediate): void {\r\n const targetBlock = immediate.values[0].block as ControlFlowBlock;\r\n const targetEntryStack = targetBlock.stack;\r\n\r\n if (targetBlock.isLoop) {\r\n // Branch to loop header: no result values needed, stack must match entry\r\n if (targetEntryStack !== stack) {\r\n throw new VerificationError(\r\n 'Branch to loop: stack does not match the loop entry stack.'\r\n );\r\n }\r\n return;\r\n }\r\n\r\n if (targetBlock.blockType !== BlockType.Void) {\r\n // Non-void block: branch must carry the result value\r\n if (stack.isEmpty) {\r\n throw new VerificationError(\r\n `Branch expects ${(targetBlock.blockType as BlockTypeDescriptor).name} on the stack but the stack is empty.`\r\n );\r\n }\r\n const expectedType = targetBlock.blockType as ValueTypeDescriptor;\r\n if (stack.valueType !== expectedType) {\r\n throw new VerificationError(\r\n `Branch expects ${expectedType.name} but found ${stack.valueType.name} on the stack.`\r\n );\r\n }\r\n stack = stack.pop();\r\n }\r\n\r\n if (targetEntryStack !== stack) {\r\n throw new VerificationError(\r\n 'Branch: stack does not match the target block entry stack.'\r\n );\r\n }\r\n }\r\n\r\n _verifyReturnValues(stack: OperandStack, pop: boolean = false): OperandStack {\r\n const remaining = this._getStackValueTypes(stack, stack.length);\r\n if (remaining.length !== this._funcType.returnTypes.length) {\r\n if (remaining.length === 0) {\r\n throw new VerificationError(\r\n `Function expected to return ${this._formatAndList(this._funcType.returnTypes, (x) => x.name)} ` +\r\n 'but stack is empty.'\r\n );\r\n } else if (this._funcType.returnTypes.length === 0) {\r\n throw new VerificationError(\r\n `Function does not have any return values but ${this._formatAndList(remaining, (x) => x.name)} ` +\r\n `was found on the stack.`\r\n );\r\n }\r\n\r\n throw new VerificationError(\r\n `Function return values do not match the items on the stack. ` +\r\n `Expected: ${this._formatAndList(this._funcType.returnTypes, (x) => x.name)} ` +\r\n `Found on stack: ${this._formatAndList(remaining, (x) => x.name)}.`\r\n );\r\n }\r\n\r\n let errorMessage = '';\r\n for (let index = 0; index < remaining.length; index++) {\r\n if (remaining[index] !== this._funcType.returnTypes[index]) {\r\n errorMessage =\r\n `A ${this._funcType.returnTypes[index]} was expected at ${remaining.length - index} ` +\r\n `but a ${remaining[index]} was found. `;\r\n }\r\n }\r\n\r\n if (errorMessage !== '') {\r\n throw new VerificationError('Error returning from function: ' + errorMessage);\r\n }\r\n\r\n if (pop) {\r\n for (let index = 0; index < remaining.length; index++) {\r\n stack = stack.pop();\r\n }\r\n }\r\n\r\n return stack;\r\n }\r\n\r\n _verifyControlFlowPop(controlBlock: ControlFlowBlock, stack: OperandStack): void {\r\n if (controlBlock.depth === 0) {\r\n this._verifyReturnValues(stack);\r\n } else {\r\n const expectedStack =\r\n controlBlock.blockType !== BlockType.Void ? stack.pop() : stack;\r\n if (controlBlock.stack !== expectedStack) {\r\n throw new VerificationError();\r\n }\r\n }\r\n }\r\n\r\n _verifyStack(\r\n controlFlowBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null\r\n ): OperandStack {\r\n let modifiedStack = this._operandStack;\r\n const funcType = this._getFuncType(opCode, immediate);\r\n\r\n if (\r\n opCode.stackBehavior === OperandStackBehavior.Pop ||\r\n opCode.stackBehavior === OperandStackBehavior.PopPush\r\n ) {\r\n modifiedStack = this._verifyStackPop(modifiedStack, opCode, funcType);\r\n }\r\n\r\n if (\r\n opCode.stackBehavior === OperandStackBehavior.Push ||\r\n opCode.stackBehavior === OperandStackBehavior.PopPush\r\n ) {\r\n modifiedStack = this._stackPush(\r\n modifiedStack,\r\n controlFlowBlock,\r\n opCode,\r\n immediate,\r\n funcType\r\n );\r\n }\r\n\r\n return modifiedStack;\r\n }\r\n\r\n _verifyStackPop(\r\n stack: OperandStack,\r\n opCode: OpCodeDef,\r\n funcType: FuncTypeBuilder | null\r\n ): OperandStack {\r\n if (funcType) {\r\n stack = funcType.parameterTypes.reduce((i, x) => {\r\n if (x !== i.valueType) {\r\n throw new VerificationError(\r\n `Unexpected type found on stack at offset ${this._instructionCount + 1}. ` +\r\n `A ${x} was expected but a ${i.valueType} was found.`\r\n );\r\n }\r\n return i.pop();\r\n }, stack);\r\n }\r\n\r\n stack = (opCode.popOperands || []).reduce((i, x) => {\r\n if (x === OperandStackType.Any) {\r\n return i.pop();\r\n }\r\n\r\n const valueType = (ValueType as any)[x] as ValueTypeDescriptor;\r\n if (valueType !== i.valueType) {\r\n throw new VerificationError(\r\n `Unexpected type found on stack at offset ${this._instructionCount + 1}. ` +\r\n `A ${valueType} was expected but a ${i.valueType} was found.`\r\n );\r\n }\r\n return i.pop();\r\n }, stack);\r\n\r\n return stack;\r\n }\r\n\r\n _stackPush(\r\n stack: OperandStack,\r\n controlBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n funcType: FuncTypeBuilder | null\r\n ): OperandStack {\r\n const stackStart = stack;\r\n if (funcType) {\r\n stack = funcType.returnTypes.reduce((i, x) => {\r\n return i.push(x);\r\n }, stack);\r\n }\r\n\r\n stack = (opCode.pushOperands || []).reduce((i, x) => {\r\n let valueType: ValueTypeDescriptor;\r\n if (x !== OperandStackType.Any) {\r\n valueType = (ValueType as any)[x] as ValueTypeDescriptor;\r\n } else {\r\n const popCount = this._operandStack.length - stackStart.length;\r\n valueType = this._getStackObjectValueType(opCode, immediate, popCount);\r\n }\r\n return i.push(valueType);\r\n }, stack);\r\n\r\n return stack;\r\n }\r\n\r\n _getFuncType(opCode: OpCodeDef, immediate: Immediate | null): FuncTypeBuilder | null {\r\n let funcType: FuncTypeBuilder | null = null;\r\n\r\n if (opCode === (OpCodes as any).call) {\r\n if (immediate!.values[0] instanceof ImportBuilder) {\r\n funcType = immediate!.values[0].data as FuncTypeBuilder;\r\n } else if (immediate!.values[0] && 'funcTypeBuilder' in immediate!.values[0]) {\r\n funcType = (immediate!.values[0] as FunctionBuilder).funcTypeBuilder;\r\n } else {\r\n throw new VerificationError('Error getting funcType for call, invalid immediate.');\r\n }\r\n } else if (opCode === (OpCodes as any).call_indirect) {\r\n if (immediate!.values[0] instanceof FuncTypeBuilder) {\r\n funcType = immediate!.values[0];\r\n } else {\r\n throw new VerificationError(\r\n 'Error getting funcType for call_indirect, invalid immediate.'\r\n );\r\n }\r\n }\r\n\r\n return funcType;\r\n }\r\n\r\n _getStackObjectValueType(\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n argCount: number\r\n ): ValueTypeDescriptor {\r\n if (\r\n opCode === (OpCodes as any).get_global ||\r\n opCode === (OpCodes as any).set_global\r\n ) {\r\n if (immediate!.values[0] instanceof GlobalBuilder) {\r\n return immediate!.values[0].valueType;\r\n } else if (immediate!.values[0] instanceof ImportBuilder) {\r\n return (immediate!.values[0].data as GlobalType).valueType;\r\n }\r\n throw new VerificationError('Invalid operand for global instruction.');\r\n } else if (\r\n opCode === (OpCodes as any).get_local ||\r\n opCode === (OpCodes as any).set_local ||\r\n opCode === (OpCodes as any).tee_local\r\n ) {\r\n if (\r\n !(immediate!.values[0] instanceof LocalBuilder) &&\r\n !(immediate!.values[0] instanceof FunctionParameterBuilder)\r\n ) {\r\n throw new VerificationError('Invalid operand for local instruction.');\r\n }\r\n return immediate!.values[0].valueType;\r\n }\r\n\r\n const stackArgTypes = this._getStackValueTypes(this._operandStack, argCount);\r\n return stackArgTypes[0];\r\n }\r\n\r\n _getStackValueTypes(stack: OperandStack, count: number): ValueTypeDescriptor[] {\r\n const results: ValueTypeDescriptor[] = [];\r\n let current = stack;\r\n\r\n for (let index = 0; index < count; index++) {\r\n results.push(current.valueType);\r\n current = current.pop();\r\n }\r\n\r\n return results.reverse();\r\n }\r\n\r\n _formatAndList(values: T[], getText?: (item: T) => string): string {\r\n if (values.length === 1) {\r\n return getText ? getText(values[0]) : String(values[0]);\r\n }\r\n\r\n let text = '';\r\n for (let index = 0; index < values.length; index++) {\r\n text += getText ? getText(values[index]) : String(values[index]);\r\n if (index === values.length - 2) {\r\n text += ' and ';\r\n } else if (index !== values.length - 1) {\r\n text += ', ';\r\n }\r\n }\r\n\r\n return text;\r\n }\r\n}\r\n\r\n// Import at the end to avoid circular dependency issues at type level\r\nimport type GlobalType from '../GlobalType';\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport { BlockTypeDescriptor, ImmediateType, OpCodeDef, WasmFeature } from './types';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport Immediate from './Immediate';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport Instruction from './Instruction';\r\nimport LabelBuilder from './LabelBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport OpCodeEmitter from './OpCodeEmitter';\r\nimport OpCodes from './OpCodes';\r\nimport ControlFlowVerifier from './verification/ControlFlowVerifier';\r\nimport { ControlFlowType } from './verification/types';\r\nimport OperandStackVerifier from './verification/OperandStackVerifier';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\nimport { BlockType } from './types';\r\n\r\nconst validateParameters = (immediateType: string, values: any[] | undefined, length: number): void => {\r\n if (!values || values.length !== length) {\r\n throw new Error(`Unexpected number of values for ${immediateType}.`);\r\n }\r\n};\r\n\r\nexport interface AssemblyEmitterOptions {\r\n disableVerification: boolean;\r\n features?: Set;\r\n}\r\n\r\nexport default class AssemblyEmitter extends OpCodeEmitter {\r\n _instructions: Instruction[];\r\n _locals: LocalBuilder[];\r\n _entryLabel: LabelBuilder;\r\n _controlFlowVerifier: ControlFlowVerifier;\r\n _operandStackVerifier: OperandStackVerifier;\r\n _options: AssemblyEmitterOptions;\r\n\r\n constructor(\r\n funcSignature: FuncTypeSignature,\r\n options: AssemblyEmitterOptions = { disableVerification: false }\r\n ) {\r\n super();\r\n\r\n Arg.instanceOf('funcSignature', funcSignature, FuncTypeSignature);\r\n this._instructions = [];\r\n this._locals = [];\r\n this._controlFlowVerifier = new ControlFlowVerifier(options.disableVerification);\r\n this._operandStackVerifier = new OperandStackVerifier(funcSignature);\r\n this._entryLabel = this._controlFlowVerifier.push(\r\n this._operandStackVerifier.stack,\r\n BlockType.Void\r\n );\r\n this._options = options;\r\n }\r\n\r\n get returnValues(): any {\r\n return this;\r\n }\r\n\r\n get parameters(): FunctionParameterBuilder[] {\r\n return [];\r\n }\r\n\r\n get entryLabel(): LabelBuilder {\r\n return this._entryLabel;\r\n }\r\n\r\n get disableVerification(): boolean {\r\n return this._options.disableVerification;\r\n }\r\n\r\n getParameter(_index: number): FunctionParameterBuilder | LocalBuilder {\r\n throw new Error('Not supported.');\r\n }\r\n\r\n declareLocal(\r\n type: any,\r\n name: string | null = null,\r\n count: number = 1\r\n ): LocalBuilder {\r\n const localBuilder = new LocalBuilder(\r\n type,\r\n name,\r\n this._locals.length + this.parameters.length,\r\n count\r\n );\r\n this._locals.push(localBuilder);\r\n return localBuilder;\r\n }\r\n\r\n defineLabel(): LabelBuilder {\r\n return this._controlFlowVerifier.defineLabel();\r\n }\r\n\r\n emit(opCode: OpCodeDef, ...args: any[]): any {\r\n Arg.notNull('opCode', opCode);\r\n const depth = this._controlFlowVerifier.size - 1;\r\n let result: any = null;\r\n let immediate: Immediate | null = null;\r\n let pushLabel: LabelBuilder | null = null;\r\n let labelCallback: ((label: any) => void) | null = null;\r\n\r\n if (depth < 0) {\r\n throw new Error(\r\n 'Cannot add any instructions after the main control enclosure has been closed.'\r\n );\r\n }\r\n\r\n if (opCode.controlFlow === ControlFlowType.Push && args.length > 1) {\r\n if (args.length > 2) {\r\n throw new Error(`Unexpected number of values for ${ImmediateType.BlockSignature}.`);\r\n }\r\n\r\n if (args[1]) {\r\n if (args[1] instanceof LabelBuilder) {\r\n pushLabel = args[1];\r\n } else if (typeof args[1] === 'function') {\r\n const userFunction = args[1];\r\n labelCallback = (x: any) => {\r\n userFunction(x);\r\n };\r\n } else {\r\n throw new Error('Error');\r\n }\r\n }\r\n\r\n args = [args[0]];\r\n }\r\n\r\n if (opCode.feature && this._options.features && !this._options.features.has(opCode.feature as WasmFeature)) {\r\n throw new Error(\r\n `Opcode ${opCode.mnemonic} requires the '${opCode.feature}' feature. ` +\r\n `Enable it via the 'features' or 'target' option in ModuleBuilder.`\r\n );\r\n }\r\n\r\n if (opCode.immediate) {\r\n immediate = this._createImmediate(\r\n opCode.immediate as ImmediateType,\r\n args,\r\n depth\r\n );\r\n\r\n if (immediate.type === ImmediateType.RelativeDepth) {\r\n this._controlFlowVerifier.reference(args[0]);\r\n }\r\n }\r\n\r\n if (!this.disableVerification) {\r\n this._operandStackVerifier.verifyInstruction(\r\n this._controlFlowVerifier.peek()!.block!,\r\n opCode,\r\n immediate\r\n );\r\n\r\n if (opCode === (OpCodes as any).else) {\r\n this._operandStackVerifier.verifyElse(\r\n this._controlFlowVerifier.peek()!.block!\r\n );\r\n }\r\n }\r\n\r\n if (opCode.controlFlow) {\r\n result = this._updateControlFlow(opCode, immediate, pushLabel);\r\n }\r\n\r\n this._instructions.push(new Instruction(opCode, immediate));\r\n if (labelCallback) {\r\n labelCallback(result);\r\n this.end();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n _updateControlFlow(\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n label: LabelBuilder | null\r\n ): any {\r\n let result: any = null;\r\n if (opCode.controlFlow === ControlFlowType.Push) {\r\n const blockType = immediate!.values[0] as BlockTypeDescriptor;\r\n const isLoop = opCode === (OpCodes as any).loop;\r\n result = this._controlFlowVerifier.push(\r\n this._operandStackVerifier.stack,\r\n blockType,\r\n label,\r\n isLoop\r\n );\r\n } else if (opCode.controlFlow === ControlFlowType.Pop) {\r\n this._controlFlowVerifier.pop();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._controlFlowVerifier.verify();\r\n\r\n const bodyWriter = new BinaryWriter();\r\n this._writeLocals(bodyWriter);\r\n\r\n for (let index = 0; index < this._instructions.length; index++) {\r\n this._instructions[index].write(bodyWriter);\r\n }\r\n\r\n writer.writeVarUInt32(bodyWriter.length);\r\n writer.writeBytes(bodyWriter);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n\r\n _writeLocals(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this._locals.length);\r\n for (let index = 0; index < this._locals.length; index++) {\r\n this._locals[index].write(writer);\r\n }\r\n }\r\n\r\n _createImmediate(immediateType: ImmediateType, values: any[], depth: number): Immediate {\r\n switch (immediateType) {\r\n case ImmediateType.BlockSignature:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createBlockSignature(values[0]);\r\n\r\n case ImmediateType.BranchTable:\r\n validateParameters(immediateType, values, 2);\r\n return Immediate.createBranchTable(values[0], values[1], depth);\r\n\r\n case ImmediateType.Float32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createFloat32(values[0]);\r\n\r\n case ImmediateType.Float64:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createFloat64(values[0]);\r\n\r\n case ImmediateType.Function:\r\n validateParameters(immediateType, values, 1);\r\n if (!(values[0] instanceof ImportBuilder) && !(values[0] && '_index' in values[0] && 'funcTypeBuilder' in values[0])) {\r\n throw new Error('functionBuilder must be a FunctionBuilder or ImportBuilder.');\r\n }\r\n return Immediate.createFunction(values[0]);\r\n\r\n case ImmediateType.Global:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createGlobal(values[0]);\r\n\r\n case ImmediateType.IndirectFunction:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createIndirectFunction(values[0]);\r\n\r\n case ImmediateType.Local:\r\n validateParameters(immediateType, values, 1);\r\n let local = values[0];\r\n if (typeof local === 'number') {\r\n local = this.getParameter(local);\r\n }\r\n Arg.instanceOf('local', local, LocalBuilder, FunctionParameterBuilder);\r\n return Immediate.createLocal(local);\r\n\r\n case ImmediateType.MemoryImmediate:\r\n validateParameters(immediateType, values, 2);\r\n return Immediate.createMemoryImmediate(values[0], values[1]);\r\n\r\n case ImmediateType.RelativeDepth:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createRelativeDepth(values[0], depth);\r\n\r\n case ImmediateType.VarInt32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarInt32(values[0]);\r\n\r\n case ImmediateType.VarInt64:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarInt64(values[0]);\r\n\r\n case ImmediateType.VarUInt1:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarUInt1(values[0]);\r\n\r\n case ImmediateType.VarUInt32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarUInt32(values[0]);\r\n\r\n case ImmediateType.V128Const:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createV128Const(values[0]);\r\n\r\n case ImmediateType.LaneIndex:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createLaneIndex(values[0]);\r\n\r\n case ImmediateType.ShuffleMask:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createShuffleMask(values[0]);\r\n\r\n default:\r\n throw new Error('Unknown operand type.');\r\n }\r\n }\r\n}\r\n", "import AssemblyEmitter from './AssemblyEmitter';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { InitExpressionType, ValueTypeDescriptor, OpCodeDef } from './types';\r\nimport OpCodes from './OpCodes';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class InitExpressionEmitter extends AssemblyEmitter {\r\n _initExpressionType: InitExpressionType;\r\n\r\n constructor(initExpressionType: InitExpressionType, valueType: ValueTypeDescriptor) {\r\n super(new FuncTypeSignature([valueType], []));\r\n this._initExpressionType = initExpressionType;\r\n }\r\n\r\n getParameter(_index: number): never {\r\n throw new Error('An initialization expression does not have any parameters.');\r\n }\r\n\r\n declareLocal(): never {\r\n throw new Error('An initialization expression cannot have locals.');\r\n }\r\n\r\n emit(opCode: OpCodeDef, ...args: any[]): any {\r\n this._isValidateOp(opCode, args);\r\n return super.emit(opCode, ...args);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n for (let index = 0; index < this._instructions.length; index++) {\r\n this._instructions[index].write(writer);\r\n }\r\n }\r\n\r\n _isValidateOp(opCode: OpCodeDef, args?: any[]): void {\r\n if (this._instructions.length === 2) {\r\n return;\r\n }\r\n\r\n if (this._instructions.length === 1) {\r\n if (opCode !== OpCodes.end) {\r\n throw new Error(`Opcode ${opCode.mnemonic} is not valid after init expression value.`);\r\n }\r\n return;\r\n }\r\n\r\n switch (opCode) {\r\n case OpCodes.f32_const:\r\n case OpCodes.f64_const:\r\n case OpCodes.i32_const:\r\n case OpCodes.i64_const:\r\n break;\r\n\r\n case OpCodes.get_global: {\r\n const globalBuilder = args?.[0];\r\n if (this._initExpressionType === InitExpressionType.Element) {\r\n throw new Error(\r\n 'The only valid instruction for an element initializer expression is a constant i32, ' +\r\n 'global not supported.'\r\n );\r\n }\r\n\r\n if (!(globalBuilder instanceof GlobalBuilder)) {\r\n throw new Error('A global builder was expected.');\r\n }\r\n\r\n if (globalBuilder.globalType.mutable) {\r\n throw new Error(\r\n 'An initializer expression cannot reference a mutable global.'\r\n );\r\n }\r\n\r\n break;\r\n }\r\n\r\n default:\r\n throw new Error(\r\n `Opcode ${opCode.mnemonic} is not supported in an initializer expression.`\r\n );\r\n }\r\n }\r\n}\r\n", "import InitExpressionEmitter from './InitExpressionEmitter';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { InitExpressionType, ValueType } from './types';\r\n\r\nexport default class DataSegmentBuilder {\r\n _data: Uint8Array;\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n\r\n constructor(data: Uint8Array) {\r\n this._data = data;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Data,\r\n ValueType.Int32\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n offset(value: number | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number') {\r\n this.createInitEmitter((asm) => {\r\n asm.const_i32(value);\r\n });\r\n } else {\r\n throw new Error('Unsupported offset');\r\n }\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n writer.writeVarUInt32(0);\r\n this._initExpressionEmitter.write(writer);\r\n writer.writeVarUInt32(this._data.length);\r\n writer.writeBytes(this._data);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import AssemblyEmitter, { AssemblyEmitterOptions } from './AssemblyEmitter';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FunctionEmitter extends AssemblyEmitter {\r\n _functionBuilder: FunctionBuilder;\r\n\r\n constructor(functionBuilder: FunctionBuilder, options?: AssemblyEmitterOptions) {\r\n super(functionBuilder.funcTypeBuilder.toSignature(), options);\r\n this._functionBuilder = functionBuilder;\r\n this._locals = [];\r\n }\r\n\r\n get returnValues(): ValueTypeDescriptor[] {\r\n return this._functionBuilder.funcTypeBuilder.returnTypes;\r\n }\r\n\r\n get parameters(): FunctionParameterBuilder[] {\r\n return this._functionBuilder.parameters;\r\n }\r\n\r\n getParameter(index: number): FunctionParameterBuilder | LocalBuilder {\r\n if (index >= 0) {\r\n if (index < this.parameters.length) {\r\n return this._functionBuilder.getParameter(index);\r\n }\r\n\r\n const localIndex = index - this.parameters.length;\r\n if (localIndex < this._locals.length) {\r\n return this._locals[localIndex];\r\n }\r\n }\r\n\r\n throw new Error('Invalid parameter index.');\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport { ValueTypeDescriptor } from './types';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class FunctionBuilder {\r\n name: string;\r\n funcTypeBuilder: FuncTypeBuilder;\r\n parameters: FunctionParameterBuilder[];\r\n _index: number;\r\n functionEmitter: FunctionEmitter | null = null;\r\n _moduleBuilder: ModuleBuilder;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n name: string,\r\n funcTypeBuilder: FuncTypeBuilder,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this.name = name;\r\n this.funcTypeBuilder = funcTypeBuilder;\r\n this._index = index;\r\n this.parameters = funcTypeBuilder.parameterTypes.map(\r\n (x, i) => new FunctionParameterBuilder(x, i)\r\n );\r\n }\r\n\r\n get returnType(): ValueTypeDescriptor[] {\r\n return this.funcTypeBuilder.returnTypes;\r\n }\r\n\r\n get parameterTypes(): ValueTypeDescriptor[] {\r\n return this.funcTypeBuilder.parameterTypes;\r\n }\r\n\r\n getParameter(index: number): FunctionParameterBuilder {\r\n return this.parameters[index];\r\n }\r\n\r\n createEmitter(callback?: (asm: FunctionEmitter) => void): FunctionEmitter {\r\n if (this.functionEmitter) {\r\n throw new Error('Function emitter has already been created.');\r\n }\r\n\r\n this.functionEmitter = new FunctionEmitter(this, {\r\n disableVerification: this._moduleBuilder.disableVerification,\r\n features: this._moduleBuilder.features,\r\n });\r\n if (callback) {\r\n callback(this.functionEmitter);\r\n this.functionEmitter.end();\r\n }\r\n\r\n return this.functionEmitter;\r\n }\r\n\r\n withExport(name?: string): this {\r\n this._moduleBuilder.exportFunction(this, name || null);\r\n return this;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this.functionEmitter) {\r\n throw new Error('Function body has not been defined.');\r\n }\r\n\r\n this.functionEmitter.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport InitExpressionEmitter from './InitExpressionEmitter';\r\nimport TableBuilder from './TableBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport { InitExpressionType, ValueType } from './types';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class ElementSegmentBuilder {\r\n _table: TableBuilder;\r\n _functions: (FunctionBuilder | ImportBuilder)[] = [];\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n\r\n constructor(table: TableBuilder, functions: (FunctionBuilder | ImportBuilder)[]) {\r\n this._table = table;\r\n this._functions = functions;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Element,\r\n ValueType.Int32\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n offset(value: number | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number') {\r\n this.createInitEmitter((asm) => {\r\n asm.const_i32(value);\r\n });\r\n } else {\r\n throw new Error('Unsupported offset');\r\n }\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n writer.writeVarUInt32(this._table._index);\r\n this._initExpressionEmitter.write(writer);\r\n writer.writeVarUInt32(this._functions.length);\r\n this._functions.forEach((x) => {\r\n if (x instanceof FunctionBuilder) {\r\n writer.writeVarUInt32(x._index);\r\n } else if (x instanceof ImportBuilder) {\r\n writer.writeVarUInt32(x.index);\r\n }\r\n });\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ExternalKind, ExternalKindType } from './types';\r\n\r\nexport default class ExportBuilder {\r\n name: string;\r\n externalKind: ExternalKindType;\r\n data: { _index: number };\r\n\r\n constructor(name: string, externalKind: ExternalKindType, data: { _index: number }) {\r\n this.name = name;\r\n this.externalKind = externalKind;\r\n this.data = data;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.name.length);\r\n writer.writeString(this.name);\r\n writer.writeUInt8(this.externalKind.value);\r\n switch (this.externalKind) {\r\n case ExternalKind.Function:\r\n case ExternalKind.Global:\r\n case ExternalKind.Memory:\r\n case ExternalKind.Table:\r\n writer.writeVarUInt32(this.data._index);\r\n break;\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\n\r\nexport default class ResizableLimits {\r\n initial: number;\r\n maximum: number | null;\r\n\r\n constructor(initial: number, maximum: number | null = null) {\r\n this.initial = initial;\r\n this.maximum = maximum;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt1(this.maximum !== null ? 1 : 0);\r\n writer.writeVarUInt32(this.initial);\r\n if (this.maximum !== null) {\r\n writer.writeVarUInt32(this.maximum);\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\n\r\nexport default class MemoryType {\r\n resizableLimits: ResizableLimits;\r\n\r\n constructor(resizableLimits: ResizableLimits) {\r\n Arg.instanceOf('resizableLimits', resizableLimits, ResizableLimits);\r\n this.resizableLimits = resizableLimits;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this.resizableLimits.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport MemoryType from './MemoryType';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class MemoryBuilder {\r\n _moduleBuilder: ModuleBuilder;\r\n _memoryType: MemoryType;\r\n _index: number;\r\n\r\n constructor(moduleBuilder: ModuleBuilder, resizableLimits: ResizableLimits, index: number) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._memoryType = new MemoryType(resizableLimits);\r\n this._index = index;\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportMemory(this, name);\r\n return this;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._memoryType.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport { ElementTypeDescriptor } from './types';\r\n\r\nexport default class TableType {\r\n private _elementType: ElementTypeDescriptor;\r\n private _resizableLimits: ResizableLimits;\r\n\r\n constructor(elementType: ElementTypeDescriptor, resizableLimits: ResizableLimits) {\r\n this._elementType = elementType;\r\n this._resizableLimits = resizableLimits;\r\n }\r\n\r\n get elementType(): ElementTypeDescriptor {\r\n return this._elementType;\r\n }\r\n\r\n get resizableLimits(): ResizableLimits {\r\n return this._resizableLimits;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this._elementType.value);\r\n this._resizableLimits.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport TableType from './TableType';\r\nimport { ElementTypeDescriptor } from './types';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport type ImportBuilder from './ImportBuilder';\r\n\r\nexport default class TableBuilder {\r\n _moduleBuilder: ModuleBuilder;\r\n _tableType: TableType;\r\n _index: number;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n elementType: ElementTypeDescriptor,\r\n resizableLimits: ResizableLimits,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._tableType = new TableType(elementType, resizableLimits);\r\n this._index = index;\r\n }\r\n\r\n get elementType(): ElementTypeDescriptor {\r\n return this._tableType.elementType;\r\n }\r\n\r\n get resizableLimits(): ResizableLimits {\r\n return this._tableType.resizableLimits;\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportTable(this, name);\r\n return this;\r\n }\r\n\r\n defineTableSegment(\r\n elements: (FunctionBuilder | ImportBuilder)[],\r\n offset?: number | ((asm: any) => void)\r\n ): void {\r\n this._moduleBuilder.defineTableSegment(this, elements, offset);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._tableType.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import ModuleBuilder from './ModuleBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { ExternalKind, ImmediateType, ValueTypeDescriptor } from './types';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalType from './GlobalType';\r\nimport MemoryType from './MemoryType';\r\nimport TableType from './TableType';\r\nimport Instruction from './Instruction';\r\nimport LabelBuilder from './LabelBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\n\r\nexport default class TextModuleWriter {\r\n moduleBuilder: ModuleBuilder;\r\n\r\n constructor(moduleBuilder: ModuleBuilder) {\r\n this.moduleBuilder = moduleBuilder;\r\n }\r\n\r\n toString(): string {\r\n const lines: string[] = [];\r\n const mod = this.moduleBuilder;\r\n\r\n lines.push(`(module $${mod._name}`);\r\n\r\n this.writeTypes(lines, mod);\r\n this.writeImports(lines, mod);\r\n this.writeFunctions(lines, mod);\r\n this.writeTables(lines, mod);\r\n this.writeMemories(lines, mod);\r\n this.writeGlobals(lines, mod);\r\n this.writeExports(lines, mod);\r\n this.writeStart(lines, mod);\r\n this.writeElements(lines, mod);\r\n this.writeData(lines, mod);\r\n\r\n lines.push(')');\r\n return lines.join('\\n');\r\n }\r\n\r\n private writeTypes(lines: string[], mod: ModuleBuilder): void {\r\n mod._types.forEach((type, i) => {\r\n const params = type.parameterTypes.map((p) => p.name).join(' ');\r\n const results = type.returnTypes.map((r) => r.name).join(' ');\r\n let sig = `(func`;\r\n if (params.length > 0) sig += ` (param ${params})`;\r\n if (results.length > 0) sig += ` (result ${results})`;\r\n sig += ')';\r\n lines.push(` (type (;${i};) ${sig})`);\r\n });\r\n }\r\n\r\n private writeImports(lines: string[], mod: ModuleBuilder): void {\r\n mod._imports.forEach((imp, i) => {\r\n let desc = '';\r\n switch (imp.externalKind) {\r\n case ExternalKind.Function: {\r\n const funcType = imp.data as FuncTypeBuilder;\r\n desc = `(func (;${imp.index};) (type ${funcType.index}))`;\r\n break;\r\n }\r\n case ExternalKind.Table: {\r\n const tableType = imp.data as TableType;\r\n const limits = tableType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n desc = `(table (;${imp.index};) ${limits.initial}${max} ${tableType.elementType.name})`;\r\n break;\r\n }\r\n case ExternalKind.Memory: {\r\n const memType = imp.data as MemoryType;\r\n const limits = memType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n desc = `(memory (;${imp.index};) ${limits.initial}${max})`;\r\n break;\r\n }\r\n case ExternalKind.Global: {\r\n const globalType = imp.data as GlobalType;\r\n const valType = globalType.valueType.name;\r\n desc = globalType.mutable\r\n ? `(global (;${imp.index};) (mut ${valType}))`\r\n : `(global (;${imp.index};) ${valType})`;\r\n break;\r\n }\r\n }\r\n lines.push(` (import \"${imp.moduleName}\" \"${imp.fieldName}\" ${desc})`);\r\n });\r\n }\r\n\r\n private writeFunctions(lines: string[], mod: ModuleBuilder): void {\r\n mod._functions.forEach((func) => {\r\n const typeIdx = func.funcTypeBuilder.index;\r\n let header = ` (func $${func.name} (;${func._index};) (type ${typeIdx})`;\r\n\r\n if (func.funcTypeBuilder.parameterTypes.length > 0) {\r\n const params = func.funcTypeBuilder.parameterTypes\r\n .map((p, i) => {\r\n const param = func.parameters[i];\r\n return p.name;\r\n })\r\n .join(' ');\r\n header += ` (param ${params})`;\r\n }\r\n\r\n if (func.funcTypeBuilder.returnTypes.length > 0) {\r\n const results = func.funcTypeBuilder.returnTypes.map((r) => r.name).join(' ');\r\n header += ` (result ${results})`;\r\n }\r\n\r\n if (!func.functionEmitter) {\r\n lines.push(header + ')');\r\n return;\r\n }\r\n\r\n const emitter = func.functionEmitter;\r\n\r\n // Locals\r\n if (emitter._locals.length > 0) {\r\n const locals = emitter._locals.map((l) => {\r\n if (l.count === 1) return `(local ${l.valueType.name})`;\r\n return `(local ${l.valueType.name})`.repeat(l.count);\r\n });\r\n header += ' ' + locals.join(' ');\r\n }\r\n\r\n lines.push(header);\r\n\r\n // Instructions\r\n this.writeInstructions(lines, emitter._instructions, 2);\r\n lines.push(' )');\r\n });\r\n }\r\n\r\n private writeInstructions(lines: string[], instructions: Instruction[], baseIndent: number): void {\r\n let indent = baseIndent;\r\n\r\n for (const instr of instructions) {\r\n const mnemonic = instr.opCode.mnemonic;\r\n\r\n // Decrease indent before end/else\r\n if (mnemonic === 'end' || mnemonic === 'else') {\r\n indent = Math.max(baseIndent, indent - 1);\r\n }\r\n\r\n const prefix = ' '.repeat(indent);\r\n let line = `${prefix}${mnemonic}`;\r\n\r\n // Add immediate operand text\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) {\r\n line += ` ${immText}`;\r\n }\r\n }\r\n\r\n lines.push(line);\r\n\r\n // Increase indent after block/loop/if/else\r\n if (mnemonic === 'block' || mnemonic === 'loop' || mnemonic === 'if' || mnemonic === 'else') {\r\n indent++;\r\n }\r\n }\r\n }\r\n\r\n private immediateToText(type: ImmediateType, values: any[]): string {\r\n switch (type) {\r\n case ImmediateType.BlockSignature: {\r\n const blockType = values[0];\r\n if (blockType && blockType.name !== 'void') {\r\n return `(result ${blockType.name})`;\r\n }\r\n return '';\r\n }\r\n case ImmediateType.VarInt32:\r\n case ImmediateType.VarInt64:\r\n case ImmediateType.Float32:\r\n case ImmediateType.Float64:\r\n case ImmediateType.VarUInt1:\r\n return String(values[0]);\r\n\r\n case ImmediateType.Local: {\r\n const local = values[0];\r\n return String(local.index);\r\n }\r\n case ImmediateType.Global: {\r\n const global = values[0];\r\n if (global instanceof GlobalBuilder) {\r\n return String(global._index);\r\n }\r\n if (global && typeof global.index === 'number') {\r\n return String(global.index);\r\n }\r\n return '';\r\n }\r\n case ImmediateType.Function: {\r\n const func = values[0];\r\n if (func instanceof FunctionBuilder) {\r\n return String(func._index);\r\n }\r\n if (func instanceof ImportBuilder) {\r\n return String(func.index);\r\n }\r\n return '';\r\n }\r\n case ImmediateType.IndirectFunction: {\r\n const funcType = values[0];\r\n return `(type ${funcType.index})`;\r\n }\r\n case ImmediateType.RelativeDepth: {\r\n const label = values[0];\r\n const depth = values[1];\r\n if (label instanceof LabelBuilder && label.block) {\r\n return String(depth - label.block.depth);\r\n }\r\n return String(label);\r\n }\r\n case ImmediateType.BranchTable: {\r\n const defaultDepth = values[0];\r\n const depths = values[1] as number[];\r\n return depths.join(' ') + ' ' + defaultDepth;\r\n }\r\n case ImmediateType.MemoryImmediate: {\r\n const alignment = values[0];\r\n const offset = values[1];\r\n let text = '';\r\n if (offset !== 0) text += `offset=${offset}`;\r\n if (alignment !== 0) {\r\n if (text) text += ' ';\r\n text += `align=${1 << alignment}`;\r\n }\r\n return text;\r\n }\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n private writeTables(lines: string[], mod: ModuleBuilder): void {\r\n mod._tables.forEach((table, i) => {\r\n const limits = table.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n lines.push(` (table (;${table._index};) ${limits.initial}${max} ${table.elementType.name})`);\r\n });\r\n }\r\n\r\n private writeMemories(lines: string[], mod: ModuleBuilder): void {\r\n mod._memories.forEach((mem) => {\r\n const limits = mem._memoryType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n lines.push(` (memory (;${mem._index};) ${limits.initial}${max})`);\r\n });\r\n }\r\n\r\n private writeGlobals(lines: string[], mod: ModuleBuilder): void {\r\n mod._globals.forEach((g) => {\r\n const valType = g.globalType.valueType.name;\r\n const typeStr = g.globalType.mutable ? `(mut ${valType})` : valType;\r\n\r\n let initExpr = '';\r\n if (g._initExpressionEmitter) {\r\n const instrs = g._initExpressionEmitter._instructions;\r\n // Init expression is typically one const instruction + end\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n initExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) initExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n lines.push(` (global (;${g._index};) ${typeStr} (${initExpr}))`);\r\n });\r\n }\r\n\r\n private writeExports(lines: string[], mod: ModuleBuilder): void {\r\n mod._exports.forEach((exp) => {\r\n let kindName = '';\r\n let index = exp.data._index;\r\n switch (exp.externalKind) {\r\n case ExternalKind.Function:\r\n kindName = 'func';\r\n break;\r\n case ExternalKind.Table:\r\n kindName = 'table';\r\n break;\r\n case ExternalKind.Memory:\r\n kindName = 'memory';\r\n break;\r\n case ExternalKind.Global:\r\n kindName = 'global';\r\n break;\r\n }\r\n lines.push(` (export \"${exp.name}\" (${kindName} ${index}))`);\r\n });\r\n }\r\n\r\n private writeStart(lines: string[], mod: ModuleBuilder): void {\r\n if (mod._startFunction) {\r\n lines.push(` (start ${mod._startFunction._index})`);\r\n }\r\n }\r\n\r\n private writeElements(lines: string[], mod: ModuleBuilder): void {\r\n mod._elements.forEach((elem, i) => {\r\n let offsetExpr = '';\r\n if (elem._initExpressionEmitter) {\r\n const instrs = elem._initExpressionEmitter._instructions;\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n offsetExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) offsetExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n const funcIndices = elem._functions\r\n .map((f) => {\r\n if (f instanceof FunctionBuilder) return f._index;\r\n if (f instanceof ImportBuilder) return f.index;\r\n return 0;\r\n })\r\n .join(' ');\r\n\r\n lines.push(` (elem (;${i};) (${offsetExpr}) func ${funcIndices})`);\r\n });\r\n }\r\n\r\n private writeData(lines: string[], mod: ModuleBuilder): void {\r\n mod._data.forEach((seg, i) => {\r\n let offsetExpr = '';\r\n if (seg._initExpressionEmitter) {\r\n const instrs = seg._initExpressionEmitter._instructions;\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n offsetExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) offsetExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n const dataStr = this.bytesToWatString(seg._data);\r\n lines.push(` (data (;${i};) (${offsetExpr}) \"${dataStr}\")`);\r\n });\r\n }\r\n\r\n private bytesToWatString(data: Uint8Array): string {\r\n let result = '';\r\n for (let i = 0; i < data.length; i++) {\r\n const byte = data[i];\r\n if (byte >= 0x20 && byte < 0x7f && byte !== 0x22 && byte !== 0x5c) {\r\n result += String.fromCharCode(byte);\r\n } else {\r\n result += '\\\\' + byte.toString(16).padStart(2, '0');\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryModuleWriter from './BinaryModuleWriter';\r\nimport DataSegmentBuilder from './DataSegmentBuilder';\r\nimport ElementSegmentBuilder from './ElementSegmentBuilder';\r\nimport ExportBuilder from './ExportBuilder';\r\nimport {\r\n ExternalKind,\r\n ElementTypeDescriptor,\r\n ValueTypeDescriptor,\r\n ModuleBuilderOptions,\r\n WasmFeature,\r\n WasmTarget,\r\n} from './types';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport GlobalType from './GlobalType';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport MemoryBuilder from './MemoryBuilder';\r\nimport MemoryType from './MemoryType';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport TableBuilder from './TableBuilder';\r\nimport TableType from './TableType';\r\nimport TextModuleWriter from './TextModuleWriter';\r\nimport CustomSectionBuilder from './CustomSectionBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport VerificationError from './verification/VerificationError';\r\n\r\nexport default class ModuleBuilder {\r\n static defaultOptions: ModuleBuilderOptions = {\r\n generateNameSection: true,\r\n disableVerification: false,\r\n };\r\n\r\n static readonly targetFeatures: Record = {\r\n 'mvp': [],\r\n '2.0': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'multi-value'],\r\n 'latest': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'simd', 'multi-value'],\r\n };\r\n\r\n _name: string;\r\n _types: FuncTypeBuilder[] = [];\r\n _imports: ImportBuilder[] = [];\r\n _functions: FunctionBuilder[] = [];\r\n _tables: TableBuilder[] = [];\r\n _memories: MemoryBuilder[] = [];\r\n _globals: GlobalBuilder[] = [];\r\n _exports: ExportBuilder[] = [];\r\n _elements: ElementSegmentBuilder[] = [];\r\n _data: DataSegmentBuilder[] = [];\r\n _customSections: CustomSectionBuilder[] = [];\r\n _startFunction: FunctionBuilder | null = null;\r\n _importsIndexSpace = {\r\n function: 0,\r\n table: 0,\r\n memory: 0,\r\n global: 0,\r\n };\r\n _options: ModuleBuilderOptions;\r\n _resolvedFeatures: Set;\r\n\r\n constructor(\r\n name: string,\r\n options: ModuleBuilderOptions = { generateNameSection: true, disableVerification: false }\r\n ) {\r\n Arg.notNull('name', name);\r\n this._name = name;\r\n this._options = options || ModuleBuilder.defaultOptions;\r\n this._resolvedFeatures = ModuleBuilder._resolveFeatures(this._options);\r\n }\r\n\r\n static _resolveFeatures(options: ModuleBuilderOptions): Set {\r\n const target = options.target || 'latest';\r\n const baseFeatures = ModuleBuilder.targetFeatures[target];\r\n const extra = options.features || [];\r\n return new Set([...baseFeatures, ...extra]);\r\n }\r\n\r\n get features(): Set {\r\n return this._resolvedFeatures;\r\n }\r\n\r\n hasFeature(feature: WasmFeature): boolean {\r\n return this._resolvedFeatures.has(feature);\r\n }\r\n\r\n get disableVerification(): boolean {\r\n return this._options && this._options.disableVerification === true;\r\n }\r\n\r\n defineFuncType(\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[]\r\n ): FuncTypeBuilder {\r\n let normalizedReturnTypes: ValueTypeDescriptor[];\r\n if (!returnTypes) {\r\n normalizedReturnTypes = [];\r\n } else if (!Array.isArray(returnTypes)) {\r\n normalizedReturnTypes = [returnTypes];\r\n } else {\r\n normalizedReturnTypes = returnTypes;\r\n }\r\n\r\n if (normalizedReturnTypes.length > 1) {\r\n throw new Error('A method can only return zero to one values.');\r\n }\r\n\r\n const funcTypeKey = FuncTypeBuilder.createKey(normalizedReturnTypes, parameters);\r\n let funcType = this._types.find((x) => x.key === funcTypeKey);\r\n if (!funcType) {\r\n funcType = new FuncTypeBuilder(\r\n funcTypeKey,\r\n normalizedReturnTypes,\r\n parameters,\r\n this._types.length\r\n );\r\n this._types.push(funcType);\r\n }\r\n\r\n return funcType;\r\n }\r\n\r\n importFunction(\r\n moduleName: string,\r\n name: string,\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[]\r\n ): ImportBuilder {\r\n const funcType = this.defineFuncType(returnTypes, parameters);\r\n if (\r\n this._imports.some(\r\n (x) =>\r\n x.externalKind === ExternalKind.Function &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Function,\r\n funcType,\r\n this._importsIndexSpace.function++\r\n );\r\n this._imports.push(importBuilder);\r\n this._functions.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n importTable(\r\n moduleName: string,\r\n name: string,\r\n elementType: ElementTypeDescriptor,\r\n initialSize: number,\r\n maximumSize: number | null = null\r\n ): ImportBuilder {\r\n if (\r\n this._imports.find(\r\n (x) =>\r\n x.externalKind === ExternalKind.Table &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const tableType = new TableType(\r\n elementType,\r\n new ResizableLimits(initialSize, maximumSize)\r\n );\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Table,\r\n tableType,\r\n this._importsIndexSpace.table++\r\n );\r\n this._imports.push(importBuilder);\r\n this._tables.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n importMemory(\r\n moduleName: string,\r\n name: string,\r\n initialSize: number,\r\n maximumSize: number | null = null\r\n ): ImportBuilder {\r\n Arg.string('moduleName', moduleName);\r\n Arg.string('name', name);\r\n Arg.number('initialSize', initialSize);\r\n\r\n if (\r\n this._imports.find(\r\n (x) =>\r\n x.externalKind === ExternalKind.Memory &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n if (this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) {\r\n throw new VerificationError('Only one memory is allowed per module.');\r\n }\r\n\r\n const memoryType = new MemoryType(new ResizableLimits(initialSize, maximumSize));\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Memory,\r\n memoryType,\r\n this._importsIndexSpace.memory++\r\n );\r\n this._imports.push(importBuilder);\r\n\r\n return importBuilder;\r\n }\r\n\r\n importGlobal(\r\n moduleName: string,\r\n name: string,\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean\r\n ): ImportBuilder {\r\n if (\r\n this._imports.some(\r\n (x) =>\r\n x.externalKind === ExternalKind.Global &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const globalType = new GlobalType(valueType, mutable);\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Global,\r\n globalType,\r\n this._importsIndexSpace.global++\r\n );\r\n this._imports.push(importBuilder);\r\n this._globals.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n defineFunction(\r\n name: string,\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[],\r\n createCallback?: (func: FunctionBuilder, asm: FunctionEmitter) => void\r\n ): FunctionBuilder {\r\n const existing = this._functions.find((x) => x.name === name);\r\n if (existing) {\r\n throw new Error(`Function has already been defined with the name ${name}`);\r\n }\r\n\r\n const funcType = this.defineFuncType(returnTypes, parameters);\r\n const functionBuilder = new FunctionBuilder(\r\n this,\r\n name,\r\n funcType,\r\n this._functions.length + this._importsIndexSpace.function\r\n );\r\n this._functions.push(functionBuilder);\r\n\r\n if (createCallback) {\r\n functionBuilder.createEmitter((x) => {\r\n createCallback(functionBuilder, x);\r\n });\r\n }\r\n\r\n return functionBuilder;\r\n }\r\n\r\n defineTable(\r\n elementType: ElementTypeDescriptor,\r\n initialSize: number,\r\n maximumSize: number | null = null\r\n ): TableBuilder {\r\n if (this._tables.length === 1) {\r\n throw new Error('Only one table can be created per module.');\r\n }\r\n\r\n const table = new TableBuilder(\r\n this,\r\n elementType,\r\n new ResizableLimits(initialSize, maximumSize),\r\n this._tables.length + this._importsIndexSpace.table\r\n );\r\n this._tables.push(table);\r\n return table;\r\n }\r\n\r\n defineMemory(initialSize: number, maximumSize: number | null = null): MemoryBuilder {\r\n if (this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) {\r\n throw new VerificationError('Only one memory is allowed per module.');\r\n }\r\n\r\n const memory = new MemoryBuilder(\r\n this,\r\n new ResizableLimits(initialSize, maximumSize),\r\n this._memories.length + this._importsIndexSpace.memory\r\n );\r\n this._memories.push(memory);\r\n return memory;\r\n }\r\n\r\n defineGlobal(\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean,\r\n value?: number | GlobalBuilder | ((asm: any) => void)\r\n ): GlobalBuilder {\r\n const globalBuilder = new GlobalBuilder(\r\n this,\r\n valueType,\r\n mutable,\r\n this._globals.length + this._importsIndexSpace.global\r\n );\r\n if (value !== undefined) {\r\n globalBuilder.value(value);\r\n }\r\n\r\n this._globals.push(globalBuilder);\r\n return globalBuilder;\r\n }\r\n\r\n setStartFunction(functionBuilder: FunctionBuilder): void {\r\n Arg.instanceOf('functionBuilder', functionBuilder, FunctionBuilder);\r\n this._startFunction = functionBuilder;\r\n }\r\n\r\n exportFunction(functionBuilder: FunctionBuilder, name: string | null = null): ExportBuilder {\r\n Arg.instanceOf('functionBuilder', functionBuilder, FunctionBuilder);\r\n\r\n const functionName = name || functionBuilder.name;\r\n Arg.notEmptyString('name', functionName);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Function && x.name === functionName\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a function named ${functionName}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(\r\n functionName,\r\n ExternalKind.Function,\r\n functionBuilder\r\n );\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportMemory(memoryBuilder: MemoryBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('memoryBuilder', memoryBuilder, MemoryBuilder);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Memory && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for memory named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Memory, memoryBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportTable(tableBuilder: TableBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('tableBuilder', tableBuilder, TableBuilder);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Table && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a table named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Table, tableBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportGlobal(globalBuilder: GlobalBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('globalBuilder', globalBuilder, GlobalBuilder);\r\n if (globalBuilder.globalType.mutable && !this.disableVerification) {\r\n throw new VerificationError('Cannot export a mutable global.');\r\n }\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Global && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a global named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Global, globalBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n defineTableSegment(\r\n table: TableBuilder,\r\n elements: (FunctionBuilder | ImportBuilder)[],\r\n offset?: number | GlobalBuilder | ((asm: any) => void)\r\n ): void {\r\n const segment = new ElementSegmentBuilder(table, elements);\r\n if (offset !== undefined) {\r\n segment.offset(offset as any);\r\n }\r\n\r\n this._elements.push(segment);\r\n }\r\n\r\n defineData(\r\n data: Uint8Array,\r\n offset?: number | GlobalBuilder | ((asm: any) => void)\r\n ): DataSegmentBuilder {\r\n Arg.instanceOf('data', data, Uint8Array);\r\n\r\n const dataSegmentBuilder = new DataSegmentBuilder(data);\r\n if (offset !== undefined) {\r\n dataSegmentBuilder.offset(offset as any);\r\n }\r\n\r\n this._data.push(dataSegmentBuilder);\r\n return dataSegmentBuilder;\r\n }\r\n\r\n defineCustomSection(name: string, data?: Uint8Array): CustomSectionBuilder {\r\n Arg.notEmptyString('name', name);\r\n\r\n if (this._customSections.find((x) => x.name === name)) {\r\n throw new Error(`A custom section already exists with the name ${name}.`);\r\n }\r\n\r\n if (name === 'name') {\r\n throw new Error(\"The 'name' custom section is reserved.\");\r\n }\r\n\r\n const customSectionBuilder = new CustomSectionBuilder(name, data);\r\n this._customSections.push(customSectionBuilder);\r\n return customSectionBuilder;\r\n }\r\n\r\n async instantiate(imports?: WebAssembly.Imports): Promise {\r\n const moduleBytes = this.toBytes();\r\n return WebAssembly.instantiate(moduleBytes.buffer as ArrayBuffer, imports);\r\n }\r\n\r\n async compile(): Promise {\r\n const moduleBytes = this.toBytes();\r\n return WebAssembly.compile(moduleBytes.buffer as ArrayBuffer);\r\n }\r\n\r\n toString(): string {\r\n const writer = new TextModuleWriter(this);\r\n return writer.toString();\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const writer = new BinaryModuleWriter(this);\r\n return writer.write();\r\n }\r\n}\r\n", "import ModuleBuilder from './ModuleBuilder';\r\nimport OpCodes from './OpCodes';\r\nimport {\r\n ValueType,\r\n ValueTypeDescriptor,\r\n BlockType,\r\n BlockTypeDescriptor,\r\n ElementType,\r\n ExternalKind,\r\n OpCodeDef,\r\n ModuleBuilderOptions,\r\n} from './types';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport ImportBuilder from './ImportBuilder';\r\n\r\n// --- Tokenizer ---\r\n\r\nenum TokenType {\r\n LeftParen = 'LeftParen',\r\n RightParen = 'RightParen',\r\n String = 'String',\r\n Number = 'Number',\r\n Keyword = 'Keyword',\r\n Id = 'Id',\r\n EOF = 'EOF',\r\n}\r\n\r\ninterface Token {\r\n type: TokenType;\r\n value: string;\r\n line: number;\r\n col: number;\r\n}\r\n\r\nfunction tokenize(source: string): Token[] {\r\n const tokens: Token[] = [];\r\n let pos = 0;\r\n let line = 1;\r\n let col = 1;\r\n\r\n function advance(n: number = 1): void {\r\n for (let i = 0; i < n; i++) {\r\n if (source[pos] === '\\n') {\r\n line++;\r\n col = 1;\r\n } else {\r\n col++;\r\n }\r\n pos++;\r\n }\r\n }\r\n\r\n while (pos < source.length) {\r\n const ch = source[pos];\r\n\r\n // Whitespace\r\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\r\n advance();\r\n continue;\r\n }\r\n\r\n // Line comment\r\n if (ch === ';' && source[pos + 1] === ';') {\r\n while (pos < source.length && source[pos] !== '\\n') advance();\r\n continue;\r\n }\r\n\r\n // Block comment (;...;) - skip entirely\r\n if (ch === '(' && source[pos + 1] === ';') {\r\n advance(2);\r\n let depth = 1;\r\n while (pos < source.length && depth > 0) {\r\n if (source[pos] === '(' && source[pos + 1] === ';') {\r\n depth++;\r\n advance(2);\r\n } else if (source[pos] === ';' && source[pos + 1] === ')') {\r\n depth--;\r\n advance(2);\r\n } else {\r\n advance();\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n const startLine = line;\r\n const startCol = col;\r\n\r\n if (ch === '(') {\r\n tokens.push({ type: TokenType.LeftParen, value: '(', line: startLine, col: startCol });\r\n advance();\r\n continue;\r\n }\r\n\r\n if (ch === ')') {\r\n tokens.push({ type: TokenType.RightParen, value: ')', line: startLine, col: startCol });\r\n advance();\r\n continue;\r\n }\r\n\r\n // String literal\r\n if (ch === '\"') {\r\n advance();\r\n let str = '';\r\n while (pos < source.length && source[pos] !== '\"') {\r\n if (source[pos] === '\\\\') {\r\n advance();\r\n const esc = source[pos];\r\n if (esc === 'n') str += '\\n';\r\n else if (esc === 't') str += '\\t';\r\n else if (esc === '\\\\') str += '\\\\';\r\n else if (esc === '\"') str += '\"';\r\n else if (esc === '\\'') str += '\\'';\r\n else {\r\n // Hex escape \\XX\r\n const hex = source.substring(pos, pos + 2);\r\n str += String.fromCharCode(parseInt(hex, 16));\r\n advance();\r\n }\r\n advance();\r\n } else {\r\n str += source[pos];\r\n advance();\r\n }\r\n }\r\n advance(); // closing \"\r\n tokens.push({ type: TokenType.String, value: str, line: startLine, col: startCol });\r\n continue;\r\n }\r\n\r\n // Id ($name)\r\n if (ch === '$') {\r\n let id = '';\r\n advance();\r\n while (pos < source.length && !isDelimiter(source[pos])) {\r\n id += source[pos];\r\n advance();\r\n }\r\n tokens.push({ type: TokenType.Id, value: '$' + id, line: startLine, col: startCol });\r\n continue;\r\n }\r\n\r\n // Number or keyword\r\n let word = '';\r\n while (pos < source.length && !isDelimiter(source[pos])) {\r\n word += source[pos];\r\n advance();\r\n }\r\n\r\n if (isNumericToken(word)) {\r\n tokens.push({ type: TokenType.Number, value: word, line: startLine, col: startCol });\r\n } else {\r\n tokens.push({ type: TokenType.Keyword, value: word, line: startLine, col: startCol });\r\n }\r\n }\r\n\r\n tokens.push({ type: TokenType.EOF, value: '', line, col });\r\n return tokens;\r\n}\r\n\r\nfunction isDelimiter(ch: string): boolean {\r\n return ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r' ||\r\n ch === '(' || ch === ')' || ch === ';' || ch === '\"';\r\n}\r\n\r\nfunction isNumericToken(word: string): boolean {\r\n if (/^[+-]?\\d/.test(word)) return true;\r\n if (/^[+-]?0x[0-9a-fA-F]/.test(word)) return true;\r\n if (/^[+-]?inf$/.test(word)) return true;\r\n if (/^[+-]?nan/.test(word)) return true;\r\n return false;\r\n}\r\n\r\n// --- Parser ---\r\n\r\nconst valueTypeMap: Record = {\r\n 'i32': ValueType.Int32,\r\n 'i64': ValueType.Int64,\r\n 'f32': ValueType.Float32,\r\n 'f64': ValueType.Float64,\r\n 'v128': ValueType.V128,\r\n};\r\n\r\nconst blockTypeMap: Record = {\r\n 'i32': BlockType.Int32,\r\n 'i64': BlockType.Int64,\r\n 'f32': BlockType.Float32,\r\n 'f64': BlockType.Float64,\r\n 'v128': BlockType.V128,\r\n};\r\n\r\n// Build mnemonic \u2192 opcode lookup\r\nconst mnemonicToOpCode: Map = new Map();\r\nfor (const [, opCode] of Object.entries(OpCodes)) {\r\n const op = opCode as OpCodeDef;\r\n mnemonicToOpCode.set(op.mnemonic, op);\r\n}\r\n\r\nclass WatParserImpl {\r\n tokens: Token[];\r\n pos: number;\r\n moduleBuilder!: ModuleBuilder;\r\n funcNames: Map = new Map();\r\n globalNames: Map = new Map();\r\n typeNames: Map = new Map();\r\n funcList: (FunctionBuilder | ImportBuilder)[] = [];\r\n labelStack: { name: string; label: any }[] = [];\r\n\r\n constructor(tokens: Token[]) {\r\n this.tokens = tokens;\r\n this.pos = 0;\r\n }\r\n\r\n // --- Token navigation ---\r\n\r\n peek(): Token {\r\n return this.tokens[this.pos];\r\n }\r\n\r\n advance(): Token {\r\n return this.tokens[this.pos++];\r\n }\r\n\r\n expect(type: TokenType, value?: string): Token {\r\n const tok = this.advance();\r\n if (tok.type !== type) {\r\n throw this.error(`Expected ${type}${value ? ` '${value}'` : ''} but got ${tok.type} '${tok.value}'`, tok);\r\n }\r\n if (value !== undefined && tok.value !== value) {\r\n throw this.error(`Expected '${value}' but got '${tok.value}'`, tok);\r\n }\r\n return tok;\r\n }\r\n\r\n expectKeyword(value: string): Token {\r\n return this.expect(TokenType.Keyword, value);\r\n }\r\n\r\n isKeyword(value: string): boolean {\r\n const tok = this.peek();\r\n return tok.type === TokenType.Keyword && tok.value === value;\r\n }\r\n\r\n isLeftParen(): boolean {\r\n return this.peek().type === TokenType.LeftParen;\r\n }\r\n\r\n isRightParen(): boolean {\r\n return this.peek().type === TokenType.RightParen;\r\n }\r\n\r\n // Skip optional inline comment like (;0;)\r\n skipInlineComment(): void {\r\n while (this.isLeftParen() && this.tokens[this.pos + 1]?.type === TokenType.Keyword &&\r\n this.tokens[this.pos + 1]?.value.startsWith(';')) {\r\n // This is a (;N;) comment \u2014 tokenizer should have removed it, but skip manually\r\n this.advance(); // (\r\n while (!this.isRightParen()) this.advance();\r\n this.advance(); // )\r\n }\r\n }\r\n\r\n error(message: string, tok?: Token): Error {\r\n const t = tok || this.peek();\r\n return new Error(`WAT parse error at ${t.line}:${t.col}: ${message}`);\r\n }\r\n\r\n // --- Parsing ---\r\n\r\n parse(options?: ModuleBuilderOptions): ModuleBuilder {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('module');\r\n\r\n let name = 'module';\r\n if (this.peek().type === TokenType.Id) {\r\n name = this.advance().value.substring(1); // strip $\r\n }\r\n\r\n this.moduleBuilder = new ModuleBuilder(name, options);\r\n\r\n // First pass: parse all sections\r\n while (!this.isRightParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const section = this.advance();\r\n\r\n switch (section.value) {\r\n case 'type':\r\n this.parseType();\r\n break;\r\n case 'import':\r\n this.parseImport();\r\n break;\r\n case 'func':\r\n this.parseFunc();\r\n break;\r\n case 'table':\r\n this.parseTable();\r\n break;\r\n case 'memory':\r\n this.parseMemory();\r\n break;\r\n case 'global':\r\n this.parseGlobal();\r\n break;\r\n case 'export':\r\n this.parseExport();\r\n break;\r\n case 'start':\r\n this.parseStart();\r\n break;\r\n case 'elem':\r\n this.parseElem();\r\n break;\r\n case 'data':\r\n this.parseData();\r\n break;\r\n default:\r\n // Skip unknown section\r\n this.skipSExpr();\r\n break;\r\n }\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing module paren\r\n return this.moduleBuilder;\r\n }\r\n\r\n // Skip remainder of current S-expression (we've already consumed opening keyword)\r\n skipSExpr(): void {\r\n let depth = 0;\r\n while (true) {\r\n const tok = this.peek();\r\n if (tok.type === TokenType.EOF) break;\r\n if (tok.type === TokenType.LeftParen) {\r\n depth++;\r\n this.advance();\r\n } else if (tok.type === TokenType.RightParen) {\r\n if (depth === 0) {\r\n this.advance();\r\n return;\r\n }\r\n depth--;\r\n this.advance();\r\n } else {\r\n this.advance();\r\n }\r\n }\r\n }\r\n\r\n // --- Type section ---\r\n\r\n parseType(): void {\r\n // (type $name (func (param i32 i32) (result i32)))\r\n // (type (;0;) (func (param i32 i32) (result i32)))\r\n // We already consumed: ( type\r\n let typeName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n typeName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('func');\r\n\r\n const params: ValueTypeDescriptor[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n\r\n while (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.advance().value;\r\n if (kw === 'param') {\r\n while (!this.isRightParen()) {\r\n // skip $name in param\r\n if (this.peek().type === TokenType.Id) this.advance();\r\n else params.push(this.parseValueType());\r\n }\r\n } else if (kw === 'result') {\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n this.expect(TokenType.RightParen); // closing type\r\n\r\n const funcType = this.moduleBuilder.defineFuncType(results.length > 0 ? results : null, params);\r\n if (typeName) {\r\n this.typeNames.set(typeName, funcType.index);\r\n }\r\n }\r\n\r\n // --- Import section ---\r\n\r\n parseImport(): void {\r\n // (import \"module\" \"name\" (func (;0;) (type 0)))\r\n const moduleName = this.expect(TokenType.String).value;\r\n const fieldName = this.expect(TokenType.String).value;\r\n\r\n this.expect(TokenType.LeftParen);\r\n const kind = this.advance().value;\r\n\r\n if (kind === 'func') {\r\n this.parseImportFunc(moduleName, fieldName);\r\n } else if (kind === 'table') {\r\n this.parseImportTable(moduleName, fieldName);\r\n } else if (kind === 'memory') {\r\n this.parseImportMemory(moduleName, fieldName);\r\n } else if (kind === 'global') {\r\n this.parseImportGlobal(moduleName, fieldName);\r\n } else {\r\n throw this.error(`Unknown import kind: ${kind}`);\r\n }\r\n }\r\n\r\n parseImportFunc(moduleName: string, fieldName: string): void {\r\n // (func $name (type 0))\r\n // OR: (func $name (param i32) (result i32))\r\n let importFuncName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n importFuncName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n\r\n let funcReturnTypes: ValueTypeDescriptor[] | null = null;\r\n let funcParamTypes: ValueTypeDescriptor[] = [];\r\n\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'type') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n const typeIndex = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n const funcType = this.moduleBuilder._types[typeIndex];\r\n funcReturnTypes = funcType.returnTypes.length > 0 ? funcType.returnTypes : null;\r\n funcParamTypes = funcType.parameterTypes;\r\n } else {\r\n // Parse inline (param ...) (result ...)\r\n const params: ValueTypeDescriptor[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n while (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.peek().value;\r\n if (kw === 'param') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) this.advance();\r\n else params.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'result') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n break;\r\n }\r\n }\r\n funcReturnTypes = results.length > 0 ? results : null;\r\n funcParamTypes = params;\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n const imp = this.moduleBuilder.importFunction(moduleName, fieldName,\r\n funcReturnTypes, funcParamTypes\r\n );\r\n if (importFuncName) {\r\n this.funcNames.set(importFuncName, imp.index);\r\n }\r\n this.funcList.push(imp);\r\n }\r\n\r\n parseImportTable(moduleName: string, fieldName: string): void {\r\n // (table (;0;) 1 10 anyfunc)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n let elemType = 'anyfunc';\r\n\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n if (this.peek().type === TokenType.Keyword) {\r\n elemType = this.advance().value;\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing table\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importTable(moduleName, fieldName, ElementType.AnyFunc, initial, maximum);\r\n }\r\n\r\n parseImportMemory(moduleName: string, fieldName: string): void {\r\n // (memory (;0;) 1 2)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen); // closing memory\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importMemory(moduleName, fieldName, initial, maximum);\r\n }\r\n\r\n parseImportGlobal(moduleName: string, fieldName: string): void {\r\n // (global (;0;) i32) or (global (;0;) (mut i32))\r\n let mutable = false;\r\n let valueType: ValueTypeDescriptor;\r\n\r\n if (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('mut');\r\n valueType = this.parseValueType();\r\n mutable = true;\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n valueType = this.parseValueType();\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing global\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importGlobal(moduleName, fieldName, valueType, mutable);\r\n }\r\n\r\n // --- Function section ---\r\n\r\n parseFunc(): void {\r\n // (func $name (;1;) (type 0) (param i32) (result i32) (local i32) ...)\r\n // OR: (func $name (param i32) (param i32) (result i32) ...)\r\n let name: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n name = this.advance().value.substring(1);\r\n }\r\n\r\n this.skipInlineComment();\r\n\r\n // Check if there's an explicit (type N)\r\n let hasExplicitType = false;\r\n let typeIndex = -1;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'type') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n typeIndex = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n hasExplicitType = true;\r\n }\r\n\r\n const params: ValueTypeDescriptor[] = [];\r\n const paramNames: (string | null)[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n\r\n // Parse optional (param ...) and (result ...)\r\n while (this.isLeftParen() && !this.isInstruction()) {\r\n const savedPos = this.pos;\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.peek().value;\r\n\r\n if (kw === 'param') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) {\r\n const pName = this.advance().value.substring(1); // strip $\r\n params.push(this.parseValueType());\r\n paramNames.push(pName);\r\n } else {\r\n params.push(this.parseValueType());\r\n paramNames.push(null);\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'result') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'local') {\r\n // Will be handled in instruction parsing\r\n this.pos = savedPos;\r\n break;\r\n } else {\r\n this.pos = savedPos;\r\n break;\r\n }\r\n }\r\n\r\n let funcReturnTypes: ValueTypeDescriptor[] | null;\r\n let funcParamTypes: ValueTypeDescriptor[];\r\n\r\n if (hasExplicitType) {\r\n const funcType = this.moduleBuilder._types[typeIndex];\r\n funcReturnTypes = funcType.returnTypes.length > 0 ? funcType.returnTypes : null;\r\n funcParamTypes = funcType.parameterTypes;\r\n } else {\r\n funcReturnTypes = results.length > 0 ? results : null;\r\n funcParamTypes = params;\r\n }\r\n\r\n const funcBuilder = this.moduleBuilder.defineFunction(\r\n name || `func_${this.moduleBuilder._functions.length - 1 + this.moduleBuilder._importsIndexSpace.function}`,\r\n funcReturnTypes,\r\n funcParamTypes\r\n );\r\n\r\n // Apply parameter names\r\n if (!hasExplicitType) {\r\n paramNames.forEach((pName, i) => {\r\n if (pName !== null && i < funcBuilder.parameters.length) {\r\n funcBuilder.parameters[i].withName(pName);\r\n }\r\n });\r\n }\r\n\r\n if (name) {\r\n this.funcNames.set('$' + name, funcBuilder._index);\r\n }\r\n this.funcList.push(funcBuilder);\r\n\r\n // Check if there are locals or instructions\r\n if (this.isRightParen()) {\r\n this.expect(TokenType.RightParen);\r\n return;\r\n }\r\n\r\n // Parse body\r\n this.labelStack = [];\r\n funcBuilder.createEmitter((asm) => {\r\n this.parseFuncBody(asm, funcBuilder);\r\n });\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n }\r\n\r\n parseFuncBody(asm: FunctionEmitter, func: FunctionBuilder): void {\r\n // Parse locals first\r\n while (this.isLeftParen()) {\r\n const savedPos = this.pos;\r\n this.expect(TokenType.LeftParen);\r\n if (this.isKeyword('local')) {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) {\r\n const localName = this.advance().value.substring(1); // strip $\r\n const vt = this.parseValueType();\r\n asm.declareLocal(vt, localName);\r\n } else {\r\n const vt = this.parseValueType();\r\n asm.declareLocal(vt);\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n this.pos = savedPos;\r\n break;\r\n }\r\n }\r\n\r\n // Parse instructions until closing )\r\n while (!this.isRightParen()) {\r\n this.parseInstruction(asm, func);\r\n }\r\n }\r\n\r\n parseInstruction(asm: FunctionEmitter, func: FunctionBuilder): void {\r\n const tok = this.advance();\r\n const mnemonic = tok.value;\r\n\r\n // Special handling for block/loop/if which have block signatures\r\n if (mnemonic === 'block' || mnemonic === 'loop' || mnemonic === 'if') {\r\n // Check for optional $label\r\n let labelName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n labelName = this.advance().value;\r\n }\r\n let blockType: BlockTypeDescriptor = BlockType.Void;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'result') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('result');\r\n const vt = this.parseValueType();\r\n blockType = blockTypeMap[vt.name] || BlockType.Void;\r\n this.expect(TokenType.RightParen);\r\n }\r\n const label = asm.emit(mnemonicToOpCode.get(mnemonic)!, blockType);\r\n if (labelName && label) {\r\n this.labelStack.push({ name: labelName, label });\r\n }\r\n return;\r\n }\r\n\r\n // Handle 'end' \u2014 pop label stack\r\n if (mnemonic === 'end') {\r\n asm.emit(mnemonicToOpCode.get(mnemonic)!);\r\n if (this.labelStack.length > 0) {\r\n // Check if the most recent label matches current depth\r\n const cfStack = (asm as any)._controlFlowVerifier._stack;\r\n // After 'end' pops, check if the popped label was named\r\n const top = this.labelStack[this.labelStack.length - 1];\r\n // If the label's block depth matches, pop it\r\n if (top.label.block && !cfStack.includes(top.label)) {\r\n this.labelStack.pop();\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const opCode = mnemonicToOpCode.get(mnemonic);\r\n if (!opCode) {\r\n throw this.error(`Unknown instruction: ${mnemonic}`, tok);\r\n }\r\n\r\n // Parse immediates based on opcode definition\r\n if (!opCode.immediate) {\r\n asm.emit(opCode);\r\n return;\r\n }\r\n\r\n switch (opCode.immediate) {\r\n case 'VarInt32':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'VarInt64':\r\n asm.emit(opCode, this.parseI64Value());\r\n break;\r\n case 'Float32':\r\n asm.emit(opCode, this.parseFloat());\r\n break;\r\n case 'Float64':\r\n asm.emit(opCode, this.parseFloat());\r\n break;\r\n case 'VarUInt1':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'VarUInt32':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'Local':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'Global':\r\n asm.emit(opCode, this.resolveGlobal());\r\n break;\r\n case 'Function':\r\n asm.emit(opCode, this.resolveFunction());\r\n break;\r\n case 'IndirectFunction': {\r\n // (type N) or (type $name)\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n let typeIdx: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n typeIdx = this.typeNames.get(id)!;\r\n if (typeIdx === undefined) throw this.error(`Unknown type: ${id}`);\r\n } else {\r\n typeIdx = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n asm.emit(opCode, this.moduleBuilder._types[typeIdx]);\r\n break;\r\n }\r\n case 'RelativeDepth':\r\n asm.emit(opCode, this.resolveBranchTarget(asm));\r\n break;\r\n case 'BranchTable': {\r\n // default_target target1 target2 ...\r\n // Last one is default\r\n const targets: number[] = [];\r\n while (this.peek().type === TokenType.Number) {\r\n targets.push(this.parseNumber());\r\n }\r\n if (targets.length < 1) throw this.error('br_table requires at least a default target');\r\n const defaultTarget = targets.pop()!;\r\n // This is tricky with our label system; for now use raw depth values\r\n // by looking up labels on the control flow stack\r\n const defaultLabel = this.getLabelAtDepth(asm, defaultTarget);\r\n const labels = targets.map((t) => this.getLabelAtDepth(asm, t));\r\n asm.emit(opCode, defaultLabel, labels);\r\n break;\r\n }\r\n case 'MemoryImmediate': {\r\n let alignment = 0;\r\n let offset = 0;\r\n // Parse offset=N align=N\r\n while (this.peek().type === TokenType.Keyword && (\r\n this.peek().value.startsWith('offset=') || this.peek().value.startsWith('align=')\r\n )) {\r\n const kv = this.advance().value;\r\n const [key, val] = kv.split('=');\r\n if (key === 'offset') offset = parseInt(val, 10);\r\n else if (key === 'align') {\r\n const alignVal = parseInt(val, 10);\r\n alignment = Math.log2(alignVal);\r\n }\r\n }\r\n asm.emit(opCode, alignment, offset);\r\n break;\r\n }\r\n case 'BlockSignature': {\r\n // Already handled above for block/loop/if\r\n let blockType: BlockTypeDescriptor = BlockType.Void;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'result') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('result');\r\n const vt = this.parseValueType();\r\n blockType = blockTypeMap[vt.name] || BlockType.Void;\r\n this.expect(TokenType.RightParen);\r\n }\r\n asm.emit(opCode, blockType);\r\n break;\r\n }\r\n case 'V128Const': {\r\n // v128.const i8x16 0 1 2 ... or hex format\r\n // For simplicity, parse 16 bytes\r\n const bytes = new Uint8Array(16);\r\n // Skip the lane type keyword (i8x16, i16x8, etc.)\r\n if (this.peek().type === TokenType.Keyword) this.advance();\r\n for (let i = 0; i < 16; i++) {\r\n bytes[i] = this.parseNumber() & 0xff;\r\n }\r\n asm.emit(opCode, bytes);\r\n break;\r\n }\r\n case 'LaneIndex':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'ShuffleMask': {\r\n const mask = new Uint8Array(16);\r\n for (let i = 0; i < 16; i++) {\r\n mask[i] = this.parseNumber();\r\n }\r\n asm.emit(opCode, mask);\r\n break;\r\n }\r\n default:\r\n asm.emit(opCode);\r\n break;\r\n }\r\n }\r\n\r\n getLabelAtDepth(asm: FunctionEmitter, relativeDepth: number): any {\r\n const stack = (asm as any)._controlFlowVerifier._stack;\r\n const targetIndex = stack.length - 1 - relativeDepth;\r\n if (targetIndex < 0 || targetIndex >= stack.length) {\r\n throw this.error(`Invalid branch depth: ${relativeDepth}`);\r\n }\r\n return stack[targetIndex];\r\n }\r\n\r\n resolveBranchTarget(asm: FunctionEmitter): any {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n // Search label stack for matching name (search from top = most recent)\r\n for (let i = this.labelStack.length - 1; i >= 0; i--) {\r\n if (this.labelStack[i].name === id) {\r\n return this.labelStack[i].label;\r\n }\r\n }\r\n throw this.error(`Unknown label: ${id}`);\r\n }\r\n const depth = this.parseNumber();\r\n return this.getLabelAtDepth(asm, depth);\r\n }\r\n\r\n resolveFunction(): FunctionBuilder | ImportBuilder {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const index = this.funcNames.get(id);\r\n if (index === undefined) throw this.error(`Unknown function: ${id}`);\r\n return this.funcList[index];\r\n }\r\n const index = this.parseNumber();\r\n return this.funcList[index];\r\n }\r\n\r\n resolveGlobal(): any {\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const resolved = this.globalNames.get(id);\r\n if (resolved === undefined) throw this.error(`Unknown global: ${id}`);\r\n index = resolved;\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n const importedGlobals = this.moduleBuilder._imports.filter(\r\n (x) => x.externalKind === ExternalKind.Global\r\n );\r\n if (index < importedGlobals.length) {\r\n return importedGlobals[index];\r\n }\r\n return this.moduleBuilder._globals[index - importedGlobals.length];\r\n }\r\n\r\n // --- Table section ---\r\n\r\n parseTable(): void {\r\n // (table (;0;) 1 10 anyfunc)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n\r\n // element type\r\n if (this.peek().type === TokenType.Keyword) {\r\n this.advance(); // anyfunc or funcref\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.defineTable(ElementType.AnyFunc, initial, maximum);\r\n }\r\n\r\n // --- Memory section ---\r\n\r\n parseMemory(): void {\r\n // (memory (;0;) 1 2)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.defineMemory(initial, maximum);\r\n }\r\n\r\n // --- Global section ---\r\n\r\n parseGlobal(): void {\r\n // (global $name i32 (i32.const 0))\r\n // (global $name (mut i32) (i32.const 0))\r\n // (global (;0;) i32 (i32.const 0))\r\n let globalName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n globalName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n\r\n let mutable = false;\r\n let valueType: ValueTypeDescriptor;\r\n\r\n if (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('mut');\r\n valueType = this.parseValueType();\r\n mutable = true;\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n valueType = this.parseValueType();\r\n }\r\n\r\n // Parse init expression (instr)\r\n this.expect(TokenType.LeftParen);\r\n const initInstr = this.advance().value;\r\n let initValue: number | bigint = 0;\r\n\r\n if (initInstr === 'i32.const') {\r\n initValue = this.parseNumber();\r\n } else if (initInstr === 'i64.const') {\r\n initValue = this.parseI64Value();\r\n } else if (initInstr === 'f32.const') {\r\n initValue = this.parseFloat();\r\n } else if (initInstr === 'f64.const') {\r\n initValue = this.parseFloat();\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing init expr\r\n this.expect(TokenType.RightParen); // closing global\r\n\r\n const globalBuilder = this.moduleBuilder.defineGlobal(valueType, mutable, initValue as number);\r\n if (globalName) {\r\n globalBuilder.withName(globalName.substring(1)); // strip $\r\n this.globalNames.set(globalName, globalBuilder._index);\r\n }\r\n }\r\n\r\n // --- Export section ---\r\n\r\n parseExportIndex(): number {\r\n if (this.peek().type === TokenType.Id) {\r\n return -1; // handled by caller\r\n }\r\n return this.parseNumber();\r\n }\r\n\r\n parseExport(): void {\r\n // (export \"name\" (func 0))\r\n // (export \"name\" (func $name))\r\n const name = this.expect(TokenType.String).value;\r\n this.expect(TokenType.LeftParen);\r\n const kind = this.advance().value;\r\n\r\n switch (kind) {\r\n case 'func': {\r\n let funcIndex: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n funcIndex = this.funcNames.get(id)!;\r\n if (funcIndex === undefined) throw this.error(`Unknown function: ${id}`);\r\n } else {\r\n funcIndex = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen); // closing kind\r\n this.expect(TokenType.RightParen); // closing export\r\n const func = this.funcList[funcIndex];\r\n if (func instanceof ImportBuilder) {\r\n throw this.error('Cannot export an imported function directly');\r\n }\r\n this.moduleBuilder.exportFunction(func as FunctionBuilder, name);\r\n break;\r\n }\r\n case 'table': {\r\n const index = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.exportTable(this.moduleBuilder._tables[index], name);\r\n break;\r\n }\r\n case 'memory': {\r\n const index = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.exportMemory(this.moduleBuilder._memories[index], name);\r\n break;\r\n }\r\n case 'global': {\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n index = this.globalNames.get(id)!;\r\n if (index === undefined) throw this.error(`Unknown global: ${id}`);\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n const importedGlobals = this.moduleBuilder._imports.filter(\r\n (x) => x.externalKind === ExternalKind.Global\r\n );\r\n if (index < importedGlobals.length) {\r\n throw this.error('Cannot export an imported global directly');\r\n }\r\n this.moduleBuilder.exportGlobal(\r\n this.moduleBuilder._globals[index - importedGlobals.length], name\r\n );\r\n break;\r\n }\r\n default: {\r\n this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n }\r\n }\r\n }\r\n\r\n // --- Start section ---\r\n\r\n parseStart(): void {\r\n // (start 0) or (start $name)\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n index = this.funcNames.get(id)!;\r\n if (index === undefined) throw this.error(`Unknown function: ${id}`);\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n const func = this.funcList[index];\r\n if (func instanceof FunctionBuilder) {\r\n this.moduleBuilder.setStartFunction(func);\r\n }\r\n }\r\n\r\n // --- Element section ---\r\n\r\n parseElem(): void {\r\n // (elem (;0;) (i32.const 0) func 0 1 2)\r\n // Parse offset expression\r\n this.expect(TokenType.LeftParen);\r\n const offsetInstr = this.advance().value;\r\n let offset = 0;\r\n if (offsetInstr === 'i32.const') {\r\n offset = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n\r\n // \"func\" keyword\r\n if (this.isKeyword('func')) {\r\n this.advance();\r\n }\r\n\r\n // Parse function indices or $name references\r\n const elements: (FunctionBuilder | ImportBuilder)[] = [];\r\n while (this.peek().type === TokenType.Number || this.peek().type === TokenType.Id) {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const idx = this.funcNames.get(id);\r\n if (idx === undefined) throw this.error(`Unknown function: ${id}`);\r\n elements.push(this.funcList[idx]);\r\n } else {\r\n const idx = this.parseNumber();\r\n elements.push(this.funcList[idx]);\r\n }\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n\r\n const table = this.moduleBuilder._tables[0];\r\n this.moduleBuilder.defineTableSegment(table, elements, offset);\r\n }\r\n\r\n // --- Data section ---\r\n\r\n parseData(): void {\r\n // (data (;0;) (i32.const 0) \"hello\\00world\")\r\n this.expect(TokenType.LeftParen);\r\n const offsetInstr = this.advance().value;\r\n let offset = 0;\r\n if (offsetInstr === 'i32.const') {\r\n offset = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n\r\n const dataStr = this.expect(TokenType.String).value;\r\n const bytes = new Uint8Array(dataStr.length);\r\n for (let i = 0; i < dataStr.length; i++) {\r\n bytes[i] = dataStr.charCodeAt(i);\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n\r\n this.moduleBuilder.defineData(bytes, offset);\r\n }\r\n\r\n // --- Helpers ---\r\n\r\n parseValueType(): ValueTypeDescriptor {\r\n const tok = this.advance();\r\n const vt = valueTypeMap[tok.value];\r\n if (!vt) throw this.error(`Unknown value type: ${tok.value}`, tok);\r\n return vt;\r\n }\r\n\r\n parseNumber(): number {\r\n const tok = this.advance();\r\n if (tok.value.startsWith('0x') || tok.value.startsWith('-0x') || tok.value.startsWith('+0x')) {\r\n return parseInt(tok.value.replace(/_/g, ''), 16);\r\n }\r\n return parseInt(tok.value.replace(/_/g, ''), 10);\r\n }\r\n\r\n parseFloat(): number {\r\n const tok = this.advance();\r\n const val = tok.value.replace(/_/g, '');\r\n if (val === 'inf' || val === '+inf') return Infinity;\r\n if (val === '-inf') return -Infinity;\r\n if (val.includes('nan')) return NaN;\r\n if (val.startsWith('0x') || val.startsWith('-0x') || val.startsWith('+0x')) {\r\n return this.parseHexFloat(val);\r\n }\r\n return parseFloat(val);\r\n }\r\n\r\n parseHexFloat(val: string): number {\r\n // Hex float format: 0xHH.HHpEE\r\n const negative = val.startsWith('-');\r\n const clean = val.replace(/^[+-]?0x/, '');\r\n const parts = clean.split('p');\r\n const mantissa = parts[0];\r\n const exponent = parts.length > 1 ? parseInt(parts[1], 10) : 0;\r\n\r\n let result: number;\r\n if (mantissa.includes('.')) {\r\n const [intPart, fracPart] = mantissa.split('.');\r\n result = parseInt(intPart || '0', 16) +\r\n parseInt(fracPart || '0', 16) / Math.pow(16, (fracPart || '').length);\r\n } else {\r\n result = parseInt(mantissa, 16);\r\n }\r\n\r\n result *= Math.pow(2, exponent);\r\n return negative ? -result : result;\r\n }\r\n\r\n parseI64Value(): number | bigint {\r\n const tok = this.advance();\r\n const val = tok.value.replace(/_/g, '');\r\n try {\r\n return BigInt(val);\r\n } catch {\r\n return parseInt(val, 10);\r\n }\r\n }\r\n\r\n isInstruction(): boolean {\r\n // Check if the next s-expr is an instruction (local or something else)\r\n if (!this.isLeftParen()) return false;\r\n const nextTok = this.tokens[this.pos + 1];\r\n if (!nextTok) return false;\r\n return nextTok.value !== 'param' && nextTok.value !== 'result' && nextTok.value !== 'type';\r\n }\r\n}\r\n\r\n/**\r\n * Parse a WAT (WebAssembly Text Format) string into a ModuleBuilder.\r\n */\r\nexport function parseWat(source: string, options?: ModuleBuilderOptions): ModuleBuilder {\r\n const tokens = tokenize(source);\r\n const parser = new WatParserImpl(tokens);\r\n return parser.parse(options);\r\n}\r\n", "import {\r\n ModuleBuilder,\r\n ValueType,\r\n BlockType,\r\n ElementType,\r\n TextModuleWriter,\r\n BinaryReader,\r\n parseWat,\r\n} from '../src/index';\r\n\r\nconst EXAMPLES: Record = {\r\n // \u2500\u2500\u2500 Basics \u2500\u2500\u2500\r\n 'hello-wasm': {\r\n label: 'Hello WASM',\r\n group: 'Basics',\r\n code: `// Hello WASM \u2014 the simplest possible module\r\nconst mod = new webasmjs.ModuleBuilder('hello');\r\n\r\nmod.defineFunction('answer', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.const_i32(42);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst answer = instance.instance.exports.answer;\r\nlog('The answer to everything: ' + answer());`,\r\n },\r\n\r\n factorial: {\r\n label: 'Factorial',\r\n group: 'Basics',\r\n code: `// Factorial \u2014 iterative with loop and block\r\nconst mod = new webasmjs.ModuleBuilder('factorial');\r\n\r\nmod.defineFunction('factorial', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const result = a.declareLocal(webasmjs.ValueType.Int32, 'result');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.const_i32(1);\r\n a.set_local(result);\r\n a.const_i32(1);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(result);\r\n a.get_local(i);\r\n a.mul_i32();\r\n a.set_local(result);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(result);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst factorial = instance.instance.exports.factorial;\r\nfor (let n = 0; n <= 10; n++) {\r\n log(n + '! = ' + factorial(n));\r\n}`,\r\n },\r\n\r\n fibonacci: {\r\n label: 'Fibonacci',\r\n group: 'Basics',\r\n code: `// Fibonacci sequence \u2014 iterative\r\nconst mod = new webasmjs.ModuleBuilder('fibonacci');\r\n\r\nmod.defineFunction('fib', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const prev = a.declareLocal(webasmjs.ValueType.Int32, 'prev');\r\n const curr = a.declareLocal(webasmjs.ValueType.Int32, 'curr');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.get_local(n);\r\n a.return();\r\n });\r\n\r\n a.const_i32(0);\r\n a.set_local(prev);\r\n a.const_i32(1);\r\n a.set_local(curr);\r\n a.const_i32(2);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(curr);\r\n a.set_local(temp);\r\n a.get_local(curr);\r\n a.get_local(prev);\r\n a.add_i32();\r\n a.set_local(curr);\r\n a.get_local(temp);\r\n a.set_local(prev);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(curr);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst fib = instance.instance.exports.fib;\r\nfor (let n = 0; n <= 15; n++) {\r\n log('fib(' + n + ') = ' + fib(n));\r\n}`,\r\n },\r\n\r\n 'if-else': {\r\n label: 'If/Else',\r\n group: 'Basics',\r\n code: `// If/Else \u2014 absolute value and sign function\r\nconst mod = new webasmjs.ModuleBuilder('ifElse');\r\n\r\n// Absolute value using if/else with typed block\r\nmod.defineFunction('abs', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.lt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(0);\r\n a.get_local(f.getParameter(0));\r\n a.sub_i32();\r\n a.else();\r\n a.get_local(f.getParameter(0));\r\n a.end();\r\n}).withExport();\r\n\r\n// Sign function: returns -1, 0, or 1\r\nmod.defineFunction('sign', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.lt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(-1);\r\n a.else();\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.gt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(1);\r\n a.else();\r\n a.const_i32(0);\r\n a.end();\r\n a.end();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { abs, sign } = instance.instance.exports;\r\n\r\nlog('abs(5) = ' + abs(5));\r\nlog('abs(-5) = ' + abs(-5));\r\nlog('abs(0) = ' + abs(0));\r\nlog('');\r\nlog('sign(42) = ' + sign(42));\r\nlog('sign(-7) = ' + sign(-7));\r\nlog('sign(0) = ' + sign(0));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Memory \u2500\u2500\u2500\r\n memory: {\r\n label: 'Memory Basics',\r\n group: 'Memory',\r\n code: `// Memory: store and load values\r\nconst mod = new webasmjs.ModuleBuilder('memoryExample');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\nmod.defineFunction('store', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('load', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { store, load } = instance.instance.exports;\r\n\r\nstore(0, 42);\r\nstore(4, 100);\r\nlog('Value at address 0: ' + load(0));\r\nlog('Value at address 4: ' + load(4));\r\nstore(0, load(0) + load(4));\r\nlog('Sum stored at 0: ' + load(0));`,\r\n },\r\n\r\n 'byte-array': {\r\n label: 'Byte Array',\r\n group: 'Memory',\r\n code: `// Byte array \u2014 store and sum individual bytes\r\nconst mod = new webasmjs.ModuleBuilder('byteArray');\r\nmod.defineMemory(1);\r\n\r\n// Store a byte at offset\r\nmod.defineFunction('setByte', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store8_i32(0, 0);\r\n}).withExport();\r\n\r\n// Load a byte from offset\r\nmod.defineFunction('getByte', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load8_i32_u(0, 0);\r\n}).withExport();\r\n\r\n// Sum bytes from offset 0 to length-1\r\nmod.defineFunction('sumBytes', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const len = f.getParameter(0);\r\n const sum = a.declareLocal(webasmjs.ValueType.Int32, 'sum');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.const_i32(0);\r\n a.set_local(sum);\r\n a.const_i32(0);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(len);\r\n a.ge_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(sum);\r\n a.get_local(i);\r\n a.load8_i32_u(0, 0);\r\n a.add_i32();\r\n a.set_local(sum);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(sum);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { setByte, getByte, sumBytes } = instance.instance.exports;\r\n\r\n// Fill bytes 0..9 with values 10, 20, 30, ...\r\nfor (let i = 0; i < 10; i++) {\r\n setByte(i, (i + 1) * 10);\r\n}\r\n\r\nlog('Stored bytes:');\r\nfor (let i = 0; i < 10; i++) {\r\n log(' [' + i + '] = ' + getByte(i));\r\n}\r\nlog('Sum of 10 bytes: ' + sumBytes(10));`,\r\n },\r\n\r\n 'string-memory': {\r\n label: 'Strings in Memory',\r\n group: 'Memory',\r\n code: `// Strings in memory \u2014 store a string, compute its length\r\nconst mod = new webasmjs.ModuleBuilder('stringMem');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// Store a data segment with a string at offset 0\r\nconst greeting = new TextEncoder().encode('Hello, WebAssembly!');\r\nmod.defineData(new Uint8Array([...greeting, 0]), 0); // null-terminated\r\n\r\n// strlen: count bytes until null\r\nmod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const ptr = f.getParameter(0);\r\n const len = a.declareLocal(webasmjs.ValueType.Int32, 'len');\r\n\r\n a.const_i32(0);\r\n a.set_local(len);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n // Load byte at ptr + len\r\n a.get_local(ptr);\r\n a.get_local(len);\r\n a.add_i32();\r\n a.load8_i32_u(0, 0);\r\n a.eqz_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(len);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(len);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { strlen, memory } = instance.instance.exports;\r\n\r\n// Read the string from memory\r\nconst memView = new Uint8Array(memory.buffer);\r\nconst strLen = strlen(0);\r\nconst str = new TextDecoder().decode(memView.slice(0, strLen));\r\n\r\nlog('String in memory: \"' + str + '\"');\r\nlog('Length: ' + strLen);`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Globals & State \u2500\u2500\u2500\r\n globals: {\r\n label: 'Global Counter',\r\n group: 'Globals',\r\n code: `// Globals: mutable counter\r\nconst mod = new webasmjs.ModuleBuilder('globals');\r\n\r\nconst counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\nmod.defineFunction('increment', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(counter);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_global(counter);\r\n a.get_global(counter);\r\n}).withExport();\r\n\r\nmod.defineFunction('getCount', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(counter);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { increment, getCount } = instance.instance.exports;\r\n\r\nlog('Initial: ' + getCount());\r\nincrement();\r\nincrement();\r\nincrement();\r\nlog('After 3 increments: ' + getCount());\r\nfor (let i = 0; i < 7; i++) increment();\r\nlog('After 7 more: ' + getCount());`,\r\n },\r\n\r\n 'start-function': {\r\n label: 'Start Function',\r\n group: 'Globals',\r\n code: `// Start function \u2014 runs automatically on instantiation\r\nconst mod = new webasmjs.ModuleBuilder('startExample');\r\n\r\nconst initialized = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\n// This function runs automatically at instantiation\r\nconst initFn = mod.defineFunction('init', null, [], (f, a) => {\r\n a.const_i32(1);\r\n a.set_global(initialized);\r\n});\r\nmod.setStartFunction(initFn);\r\n\r\n// Exported getter\r\nmod.defineFunction('isInitialized', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(initialized);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isInitialized } = instance.instance.exports;\r\nlog('isInitialized (should be 1): ' + isInitialized());\r\nlog('The start function ran automatically!');`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Functions & Calls \u2500\u2500\u2500\r\n 'multi-func': {\r\n label: 'Function Calls',\r\n group: 'Functions',\r\n code: `// Multiple functions calling each other\r\nconst mod = new webasmjs.ModuleBuilder('multiFn');\r\n\r\n// Helper: square\r\nmod.defineFunction('square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(0));\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Helper: double\r\nmod.defineFunction('double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(2);\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Composed: 2 * x^2\r\nconst squareFn = mod._functions[0];\r\nconst doubleFn = mod._functions[1];\r\n\r\nmod.defineFunction('doubleSquare', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.call(squareFn);\r\n a.call(doubleFn);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { square, double: dbl, doubleSquare } = instance.instance.exports;\r\n\r\nfor (let x = 1; x <= 5; x++) {\r\n log('x=' + x + ': square=' + square(x) + ', double=' + dbl(x) + ', 2x\u00B2=' + doubleSquare(x));\r\n}`,\r\n },\r\n\r\n 'imports': {\r\n label: 'Import Functions',\r\n group: 'Functions',\r\n code: `// Importing host functions \u2014 WASM calling JavaScript\r\nconst mod = new webasmjs.ModuleBuilder('imports');\r\n\r\n// Declare an import: env.print takes an i32\r\nconst printImport = mod.importFunction('env', 'print', null, [webasmjs.ValueType.Int32]);\r\n\r\n// Declare another import: env.getTime returns an i32\r\nconst getTimeImport = mod.importFunction('env', 'getTime', [webasmjs.ValueType.Int32], []);\r\n\r\nmod.defineFunction('run', null, [], (f, a) => {\r\n // Call getTime, then print it\r\n a.call(getTimeImport);\r\n a.call(printImport);\r\n\r\n // Print some constants\r\n a.const_i32(100);\r\n a.call(printImport);\r\n a.const_i32(200);\r\n a.call(printImport);\r\n a.const_i32(300);\r\n a.call(printImport);\r\n}).withExport();\r\n\r\nconst logged = [];\r\nconst instance = await mod.instantiate({\r\n env: {\r\n print: (v) => { logged.push(v); },\r\n getTime: () => Date.now() & 0x7FFFFFFF,\r\n },\r\n});\r\n\r\ninstance.instance.exports.run();\r\n\r\nlog('Values printed by WASM:');\r\nlogged.forEach((v, i) => log(' [' + i + '] ' + v));`,\r\n },\r\n\r\n 'indirect-call': {\r\n label: 'Indirect Calls (Table)',\r\n group: 'Functions',\r\n code: `// Indirect calls via function table\r\nconst mod = new webasmjs.ModuleBuilder('indirectCall');\r\n\r\nconst add = mod.defineFunction('add', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n});\r\n\r\nconst sub = mod.defineFunction('sub', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.sub_i32();\r\n});\r\n\r\nconst mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i32();\r\n});\r\n\r\n// Create a table with 3 entries\r\nconst table = mod.defineTable(webasmjs.ElementType.AnyFunc, 3);\r\nmod.defineTableSegment(table, [add, sub, mul], 0);\r\n\r\n// Dispatcher: call function at table[opIndex](a, b)\r\nmod.defineFunction('dispatch', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(1)); // a\r\n a.get_local(f.getParameter(2)); // b\r\n a.get_local(f.getParameter(0)); // table index\r\n a.call_indirect(add.funcTypeBuilder);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { dispatch } = instance.instance.exports;\r\n\r\nconst ops = ['add', 'sub', 'mul'];\r\nfor (let op = 0; op < 3; op++) {\r\n log(ops[op] + '(10, 3) = ' + dispatch(op, 10, 3));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Numeric Types \u2500\u2500\u2500\r\n 'float-math': {\r\n label: 'Float Math',\r\n group: 'Numeric',\r\n code: `// Floating-point operations \u2014 f64 math functions\r\nconst mod = new webasmjs.ModuleBuilder('floatMath');\r\n\r\n// Distance: sqrt(dx*dx + dy*dy)\r\nmod.defineFunction('distance', [webasmjs.ValueType.Float64],\r\n [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64,\r\n webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => {\r\n const x1 = f.getParameter(0);\r\n const y1 = f.getParameter(1);\r\n const x2 = f.getParameter(2);\r\n const y2 = f.getParameter(3);\r\n const dx = a.declareLocal(webasmjs.ValueType.Float64, 'dx');\r\n const dy = a.declareLocal(webasmjs.ValueType.Float64, 'dy');\r\n\r\n // dx = x2 - x1\r\n a.get_local(x2);\r\n a.get_local(x1);\r\n a.sub_f64();\r\n a.set_local(dx);\r\n\r\n // dy = y2 - y1\r\n a.get_local(y2);\r\n a.get_local(y1);\r\n a.sub_f64();\r\n a.set_local(dy);\r\n\r\n // sqrt(dx*dx + dy*dy)\r\n a.get_local(dx);\r\n a.get_local(dx);\r\n a.mul_f64();\r\n a.get_local(dy);\r\n a.get_local(dy);\r\n a.mul_f64();\r\n a.add_f64();\r\n a.sqrt_f64();\r\n}).withExport();\r\n\r\n// Rounding functions\r\nmod.defineFunction('roundUp', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.ceil_f64();\r\n}).withExport();\r\n\r\nmod.defineFunction('roundDown', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.floor_f64();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { distance, roundUp, roundDown } = instance.instance.exports;\r\n\r\nlog('distance((0,0), (3,4)) = ' + distance(0, 0, 3, 4));\r\nlog('distance((1,1), (4,5)) = ' + distance(1, 1, 4, 5));\r\nlog('');\r\nlog('roundUp(2.3) = ' + roundUp(2.3));\r\nlog('roundUp(2.7) = ' + roundUp(2.7));\r\nlog('roundDown(2.3) = ' + roundDown(2.3));\r\nlog('roundDown(2.7) = ' + roundDown(2.7));`,\r\n },\r\n\r\n 'i64-bigint': {\r\n label: 'i64 / BigInt',\r\n group: 'Numeric',\r\n code: `// 64-bit integers \u2014 BigInt interop\r\nconst mod = new webasmjs.ModuleBuilder('i64ops');\r\n\r\nmod.defineFunction('add64', [webasmjs.ValueType.Int64],\r\n [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i64();\r\n}).withExport();\r\n\r\nmod.defineFunction('mul64', [webasmjs.ValueType.Int64],\r\n [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i64();\r\n}).withExport();\r\n\r\n// Factorial with i64 \u2014 can handle larger numbers\r\nmod.defineFunction('factorial64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int64], (f, a) => {\r\n const n = f.getParameter(0);\r\n const result = a.declareLocal(webasmjs.ValueType.Int64, 'result');\r\n const i = a.declareLocal(webasmjs.ValueType.Int64, 'i');\r\n\r\n a.const_i64(1n);\r\n a.set_local(result);\r\n a.const_i64(1n);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i64();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(result);\r\n a.get_local(i);\r\n a.mul_i64();\r\n a.set_local(result);\r\n\r\n a.get_local(i);\r\n a.const_i64(1n);\r\n a.add_i64();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(result);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { add64, mul64, factorial64 } = instance.instance.exports;\r\n\r\nlog('add64(1000000000000n, 2000000000000n) = ' + add64(1000000000000n, 2000000000000n));\r\nlog('mul64(123456789n, 987654321n) = ' + mul64(123456789n, 987654321n));\r\nlog('');\r\nlog('Factorial with i64 (no overflow up to 20!):');\r\nfor (let n = 0n; n <= 20n; n++) {\r\n log(' ' + n + '! = ' + factorial64(n));\r\n}`,\r\n },\r\n\r\n 'type-conversions': {\r\n label: 'Type Conversions',\r\n group: 'Numeric',\r\n code: `// Type conversions between numeric types\r\nconst mod = new webasmjs.ModuleBuilder('conversions');\r\n\r\n// i32 to f64\r\nmod.defineFunction('i32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.convert_i32_s_f64();\r\n}).withExport();\r\n\r\n// f64 to i32 (truncate)\r\nmod.defineFunction('f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_f64_s_i32();\r\n}).withExport();\r\n\r\n// i32 to i64 (sign extend)\r\nmod.defineFunction('i32_to_i64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend_i32_s_i64();\r\n}).withExport();\r\n\r\n// i64 to i32 (wrap)\r\nmod.defineFunction('i64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.wrap_i64_i32();\r\n}).withExport();\r\n\r\n// f32 to f64 (promote)\r\nmod.defineFunction('f32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.promote_f32_f64();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { i32_to_f64, f64_to_i32, i32_to_i64, i64_to_i32, f32_to_f64 } = instance.instance.exports;\r\n\r\nlog('i32(42) \u2192 f64: ' + i32_to_f64(42));\r\nlog('f64(3.14) \u2192 i32: ' + f64_to_i32(3.14));\r\nlog('f64(99.9) \u2192 i32: ' + f64_to_i32(99.9));\r\nlog('i32(42) \u2192 i64: ' + i32_to_i64(42));\r\nlog('i32(-1) \u2192 i64: ' + i32_to_i64(-1));\r\nlog('i64(0x1FFFFFFFFn) \u2192 i32: ' + i64_to_i32(0x1FFFFFFFFn));\r\nlog('f32(3.14) \u2192 f64: ' + f32_to_f64(3.140000104904175));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Algorithms \u2500\u2500\u2500\r\n 'bubble-sort': {\r\n label: 'Bubble Sort',\r\n group: 'Algorithms',\r\n code: `// Bubble sort in WASM memory\r\nconst mod = new webasmjs.ModuleBuilder('bubbleSort');\r\nmod.defineMemory(1);\r\n\r\n// Store i32 at index (index * 4)\r\nmod.defineFunction('set', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(4);\r\n a.mul_i32();\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0);\r\n}).withExport();\r\n\r\n// Load i32 at index\r\nmod.defineFunction('get', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(4);\r\n a.mul_i32();\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\nconst setFn = mod._functions[0];\r\nconst getFn = mod._functions[1];\r\n\r\n// Bubble sort(length)\r\nmod.defineFunction('sort', null, [webasmjs.ValueType.Int32], (f, a) => {\r\n const len = f.getParameter(0);\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n const j = a.declareLocal(webasmjs.ValueType.Int32, 'j');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n const swapped = a.declareLocal(webasmjs.ValueType.Int32, 'swapped');\r\n\r\n a.const_i32(0);\r\n a.set_local(i);\r\n\r\n // Outer loop\r\n a.loop(webasmjs.BlockType.Void, (outerLoop) => {\r\n a.block(webasmjs.BlockType.Void, (outerBreak) => {\r\n a.get_local(i);\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.sub_i32();\r\n a.ge_i32();\r\n a.br_if(outerBreak);\r\n\r\n a.const_i32(0);\r\n a.set_local(swapped);\r\n a.const_i32(0);\r\n a.set_local(j);\r\n\r\n // Inner loop\r\n a.loop(webasmjs.BlockType.Void, (innerLoop) => {\r\n a.block(webasmjs.BlockType.Void, (innerBreak) => {\r\n a.get_local(j);\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.sub_i32();\r\n a.get_local(i);\r\n a.sub_i32();\r\n a.ge_i32();\r\n a.br_if(innerBreak);\r\n\r\n // if arr[j] > arr[j+1], swap\r\n a.get_local(j);\r\n a.call(getFn);\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.call(getFn);\r\n a.gt_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n // temp = arr[j]\r\n a.get_local(j);\r\n a.call(getFn);\r\n a.set_local(temp);\r\n // arr[j] = arr[j+1]\r\n a.get_local(j);\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.call(getFn);\r\n a.call(setFn);\r\n // arr[j+1] = temp\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.get_local(temp);\r\n a.call(setFn);\r\n a.const_i32(1);\r\n a.set_local(swapped);\r\n });\r\n\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(j);\r\n a.br(innerLoop);\r\n });\r\n });\r\n\r\n // Early exit if no swaps\r\n a.get_local(swapped);\r\n a.eqz_i32();\r\n a.br_if(outerBreak);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(outerLoop);\r\n });\r\n });\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { set, get, sort } = instance.instance.exports;\r\n\r\nconst data = [64, 34, 25, 12, 22, 11, 90, 1, 55, 42];\r\nlog('Before: ' + data.join(', '));\r\n\r\ndata.forEach((v, i) => set(i, v));\r\nsort(data.length);\r\n\r\nconst sorted = [];\r\nfor (let i = 0; i < data.length; i++) sorted.push(get(i));\r\nlog('After: ' + sorted.join(', '));`,\r\n },\r\n\r\n 'gcd': {\r\n label: 'GCD (Euclidean)',\r\n group: 'Algorithms',\r\n code: `// Greatest common divisor \u2014 Euclidean algorithm\r\nconst mod = new webasmjs.ModuleBuilder('gcd');\r\n\r\nmod.defineFunction('gcd', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const x = f.getParameter(0);\r\n const y = f.getParameter(1);\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(y);\r\n a.eqz_i32();\r\n a.br_if(breakLabel);\r\n\r\n // temp = y\r\n a.get_local(y);\r\n a.set_local(temp);\r\n // y = x % y\r\n a.get_local(x);\r\n a.get_local(y);\r\n a.rem_i32_u();\r\n a.set_local(y);\r\n // x = temp\r\n a.get_local(temp);\r\n a.set_local(x);\r\n\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(x);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { gcd } = instance.instance.exports;\r\n\r\nconst pairs = [[12, 8], [100, 75], [17, 13], [48, 18], [0, 5], [7, 0], [1071, 462]];\r\nfor (const [a, b] of pairs) {\r\n log('gcd(' + a + ', ' + b + ') = ' + gcd(a, b));\r\n}`,\r\n },\r\n\r\n 'collatz': {\r\n label: 'Collatz Conjecture',\r\n group: 'Algorithms',\r\n code: `// Collatz conjecture \u2014 count steps to reach 1\r\nconst mod = new webasmjs.ModuleBuilder('collatz');\r\n\r\nmod.defineFunction('collatz', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const steps = a.declareLocal(webasmjs.ValueType.Int32, 'steps');\r\n\r\n a.const_i32(0);\r\n a.set_local(steps);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(steps);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(steps);\r\n\r\n // if n is odd: n = 3n + 1, else: n = n / 2\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.and_i32();\r\n a.if(webasmjs.BlockType.Void);\r\n // odd: n = 3n + 1\r\n a.get_local(n);\r\n a.const_i32(3);\r\n a.mul_i32();\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(n);\r\n a.else();\r\n // even: n = n / 2\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.shr_i32_u();\r\n a.set_local(n);\r\n a.end();\r\n\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(steps);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { collatz } = instance.instance.exports;\r\n\r\nfor (const n of [1, 2, 3, 6, 7, 9, 27, 97, 871]) {\r\n log('collatz(' + n + ') = ' + collatz(n) + ' steps');\r\n}`,\r\n },\r\n\r\n 'is-prime': {\r\n label: 'Primality Test',\r\n group: 'Algorithms',\r\n code: `// Primality test \u2014 trial division\r\nconst mod = new webasmjs.ModuleBuilder('prime');\r\n\r\nmod.defineFunction('isPrime', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n // n <= 1 \u2192 not prime\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n // n <= 3 \u2192 prime\r\n a.get_local(n);\r\n a.const_i32(3);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(1);\r\n a.return();\r\n });\r\n\r\n // divisible by 2 \u2192 not prime\r\n a.get_local(n);\r\n a.const_i32(2);\r\n a.rem_i32_u();\r\n a.eqz_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n // Trial division from 3 to sqrt(n)\r\n a.const_i32(3);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n // if i * i > n, break (is prime)\r\n a.get_local(i);\r\n a.get_local(i);\r\n a.mul_i32();\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n // if n % i == 0, not prime\r\n a.get_local(n);\r\n a.get_local(i);\r\n a.rem_i32_u();\r\n a.eqz_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n a.get_local(i);\r\n a.const_i32(2);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.const_i32(1);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isPrime } = instance.instance.exports;\r\n\r\nlog('Prime numbers up to 100:');\r\nconst primes = [];\r\nfor (let n = 2; n <= 100; n++) {\r\n if (isPrime(n)) primes.push(n);\r\n}\r\nlog(primes.join(', '));\r\nlog('');\r\nlog('Testing larger numbers:');\r\nfor (const n of [997, 1000, 7919, 7920, 104729]) {\r\n log(n + ' is ' + (isPrime(n) ? 'prime' : 'not prime'));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 WAT Parser \u2500\u2500\u2500\r\n 'wat-parser': {\r\n label: 'WAT Parser',\r\n group: 'WAT',\r\n code: `// Parse WAT text and instantiate\r\nconst watSource = \\`\r\n(module $parsed\r\n (func $add (param i32) (param i32) (result i32)\r\n local.get 0\r\n local.get 1\r\n i32.add\r\n )\r\n (export \"add\" (func $add))\r\n)\r\n\\`;\r\n\r\nlog('Parsing WAT source...');\r\nconst mod = webasmjs.parseWat(watSource);\r\nlog('WAT parsed successfully!');\r\nlog('');\r\n\r\nconst instance = await mod.instantiate();\r\nconst add = instance.instance.exports.add;\r\nlog('add(3, 4) = ' + add(3, 4));\r\nlog('add(100, 200) = ' + add(100, 200));\r\nlog('add(-5, 10) = ' + add(-5, 10));`,\r\n },\r\n\r\n 'wat-loop': {\r\n label: 'WAT Loop & Branch',\r\n group: 'WAT',\r\n code: `// WAT with loop and branch instructions\r\nconst watSource = \\`\r\n(module $loops\r\n (func $sum (param i32) (result i32)\r\n (local i32) ;; accumulator\r\n (local i32) ;; counter\r\n i32.const 0\r\n local.set 1\r\n i32.const 1\r\n local.set 2\r\n block $break\r\n loop $continue\r\n local.get 2\r\n local.get 0\r\n i32.gt_s\r\n br_if $break\r\n\r\n local.get 1\r\n local.get 2\r\n i32.add\r\n local.set 1\r\n\r\n local.get 2\r\n i32.const 1\r\n i32.add\r\n local.set 2\r\n br $continue\r\n end\r\n end\r\n local.get 1\r\n )\r\n (export \"sum\" (func $sum))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst sum = instance.instance.exports.sum;\r\n\r\nlog('Sum from 1 to N:');\r\nfor (const n of [0, 1, 5, 10, 50, 100]) {\r\n log(' sum(' + n + ') = ' + sum(n));\r\n}`,\r\n },\r\n\r\n 'wat-memory': {\r\n label: 'WAT Memory & Data',\r\n group: 'WAT',\r\n code: `// WAT with memory, data segments, and imports\r\nconst watSource = \\`\r\n(module $memTest\r\n (memory 1)\r\n (func $store (param i32) (param i32)\r\n local.get 0\r\n local.get 1\r\n i32.store offset=0 align=4\r\n )\r\n (func $load (param i32) (result i32)\r\n local.get 0\r\n i32.load offset=0 align=4\r\n )\r\n (export \"store\" (func $store))\r\n (export \"load\" (func $load))\r\n (export \"mem\" (memory 0))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst { store, load, mem } = instance.instance.exports;\r\n\r\n// Store values at various offsets\r\nstore(0, 11);\r\nstore(4, 22);\r\nstore(8, 33);\r\nstore(12, 44);\r\n\r\nlog('Memory contents:');\r\nfor (let addr = 0; addr < 16; addr += 4) {\r\n log(' [' + addr + '] = ' + load(addr));\r\n}\r\n\r\n// Also inspect raw memory\r\nconst view = new Uint8Array(mem.buffer);\r\nlog('');\r\nlog('Raw bytes [0..15]: ' + Array.from(view.slice(0, 16)).join(', '));`,\r\n },\r\n\r\n 'wat-global': {\r\n label: 'WAT Globals & Start',\r\n group: 'WAT',\r\n code: `// WAT with globals, start function, and if/else\r\nconst watSource = \\`\r\n(module $globalDemo\r\n (global $counter (mut i32) (i32.const 0))\r\n\r\n (func $init\r\n i32.const 100\r\n global.set 0\r\n )\r\n\r\n (func $inc (result i32)\r\n global.get 0\r\n i32.const 1\r\n i32.add\r\n global.set 0\r\n global.get 0\r\n )\r\n\r\n (func $dec (result i32)\r\n global.get 0\r\n i32.const 1\r\n i32.sub\r\n global.set 0\r\n global.get 0\r\n )\r\n\r\n (func $getCounter (result i32)\r\n global.get 0\r\n )\r\n\r\n (start $init)\r\n (export \"inc\" (func $inc))\r\n (export \"dec\" (func $dec))\r\n (export \"getCounter\" (func $getCounter))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst { inc, dec, getCounter } = instance.instance.exports;\r\n\r\nlog('Initial (set by start): ' + getCounter());\r\nlog('inc() = ' + inc());\r\nlog('inc() = ' + inc());\r\nlog('inc() = ' + inc());\r\nlog('dec() = ' + dec());\r\nlog('Final: ' + getCounter());`,\r\n },\r\n\r\n // \u2500\u2500\u2500 SIMD \u2500\u2500\u2500\r\n 'simd-vec-add': {\r\n label: 'SIMD Vector Add',\r\n group: 'SIMD',\r\n code: `// SIMD: add two f32x4 vectors in memory\r\nconst mod = new webasmjs.ModuleBuilder('simdAdd', { disableVerification: true });\r\nmod.defineMemory(1);\r\n\r\n// vec4_add(srcA, srcB, dst) \u2014 adds two 4-float vectors\r\nmod.defineFunction('vec4_add', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(2)); // push dest address first\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.add_f32x4();\r\n a.store_v128(2, 0); // store expects [addr, value] on stack\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getF32', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { vec4_add, setF32, getF32 } = instance.instance.exports;\r\n\r\n// A = [1, 2, 3, 4] at offset 0\r\n// B = [10, 20, 30, 40] at offset 16\r\nfor (let i = 0; i < 4; i++) {\r\n setF32(i * 4, i + 1);\r\n setF32(16 + i * 4, (i + 1) * 10);\r\n}\r\n\r\nvec4_add(0, 16, 32);\r\n\r\nlog('A = [1, 2, 3, 4]');\r\nlog('B = [10, 20, 30, 40]');\r\nlog('A + B:');\r\nfor (let i = 0; i < 4; i++) {\r\n log(' [' + i + '] = ' + getF32(32 + i * 4));\r\n}`,\r\n },\r\n\r\n 'simd-dot-product': {\r\n label: 'SIMD Dot Product',\r\n group: 'SIMD',\r\n code: `// SIMD dot product: multiply element-wise then sum lanes\r\nconst mod = new webasmjs.ModuleBuilder('simdDot', { disableVerification: true });\r\nmod.defineMemory(1);\r\n\r\nmod.defineFunction('dot4', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const products = a.declareLocal(webasmjs.ValueType.V128, 'products');\r\n\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.mul_f32x4();\r\n a.set_local(products);\r\n\r\n // Sum all 4 lanes\r\n a.get_local(products);\r\n a.extract_lane_f32x4(0);\r\n a.get_local(products);\r\n a.extract_lane_f32x4(1);\r\n a.add_f32();\r\n a.get_local(products);\r\n a.extract_lane_f32x4(2);\r\n a.add_f32();\r\n a.get_local(products);\r\n a.extract_lane_f32x4(3);\r\n a.add_f32();\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { dot4, setF32 } = instance.instance.exports;\r\n\r\nconst vecA = [1, 2, 3, 4];\r\nconst vecB = [5, 6, 7, 8];\r\n\r\nfor (let i = 0; i < 4; i++) {\r\n setF32(i * 4, vecA[i]);\r\n setF32(16 + i * 4, vecB[i]);\r\n}\r\n\r\nlog('A = [' + vecA + ']');\r\nlog('B = [' + vecB + ']');\r\nlog('dot(A, B) = ' + dot4(0, 16));\r\nlog('Expected: ' + (1*5 + 2*6 + 3*7 + 4*8));`,\r\n },\r\n\r\n 'simd-splat-scale': {\r\n label: 'SIMD Splat & Scale',\r\n group: 'SIMD',\r\n code: `// SIMD splat: broadcast a scalar to all lanes, then multiply\r\nconst mod = new webasmjs.ModuleBuilder('simdScale', { disableVerification: true });\r\nmod.defineMemory(1);\r\n\r\n// scale_vec4(src, dst, scalar) \u2014 multiply a vector by a scalar\r\nmod.defineFunction('scale_vec4', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(1)); // push dest address first\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(2));\r\n a.splat_f32x4(); // broadcast scalar to all 4 lanes\r\n a.mul_f32x4();\r\n a.store_v128(2, 0); // store expects [addr, value] on stack\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getF32', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { scale_vec4, setF32, getF32 } = instance.instance.exports;\r\n\r\nconst vec = [2.0, 4.0, 6.0, 8.0];\r\nfor (let i = 0; i < 4; i++) setF32(i * 4, vec[i]);\r\n\r\nscale_vec4(0, 16, 3.0);\r\n\r\nlog('Vector: [' + vec + ']');\r\nlog('Scalar: 3.0');\r\nlog('Scaled:');\r\nfor (let i = 0; i < 4; i++) {\r\n log(' [' + i + '] = ' + getF32(16 + i * 4));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Bulk Memory \u2500\u2500\u2500\r\n 'bulk-memory': {\r\n label: 'Bulk Memory Ops',\r\n group: 'Bulk Memory',\r\n code: `// Bulk memory: memory.fill and memory.copy\r\nconst mod = new webasmjs.ModuleBuilder('bulkMem');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// fill(dest, value, length)\r\nmod.defineFunction('fill', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.get_local(f.getParameter(2));\r\n a.memory_fill(0);\r\n}).withExport();\r\n\r\n// copy(dest, src, length)\r\nmod.defineFunction('copy', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.get_local(f.getParameter(2));\r\n a.memory_copy(0, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { fill, copy, memory } = instance.instance.exports;\r\nconst view = new Uint8Array(memory.buffer);\r\n\r\n// Fill 8 bytes at offset 0 with 0xAA\r\nfill(0, 0xAA, 8);\r\nlog('After fill(0, 0xAA, 8):');\r\nlog(' bytes[0..7] = [' + Array.from(view.slice(0, 8)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']');\r\n\r\n// Copy those 8 bytes to offset 32\r\ncopy(32, 0, 8);\r\nlog('');\r\nlog('After copy(32, 0, 8):');\r\nlog(' bytes[32..39] = [' + Array.from(view.slice(32, 40)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']');\r\n\r\n// Fill a region with incrementing pattern using a loop\r\nfill(64, 0, 16);\r\nfor (let i = 0; i < 16; i++) {\r\n view[64 + i] = i * 3;\r\n}\r\nlog('');\r\nlog('Manual pattern at [64..79]:');\r\nlog(' ' + Array.from(view.slice(64, 80)).join(', '));\r\n\r\n// Copy that pattern further\r\ncopy(128, 64, 16);\r\nlog('Copied to [128..143]:');\r\nlog(' ' + Array.from(view.slice(128, 144)).join(', '));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Post-MVP Features \u2500\u2500\u2500\r\n 'sign-extend': {\r\n label: 'Sign Extension',\r\n group: 'Post-MVP',\r\n code: `// Sign extension: interpret low bits as signed values\r\nconst mod = new webasmjs.ModuleBuilder('signExt');\r\n\r\n// Treat low 8 bits as a signed byte\r\nmod.defineFunction('extend8', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend8_s_i32();\r\n}).withExport();\r\n\r\n// Treat low 16 bits as a signed i16\r\nmod.defineFunction('extend16', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend16_s_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { extend8, extend16 } = instance.instance.exports;\r\n\r\nlog('i32.extend8_s:');\r\nlog(' extend8(0x7F) = ' + extend8(0x7F) + ' (127, positive byte)');\r\nlog(' extend8(0x80) = ' + extend8(0x80) + ' (128 \u2192 -128, sign bit set)');\r\nlog(' extend8(0xFF) = ' + extend8(0xFF) + ' (255 \u2192 -1)');\r\nlog(' extend8(0x100) = ' + extend8(0x100) + ' (256 \u2192 0, wraps to low byte)');\r\nlog('');\r\nlog('i32.extend16_s:');\r\nlog(' extend16(0x7FFF) = ' + extend16(0x7FFF) + ' (32767, positive)');\r\nlog(' extend16(0x8000) = ' + extend16(0x8000) + ' (32768 \u2192 -32768)');\r\nlog(' extend16(0xFFFF) = ' + extend16(0xFFFF) + ' (65535 \u2192 -1)');`,\r\n },\r\n\r\n 'sat-trunc': {\r\n label: 'Saturating Truncation',\r\n group: 'Post-MVP',\r\n code: `// Saturating truncation: float \u2192 int without trapping on overflow\r\nconst mod = new webasmjs.ModuleBuilder('satTrunc');\r\n\r\n// Normal trunc would trap on overflow; saturating clamps instead\r\nmod.defineFunction('sat_f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_sat_f64_s_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('sat_f64_to_u32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_sat_f64_u_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { sat_f64_to_i32, sat_f64_to_u32 } = instance.instance.exports;\r\n\r\nlog('Saturating f64 \u2192 i32 (signed):');\r\nlog(' 42.9 \u2192 ' + sat_f64_to_i32(42.9));\r\nlog(' -42.9 \u2192 ' + sat_f64_to_i32(-42.9));\r\nlog(' 1e20 \u2192 ' + sat_f64_to_i32(1e20) + ' (clamped to i32 max)');\r\nlog(' -1e20 \u2192 ' + sat_f64_to_i32(-1e20) + ' (clamped to i32 min)');\r\nlog(' NaN \u2192 ' + sat_f64_to_i32(NaN) + ' (NaN \u2192 0)');\r\nlog(' Inf \u2192 ' + sat_f64_to_i32(Infinity) + ' (clamped)');\r\nlog('');\r\nlog('Saturating f64 \u2192 u32 (unsigned, shown as signed i32):');\r\nlog(' 42.9 \u2192 ' + sat_f64_to_u32(42.9));\r\nlog(' -1.0 \u2192 ' + sat_f64_to_u32(-1.0) + ' (negative \u2192 0)');\r\nlog(' 1e20 \u2192 ' + sat_f64_to_u32(1e20) + ' (clamped to u32 max)');`,\r\n },\r\n\r\n 'ref-types': {\r\n label: 'Reference Types',\r\n group: 'Post-MVP',\r\n code: `// Reference types: ref.null, ref.is_null, ref.func\r\nconst mod = new webasmjs.ModuleBuilder('refTypes');\r\n\r\nconst double = mod.defineFunction('double', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(2);\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Check if a null funcref is null \u2192 1\r\nmod.defineFunction('isRefNull', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.ref_null(0x70);\r\n a.ref_is_null();\r\n}).withExport();\r\n\r\n// Check if a real function ref is null \u2192 0\r\nmod.defineFunction('isFuncNull', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.ref_func(double);\r\n a.ref_is_null();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isRefNull, isFuncNull } = instance.instance.exports;\r\n\r\nlog('ref.null + ref.is_null:');\r\nlog(' null funcref is null: ' + (isRefNull() === 1));\r\nlog(' real func ref is null: ' + (isFuncNull() === 1));\r\nlog('');\r\nlog('double(21) = ' + instance.instance.exports.double(21));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Debug & Inspection \u2500\u2500\u2500\r\n 'debug-names': {\r\n label: 'Debug Name Section',\r\n group: 'Debug',\r\n code: `// Inspect the debug name section in the binary\r\nconst mod = new webasmjs.ModuleBuilder('debugExample');\r\n\r\nconst g = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\ng.withName('counter');\r\n\r\nmod.defineFunction('add', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n f.getParameter(0).withName('x');\r\n f.getParameter(1).withName('y');\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('addThree', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n f.getParameter(0).withName('a');\r\n f.getParameter(1).withName('b');\r\n f.getParameter(2).withName('c');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n a.get_local(f.getParameter(2));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nconst bytes = mod.toBytes();\r\n\r\nlog('Binary size: ' + bytes.length + ' bytes');\r\nlog('');\r\n\r\n// Read back the name section\r\nconst reader = new webasmjs.BinaryReader(bytes);\r\nconst info = reader.read();\r\nconst ns = info.nameSection;\r\n\r\nif (ns) {\r\n log('Module name: ' + ns.moduleName);\r\n log('');\r\n\r\n if (ns.functionNames) {\r\n log('Function names:');\r\n ns.functionNames.forEach((name, idx) => {\r\n log(' [' + idx + '] ' + name);\r\n });\r\n }\r\n\r\n if (ns.localNames) {\r\n log('');\r\n log('Local/parameter names:');\r\n ns.localNames.forEach((locals, funcIdx) => {\r\n const funcName = ns.functionNames?.get(funcIdx) || 'func' + funcIdx;\r\n log(' ' + funcName + ':');\r\n locals.forEach((name, localIdx) => {\r\n log(' [' + localIdx + '] ' + name);\r\n });\r\n });\r\n }\r\n\r\n if (ns.globalNames) {\r\n log('');\r\n log('Global names:');\r\n ns.globalNames.forEach((name, idx) => {\r\n log(' [' + idx + '] ' + name);\r\n });\r\n }\r\n} else {\r\n log('No name section found!');\r\n}`,\r\n },\r\n\r\n 'binary-inspect': {\r\n label: 'Binary Inspector',\r\n group: 'Debug',\r\n code: `// Inspect the binary structure of a WASM module\r\nconst mod = new webasmjs.ModuleBuilder('inspect');\r\nmod.defineMemory(1);\r\n\r\nconst counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\nmod.defineFunction('add', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('noop', null, [], (f, a) => {\r\n a.nop();\r\n}).withExport();\r\n\r\nconst bytes = mod.toBytes();\r\n\r\nlog('=== Binary Analysis ===');\r\nlog('Total size: ' + bytes.length + ' bytes');\r\nlog('');\r\n\r\n// Read with BinaryReader\r\nconst reader = new webasmjs.BinaryReader(bytes);\r\nconst info = reader.read();\r\n\r\nlog('WASM version: ' + info.version);\r\nlog('Types: ' + info.types.length);\r\ninfo.types.forEach((t, i) => {\r\n const params = t.parameterTypes.map(p => p.name).join(', ');\r\n const results = t.returnTypes.map(r => r.name).join(', ');\r\n log(' [' + i + '] (' + params + ') -> (' + results + ')');\r\n});\r\n\r\nlog('Functions: ' + info.functions.length);\r\ninfo.functions.forEach((f, i) => {\r\n log(' [' + i + '] type=' + f.typeIndex + ', locals=' + f.locals.length + ', body=' + f.body.length + ' bytes');\r\n});\r\n\r\nlog('Memories: ' + info.memories.length);\r\ninfo.memories.forEach((m, i) => {\r\n log(' [' + i + '] initial=' + m.initial + ' pages (' + (m.initial * 64) + ' KB)');\r\n});\r\n\r\nlog('Globals: ' + info.globals.length);\r\ninfo.globals.forEach((g, i) => {\r\n log(' [' + i + '] mutable=' + g.mutable);\r\n});\r\n\r\nlog('Exports: ' + info.exports.length);\r\ninfo.exports.forEach((e) => {\r\n const kinds = ['function', 'table', 'memory', 'global'];\r\n log(' \"' + e.name + '\" -> ' + (kinds[e.kind] || 'unknown') + '[' + e.index + ']');\r\n});\r\n\r\nlog('');\r\nlog('Valid: ' + WebAssembly.validate(bytes.buffer));`,\r\n },\r\n\r\n 'wat-roundtrip': {\r\n label: 'WAT Roundtrip',\r\n group: 'Debug',\r\n code: `// Build a module programmatically, inspect WAT, parse it back\r\nconst mod = new webasmjs.ModuleBuilder('roundtrip');\r\n\r\nmod.defineFunction('multiply', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('negate', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.const_i32(0);\r\n a.get_local(f.getParameter(0));\r\n a.sub_i32();\r\n}).withExport();\r\n\r\n// Get WAT text\r\nconst watText = mod.toString();\r\nlog('=== Generated WAT ===');\r\nlog(watText);\r\n\r\n// Parse it back\r\nlog('');\r\nlog('=== Parsing WAT back... ===');\r\nconst mod2 = webasmjs.parseWat(watText);\r\n\r\n// Instantiate and test\r\nconst instance = await mod2.instantiate();\r\nconst { multiply, negate } = instance.instance.exports;\r\n\r\nlog('multiply(6, 7) = ' + multiply(6, 7));\r\nlog('multiply(100, -3) = ' + multiply(100, -3));\r\nlog('negate(42) = ' + negate(42));\r\nlog('negate(-10) = ' + negate(-10));\r\nlog('');\r\nlog('Roundtrip successful!');`,\r\n },\r\n};\r\n\r\n// \u2500\u2500\u2500 UI helpers \u2500\u2500\u2500\r\n\r\nconst GROUP_ICONS: Record = {\r\n Basics: '\\u{1F44B}',\r\n Memory: '\\u{1F4BE}',\r\n Globals: '\\u{1F30D}',\r\n Functions: '\\u{1F517}',\r\n Numeric: '\\u{1F522}',\r\n Algorithms: '\\u{2699}',\r\n SIMD: '\\u{26A1}',\r\n 'Bulk Memory': '\\u{1F4E6}',\r\n 'Post-MVP': '\\u{1F680}',\r\n WAT: '\\u{1F4DD}',\r\n Debug: '\\u{1F50D}',\r\n};\r\n\r\nfunction getEditor(): HTMLTextAreaElement {\r\n return document.getElementById('editor') as HTMLTextAreaElement;\r\n}\r\n\r\nfunction getWatOutput(): HTMLElement {\r\n return document.getElementById('watOutput') as HTMLElement;\r\n}\r\n\r\nfunction getRunOutput(): HTMLElement {\r\n return document.getElementById('runOutput') as HTMLElement;\r\n}\r\n\r\nfunction clearOutput(el: HTMLElement): void {\r\n el.textContent = '';\r\n}\r\n\r\nfunction appendOutput(el: HTMLElement, text: string, className?: string): void {\r\n const line = document.createElement('div');\r\n line.textContent = text;\r\n if (className) line.className = className;\r\n el.appendChild(line);\r\n}\r\n\r\nlet currentExampleKey = 'hello-wasm';\r\n\r\nfunction loadExample(name: string): void {\r\n const example = EXAMPLES[name];\r\n if (example) {\r\n currentExampleKey = name;\r\n getEditor().value = example.code;\r\n clearOutput(getWatOutput());\r\n clearOutput(getRunOutput());\r\n const label = document.getElementById('currentExample');\r\n if (label) label.textContent = example.label;\r\n }\r\n}\r\n\r\n// \u2500\u2500\u2500 Example picker dialog \u2500\u2500\u2500\r\n\r\nfunction openExamplePicker(): void {\r\n // Prevent duplicates\r\n const existing = document.getElementById('exampleDialog');\r\n if (existing) existing.remove();\r\n\r\n const overlay = document.createElement('div');\r\n overlay.id = 'exampleDialog';\r\n overlay.className = 'dialog-overlay';\r\n\r\n const dialog = document.createElement('div');\r\n dialog.className = 'dialog';\r\n\r\n // Header with search\r\n const header = document.createElement('div');\r\n header.className = 'dialog-header';\r\n header.innerHTML = '

Examples

';\r\n\r\n const searchInput = document.createElement('input');\r\n searchInput.type = 'text';\r\n searchInput.placeholder = 'Search examples...';\r\n searchInput.className = 'dialog-search';\r\n header.appendChild(searchInput);\r\n dialog.appendChild(header);\r\n\r\n // Build grouped grid\r\n const body = document.createElement('div');\r\n body.className = 'dialog-body';\r\n\r\n const groups = new Map();\r\n for (const [key, example] of Object.entries(EXAMPLES)) {\r\n const group = example.group;\r\n if (!groups.has(group)) groups.set(group, []);\r\n // Extract first line of code as description\r\n const firstComment = example.code.split('\\n')[0].replace(/^\\/\\/\\s*/, '');\r\n groups.get(group)!.push({ key, label: example.label, desc: firstComment });\r\n }\r\n\r\n const allCards: HTMLElement[] = [];\r\n const allSections: HTMLElement[] = [];\r\n\r\n for (const [groupName, items] of groups) {\r\n const section = document.createElement('div');\r\n section.className = 'dialog-group';\r\n section.dataset.group = groupName;\r\n\r\n const groupHeader = document.createElement('div');\r\n groupHeader.className = 'dialog-group-header';\r\n const icon = GROUP_ICONS[groupName] || '';\r\n groupHeader.textContent = `${icon} ${groupName}`;\r\n section.appendChild(groupHeader);\r\n\r\n const grid = document.createElement('div');\r\n grid.className = 'dialog-grid';\r\n\r\n for (const item of items) {\r\n const card = document.createElement('button');\r\n card.className = 'dialog-card';\r\n if (item.key === currentExampleKey) card.classList.add('active');\r\n card.dataset.key = item.key;\r\n card.dataset.search = `${item.label} ${item.desc} ${groupName}`.toLowerCase();\r\n\r\n const title = document.createElement('div');\r\n title.className = 'dialog-card-title';\r\n title.textContent = item.label;\r\n card.appendChild(title);\r\n\r\n const desc = document.createElement('div');\r\n desc.className = 'dialog-card-desc';\r\n desc.textContent = item.desc;\r\n card.appendChild(desc);\r\n\r\n card.addEventListener('click', () => {\r\n loadExample(item.key);\r\n overlay.remove();\r\n });\r\n\r\n grid.appendChild(card);\r\n allCards.push(card);\r\n }\r\n\r\n section.appendChild(grid);\r\n body.appendChild(section);\r\n allSections.push(section);\r\n }\r\n\r\n dialog.appendChild(body);\r\n overlay.appendChild(dialog);\r\n document.body.appendChild(overlay);\r\n\r\n // Search filtering\r\n searchInput.addEventListener('input', () => {\r\n const q = searchInput.value.toLowerCase().trim();\r\n for (const card of allCards) {\r\n const match = !q || card.dataset.search!.includes(q);\r\n (card as HTMLElement).style.display = match ? '' : 'none';\r\n }\r\n // Hide groups with no visible cards\r\n for (const section of allSections) {\r\n const visibleCards = section.querySelectorAll('.dialog-card:not([style*=\"display: none\"])');\r\n (section as HTMLElement).style.display = visibleCards.length > 0 ? '' : 'none';\r\n }\r\n });\r\n\r\n // Close on overlay click\r\n overlay.addEventListener('click', (e) => {\r\n if (e.target === overlay) overlay.remove();\r\n });\r\n\r\n // Close on Escape\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n overlay.remove();\r\n document.removeEventListener('keydown', onKey);\r\n }\r\n };\r\n document.addEventListener('keydown', onKey);\r\n\r\n // Focus search\r\n setTimeout(() => searchInput.focus(), 50);\r\n}\r\n\r\n// Expose library globally for eval'd code\r\n(window as any).webasmjs = {\r\n ModuleBuilder,\r\n ValueType,\r\n BlockType,\r\n ElementType,\r\n TextModuleWriter,\r\n BinaryReader,\r\n parseWat,\r\n};\r\n\r\nasync function run(): Promise {\r\n const watEl = getWatOutput();\r\n const runEl = getRunOutput();\r\n clearOutput(watEl);\r\n clearOutput(runEl);\r\n\r\n const code = getEditor().value;\r\n\r\n // Capture log calls\r\n const log = (msg: any) => {\r\n appendOutput(runEl, String(msg));\r\n };\r\n\r\n // Intercept ModuleBuilder to capture WAT before instantiate\r\n const OrigModuleBuilder = ModuleBuilder;\r\n const patchedClass = class extends OrigModuleBuilder {\r\n async instantiate(imports?: WebAssembly.Imports) {\r\n try {\r\n const wat = this.toString();\r\n appendOutput(watEl, wat);\r\n } catch (e: any) {\r\n appendOutput(watEl, 'Error generating WAT: ' + e.message, 'error');\r\n }\r\n return super.instantiate(imports);\r\n }\r\n };\r\n (window as any).webasmjs.ModuleBuilder = patchedClass;\r\n\r\n try {\r\n const asyncFn = new Function('log', 'webasmjs', `return (async () => {\\n${code}\\n})();`);\r\n await asyncFn(log, (window as any).webasmjs);\r\n appendOutput(runEl, '\\n--- Done ---');\r\n } catch (e: any) {\r\n appendOutput(runEl, 'Error: ' + e.message, 'error');\r\n if (e.stack) {\r\n appendOutput(runEl, e.stack, 'error');\r\n }\r\n } finally {\r\n (window as any).webasmjs.ModuleBuilder = OrigModuleBuilder;\r\n }\r\n}\r\n\r\n// Initialize\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n document.getElementById('examplesBtn')!.addEventListener('click', openExamplePicker);\r\n document.getElementById('runBtn')!.addEventListener('click', run);\r\n\r\n // Ctrl/Cmd+Enter to run\r\n getEditor().addEventListener('keydown', (e: KeyboardEvent) => {\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\r\n e.preventDefault();\r\n run();\r\n }\r\n });\r\n\r\n // Load default example\r\n loadExample('hello-wasm');\r\n});\r\n"], - "mappings": "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", + "sources": ["../src/types.ts", "../src/Arg.ts", "../src/BinaryWriter.ts", "../src/BinaryModuleWriter.ts", "../src/OpCodes.ts", "../src/BinaryReader.ts", "../src/CustomSectionBuilder.ts", "../src/FunctionParameterBuilder.ts", "../src/LocalBuilder.ts", "../src/GlobalType.ts", "../src/GlobalBuilder.ts", "../src/ImportBuilder.ts", "../src/ImmediateEncoder.ts", "../src/Immediate.ts", "../src/Instruction.ts", "../src/LabelBuilder.ts", "../src/OpCodeEmitter.ts", "../src/verification/ControlFlowBlock.ts", "../src/verification/VerificationError.ts", "../src/verification/ControlFlowVerifier.ts", "../src/verification/OperandStack.ts", "../src/FuncTypeSignature.ts", "../src/FuncTypeBuilder.ts", "../src/verification/OperandStackVerifier.ts", "../src/AssemblyEmitter.ts", "../src/InitExpressionEmitter.ts", "../src/DataSegmentBuilder.ts", "../src/FunctionEmitter.ts", "../src/FunctionBuilder.ts", "../src/ElementSegmentBuilder.ts", "../src/ExportBuilder.ts", "../src/ResizableLimits.ts", "../src/MemoryType.ts", "../src/MemoryBuilder.ts", "../src/TableType.ts", "../src/TableBuilder.ts", "../src/TextModuleWriter.ts", "../src/TagBuilder.ts", "../src/ModuleBuilder.ts", "../src/PackageBuilder.ts", "../src/WatParser.ts", "playground.ts"], + "sourcesContent": ["/**\r\n * Language-level type descriptors used in the WASM binary encoding.\r\n * Each type has a name, binary value, and short identifier.\r\n */\r\nexport interface LanguageTypeDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n readonly short: string;\r\n}\r\n\r\nexport const LanguageType = {\r\n Int32: { name: 'i32', value: 0x7f, short: 'i' } as const,\r\n Int64: { name: 'i64', value: 0x7e, short: 'l' } as const,\r\n Float32: { name: 'f32', value: 0x7d, short: 's' } as const,\r\n Float64: { name: 'f64', value: 0x7c, short: 'd' } as const,\r\n AnyFunc: { name: 'anyfunc', value: 0x70, short: 'a' } as const,\r\n Func: { name: 'func', value: 0x60, short: 'f' } as const,\r\n Void: { name: 'void', value: 0x40, short: 'v' } as const,\r\n} as const;\r\n\r\nexport type LanguageTypeKey = keyof typeof LanguageType;\r\n\r\n/**\r\n * WASM value types (i32, i64, f32, f64, v128).\r\n */\r\nexport const ValueType = {\r\n Int32: LanguageType.Int32,\r\n Int64: LanguageType.Int64,\r\n Float32: LanguageType.Float32,\r\n Float64: LanguageType.Float64,\r\n V128: { name: 'v128', value: 0x7b, short: 'v' } as const,\r\n} as const;\r\n\r\nexport type ValueTypeDescriptor = typeof ValueType[keyof typeof ValueType];\r\nexport type ValueTypeKey = keyof typeof ValueType;\r\n\r\n/**\r\n * Block return types (value types + void).\r\n */\r\nexport const BlockType = {\r\n Int32: LanguageType.Int32,\r\n Int64: LanguageType.Int64,\r\n Float32: LanguageType.Float32,\r\n Float64: LanguageType.Float64,\r\n V128: ValueType.V128,\r\n Void: LanguageType.Void,\r\n} as const;\r\n\r\nexport type BlockTypeDescriptor = typeof BlockType[keyof typeof BlockType];\r\n\r\n/**\r\n * Element types for tables.\r\n */\r\nexport const ElementType = {\r\n AnyFunc: LanguageType.AnyFunc,\r\n} as const;\r\n\r\nexport type ElementTypeDescriptor = typeof ElementType[keyof typeof ElementType];\r\n\r\n/**\r\n * Import/export external kinds.\r\n */\r\nexport interface ExternalKindDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n}\r\n\r\nexport const ExternalKind = {\r\n Function: { name: 'Function', value: 0 } as const,\r\n Table: { name: 'Table', value: 1 } as const,\r\n Memory: { name: 'Memory', value: 2 } as const,\r\n Global: { name: 'Global', value: 3 } as const,\r\n} as const;\r\n\r\nexport type ExternalKindType = typeof ExternalKind[keyof typeof ExternalKind];\r\n\r\n/**\r\n * WASM binary section types.\r\n */\r\nexport interface SectionTypeDescriptor {\r\n readonly name: string;\r\n readonly value: number;\r\n}\r\n\r\nexport const SectionType = {\r\n Type: { name: 'Type', value: 1 } as const,\r\n Import: { name: 'Import', value: 2 } as const,\r\n Function: { name: 'Function', value: 3 } as const,\r\n Table: { name: 'Table', value: 4 } as const,\r\n Memory: { name: 'Memory', value: 5 } as const,\r\n Global: { name: 'Global', value: 6 } as const,\r\n Export: { name: 'Export', value: 7 } as const,\r\n Start: { name: 'Start', value: 8 } as const,\r\n Element: { name: 'Element', value: 9 } as const,\r\n Code: { name: 'Code', value: 10 } as const,\r\n Data: { name: 'Data', value: 11 } as const,\r\n DataCount: { name: 'DataCount', value: 12 } as const,\r\n Tag: { name: 'Tag', value: 13 } as const,\r\n createCustom(name: string): SectionTypeDescriptor {\r\n return { name, value: 0 };\r\n },\r\n} as const;\r\n\r\n/**\r\n * Type form descriptors.\r\n */\r\nexport const TypeForm = {\r\n Func: { name: 'func', value: 0x60 } as const,\r\n Block: { name: 'block', value: 0x40 } as const,\r\n} as const;\r\n\r\n/**\r\n * Immediate operand types for instructions.\r\n */\r\nexport enum ImmediateType {\r\n BlockSignature = 'BlockSignature',\r\n RelativeDepth = 'RelativeDepth',\r\n BranchTable = 'BranchTable',\r\n Function = 'Function',\r\n IndirectFunction = 'IndirectFunction',\r\n Local = 'Local',\r\n Global = 'Global',\r\n Float32 = 'Float32',\r\n Float64 = 'Float64',\r\n VarInt32 = 'VarInt32',\r\n VarInt64 = 'VarInt64',\r\n VarUInt1 = 'VarUInt1',\r\n VarUInt32 = 'VarUInt32',\r\n MemoryImmediate = 'MemoryImmediate',\r\n V128Const = 'V128Const',\r\n LaneIndex = 'LaneIndex',\r\n ShuffleMask = 'ShuffleMask',\r\n}\r\n\r\n/**\r\n * Context types for initialization expressions.\r\n */\r\nexport enum InitExpressionType {\r\n Global = 'Global',\r\n Element = 'Element',\r\n Data = 'Data',\r\n}\r\n\r\n/**\r\n * WASM post-MVP feature extensions.\r\n */\r\nexport type WasmFeature =\r\n | 'sign-extend'\r\n | 'sat-trunc'\r\n | 'bulk-memory'\r\n | 'reference-types'\r\n | 'simd'\r\n | 'multi-value'\r\n | 'mutable-globals'\r\n | 'tail-call'\r\n | 'extended-const'\r\n | 'threads'\r\n | 'exception-handling'\r\n | 'multi-memory'\r\n | 'multi-table'\r\n | 'relaxed-simd'\r\n | 'memory64'\r\n | 'gc';\r\n\r\n/**\r\n * WASM version targets. Each target enables a set of features.\r\n */\r\nexport type WasmTarget = 'mvp' | '2.0' | '3.0' | 'latest';\r\n\r\n/**\r\n * Options for module building.\r\n */\r\nexport interface ModuleBuilderOptions {\r\n generateNameSection?: boolean;\r\n disableVerification?: boolean;\r\n target?: WasmTarget;\r\n features?: WasmFeature[];\r\n}\r\n\r\n/**\r\n * Opcode definition structure.\r\n */\r\nexport interface OpCodeDef {\r\n readonly value: number;\r\n readonly mnemonic: string;\r\n readonly immediate?: string;\r\n readonly controlFlow?: string;\r\n readonly stackBehavior: string;\r\n readonly popOperands?: readonly string[];\r\n readonly pushOperands?: readonly string[];\r\n readonly prefix?: number;\r\n readonly feature?: WasmFeature;\r\n}\r\n\r\n/**\r\n * Interface for objects that can write themselves to a BinaryWriter.\r\n */\r\nexport interface Writable {\r\n write(writer: import('./BinaryWriter').default): void;\r\n}\r\n", "const formatOrList = (values: string[]): string => {\r\n if (values.length === 1) {\r\n return values[0];\r\n }\r\n\r\n let text = '';\r\n for (let index = 0; index < values.length; index++) {\r\n text += values[index];\r\n if (index === values.length - 2) {\r\n text += ' or ';\r\n } else if (index !== values.length - 1) {\r\n text += ', ';\r\n }\r\n }\r\n\r\n return text;\r\n};\r\n\r\nexport default class Arg {\r\n static notNull(name: string, value: unknown): void {\r\n if (value === null || value === undefined) {\r\n throw new Error(`The parameter ${name} must be specified.`);\r\n }\r\n }\r\n\r\n static notEmpty(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (value === '' || (Array.isArray(value) && value.length === 0)) {\r\n throw new Error(`The parameter ${name} cannot be empty.`);\r\n }\r\n }\r\n\r\n static notEmptyString(name: string, value: unknown): void {\r\n Arg.string(name, value);\r\n if (value === '') {\r\n throw new Error(`The parameter ${name} cannot be empty.`);\r\n }\r\n }\r\n\r\n static string(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (typeof value !== 'string') {\r\n throw new Error(`The parameter ${name} must be a string.`);\r\n }\r\n }\r\n\r\n static number(name: string, value: unknown): void {\r\n Arg.notNull(name, value);\r\n if (typeof value !== 'number' || isNaN(value)) {\r\n throw new Error(`The parameter ${name} must be a number.`);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static instanceOf(name: string, value: unknown, ...types: (new (...args: any[]) => any)[]): void {\r\n if (!types.some((x) => value instanceof x)) {\r\n throw new Error(\r\n `The parameter ${name} must be a ${formatOrList(types.map((x) => x.name))}.`\r\n );\r\n }\r\n }\r\n}\r\n", "const GrowthRate = 1024;\r\n\r\nexport default class BinaryWriter {\r\n buffer: Uint8Array;\r\n size: number;\r\n\r\n constructor(size: number = 1024) {\r\n this.size = 0;\r\n this.buffer = new Uint8Array(size);\r\n }\r\n\r\n get capacity(): number {\r\n return this.buffer.length;\r\n }\r\n\r\n get length(): number {\r\n return this.size;\r\n }\r\n\r\n get remaining(): number {\r\n return this.buffer.length - this.size;\r\n }\r\n\r\n writeUInt8(value: number): void {\r\n this.writeByte(0xff & value);\r\n }\r\n\r\n writeUInt16(value: number): void {\r\n this.writeByte(value & 0xff);\r\n this.writeByte((value >> 8) & 0xff);\r\n }\r\n\r\n writeUInt32(value: number): void {\r\n this.writeByte(value & 0xff);\r\n this.writeByte((value >> 8) & 0xff);\r\n this.writeByte((value >> 16) & 0xff);\r\n this.writeByte((value >> 24) & 0xff);\r\n }\r\n\r\n writeVarUInt1(value: number): void {\r\n this.writeByte(value > 0 ? 1 : 0);\r\n }\r\n\r\n writeVarUInt7(value: number): void {\r\n this.writeByte(0x7f & value);\r\n }\r\n\r\n writeVarUInt32(value: number): void {\r\n do {\r\n let chunk = value & 0x7f;\r\n value >>>= 7;\r\n if (value !== 0) {\r\n chunk |= 0x80;\r\n }\r\n this.writeByte(chunk);\r\n } while (value !== 0);\r\n }\r\n\r\n writeVarInt7(value: number): void {\r\n this.writeByte(value & 0x7f);\r\n }\r\n\r\n writeVarInt32(value: number): void {\r\n let more = true;\r\n while (more) {\r\n let chunk = value & 0x7f;\r\n value >>= 7;\r\n\r\n if ((value === 0 && (chunk & 0x40) === 0) || (value === -1 && (chunk & 0x40) !== 0)) {\r\n more = false;\r\n } else {\r\n chunk |= 0x80;\r\n }\r\n\r\n this.writeByte(chunk);\r\n }\r\n }\r\n\r\n writeVarInt64(value: number | bigint): void {\r\n if (typeof value === 'number' && Number.isInteger(value)) {\r\n this.writeVarInt32(value);\r\n return;\r\n }\r\n\r\n let bigIntValue = BigInt(value);\r\n let more = true;\r\n\r\n while (more) {\r\n let chunk = Number(bigIntValue & 0x7fn);\r\n bigIntValue = bigIntValue >> 7n;\r\n\r\n if (\r\n (bigIntValue === 0n && (chunk & 0x40) === 0) || (bigIntValue === -1n && (chunk & 0x40) !== 0)\r\n ) {\r\n more = false;\r\n } else {\r\n chunk |= 0x80;\r\n }\r\n\r\n this.writeByte(chunk);\r\n }\r\n }\r\n\r\n writeString(value: string): void {\r\n const encoder = new TextEncoder();\r\n const utfBytes = encoder.encode(value);\r\n this.writeBytes(utfBytes);\r\n }\r\n\r\n writeFloat32(value: number): void {\r\n const array = new Float32Array(1);\r\n array[0] = value;\r\n this.writeBytes(new Uint8Array(array.buffer));\r\n }\r\n\r\n writeFloat64(value: number): void {\r\n const array = new Float64Array(1);\r\n array[0] = value;\r\n this.writeBytes(new Uint8Array(array.buffer));\r\n }\r\n\r\n writeByte(data: number): void {\r\n this.requireCapacity(1);\r\n this.buffer[this.size++] = data;\r\n }\r\n\r\n writeBytes(array: BinaryWriter | Uint8Array): void {\r\n let innerArray: Uint8Array;\r\n if (array instanceof BinaryWriter) {\r\n innerArray = array.toArray();\r\n } else if (array instanceof Uint8Array) {\r\n innerArray = array;\r\n } else {\r\n throw new Error('Invalid argument, must be a Uint8Array or BinaryWriter');\r\n }\r\n\r\n this.requireCapacity(innerArray.length);\r\n this.buffer.set(innerArray, this.size);\r\n this.size += innerArray.length;\r\n }\r\n\r\n requireCapacity(size: number): void {\r\n const remaining = this.remaining;\r\n if (remaining >= size) {\r\n return;\r\n }\r\n\r\n const needed = this.size + size;\r\n const grown = this.buffer.length + GrowthRate;\r\n const newSize = Math.max(needed, grown);\r\n\r\n const newBuffer = new Uint8Array(newSize);\r\n newBuffer.set(this.buffer, 0);\r\n this.buffer = newBuffer;\r\n }\r\n\r\n toArray(): Uint8Array {\r\n const array = new Uint8Array(this.size);\r\n array.set(this.buffer.subarray(0, this.size), 0);\r\n return array;\r\n }\r\n}\r\n", "import { SectionType, SectionTypeDescriptor } from './types';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport ModuleBuilder from './ModuleBuilder';\r\nimport CustomSectionBuilder from './CustomSectionBuilder';\r\n\r\nconst MagicHeader = 0x6d736100;\r\nconst Version = 1;\r\n\r\nexport default class BinaryModuleWriter {\r\n moduleBuilder: ModuleBuilder;\r\n\r\n constructor(moduleBuilder: ModuleBuilder) {\r\n this.moduleBuilder = moduleBuilder;\r\n }\r\n\r\n static writeSectionHeader(\r\n writer: BinaryWriter,\r\n section: SectionTypeDescriptor,\r\n length: number\r\n ): void {\r\n writer.writeVarUInt7(section.value);\r\n writer.writeVarUInt32(length);\r\n }\r\n\r\n static writeSection(\r\n writer: BinaryWriter,\r\n sectionType: SectionTypeDescriptor,\r\n sectionItems: { write(writer: BinaryWriter): void }[]\r\n ): void {\r\n if (sectionItems.length === 0) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(sectionItems.length);\r\n sectionItems.forEach((x) => {\r\n x.write(sectionWriter);\r\n });\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, sectionType, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n static writeCustomSection(writer: BinaryWriter, section: CustomSectionBuilder): void {\r\n section.write(writer);\r\n }\r\n\r\n writeTypeSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Type, this.moduleBuilder._types);\r\n }\r\n\r\n writeImportSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Import, this.moduleBuilder._imports);\r\n }\r\n\r\n writeFunctionSection(writer: BinaryWriter): void {\r\n if (this.moduleBuilder._functions.length === 0) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._functions.length);\r\n for (let index = 0; index < this.moduleBuilder._functions.length; index++) {\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._functions[index].funcTypeBuilder.index);\r\n }\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, SectionType.Function, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeTableSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Table, this.moduleBuilder._tables);\r\n }\r\n\r\n writeMemorySection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Memory, this.moduleBuilder._memories);\r\n }\r\n\r\n writeGlobalSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Global, this.moduleBuilder._globals);\r\n }\r\n\r\n writeExportSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Export, this.moduleBuilder._exports);\r\n }\r\n\r\n writeTagSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Tag, this.moduleBuilder._tags);\r\n }\r\n\r\n writeStartSection(writer: BinaryWriter): void {\r\n if (!this.moduleBuilder._startFunction) {\r\n return;\r\n }\r\n\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.moduleBuilder._startFunction._index);\r\n\r\n BinaryModuleWriter.writeSectionHeader(writer, SectionType.Start, sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeElementSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Element, this.moduleBuilder._elements);\r\n }\r\n\r\n writeCodeSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Code, this.moduleBuilder._functions);\r\n }\r\n\r\n writeDataSection(writer: BinaryWriter): void {\r\n BinaryModuleWriter.writeSection(writer, SectionType.Data, this.moduleBuilder._data);\r\n }\r\n\r\n writeNameSection(writer: BinaryWriter): void {\r\n const mod = this.moduleBuilder;\r\n const nameWriter = new BinaryWriter();\r\n\r\n // Sub-section 0: module name\r\n const moduleNameWriter = new BinaryWriter();\r\n moduleNameWriter.writeVarUInt32(mod._name.length);\r\n moduleNameWriter.writeString(mod._name);\r\n nameWriter.writeVarUInt7(0);\r\n nameWriter.writeVarUInt32(moduleNameWriter.length);\r\n nameWriter.writeBytes(moduleNameWriter);\r\n\r\n // Sub-section 1: function names\r\n const allFunctions = [\r\n ...mod._imports.filter((x) => x.externalKind.value === 0),\r\n ...mod._functions,\r\n ];\r\n if (allFunctions.length > 0) {\r\n const funcNameWriter = new BinaryWriter();\r\n funcNameWriter.writeVarUInt32(allFunctions.length);\r\n allFunctions.forEach((f, i) => {\r\n const name = 'name' in f ? f.name : `${f.moduleName}.${f.fieldName}`;\r\n funcNameWriter.writeVarUInt32(i);\r\n funcNameWriter.writeVarUInt32(name.length);\r\n funcNameWriter.writeString(name);\r\n });\r\n nameWriter.writeVarUInt7(1);\r\n nameWriter.writeVarUInt32(funcNameWriter.length);\r\n nameWriter.writeBytes(funcNameWriter);\r\n }\r\n\r\n // Sub-section 2: local names (parameters + locals per function)\r\n const functionsWithNames = mod._functions.filter((f) => {\r\n if (!f.functionEmitter) return false;\r\n const hasNamedParam = f.parameters.some((p) => p.name !== null);\r\n const hasNamedLocal = f.functionEmitter._locals.some((l) => l.name !== null);\r\n return hasNamedParam || hasNamedLocal;\r\n });\r\n if (functionsWithNames.length > 0) {\r\n const localNameWriter = new BinaryWriter();\r\n localNameWriter.writeVarUInt32(functionsWithNames.length);\r\n functionsWithNames.forEach((f) => {\r\n localNameWriter.writeVarUInt32(f._index);\r\n const namedEntries: { index: number; name: string }[] = [];\r\n f.parameters.forEach((p, i) => {\r\n if (p.name !== null) {\r\n namedEntries.push({ index: i, name: p.name });\r\n }\r\n });\r\n if (f.functionEmitter) {\r\n f.functionEmitter._locals.forEach((l) => {\r\n if (l.name !== null) {\r\n namedEntries.push({ index: l.index, name: l.name });\r\n }\r\n });\r\n }\r\n localNameWriter.writeVarUInt32(namedEntries.length);\r\n namedEntries.forEach((entry) => {\r\n localNameWriter.writeVarUInt32(entry.index);\r\n localNameWriter.writeVarUInt32(entry.name.length);\r\n localNameWriter.writeString(entry.name);\r\n });\r\n });\r\n nameWriter.writeVarUInt7(2);\r\n nameWriter.writeVarUInt32(localNameWriter.length);\r\n nameWriter.writeBytes(localNameWriter);\r\n }\r\n\r\n // Sub-section 7: global names\r\n const namedGlobals: { index: number; name: string }[] = [];\r\n mod._imports.forEach((imp) => {\r\n if (imp.externalKind.value === 3) {\r\n namedGlobals.push({ index: imp.index, name: `${imp.moduleName}.${imp.fieldName}` });\r\n }\r\n });\r\n mod._globals.forEach((g) => {\r\n if (g.name !== null) {\r\n namedGlobals.push({ index: g._index, name: g.name });\r\n }\r\n });\r\n if (namedGlobals.length > 0) {\r\n const globalNameWriter = new BinaryWriter();\r\n globalNameWriter.writeVarUInt32(namedGlobals.length);\r\n namedGlobals.forEach((entry) => {\r\n globalNameWriter.writeVarUInt32(entry.index);\r\n globalNameWriter.writeVarUInt32(entry.name.length);\r\n globalNameWriter.writeString(entry.name);\r\n });\r\n nameWriter.writeVarUInt7(7);\r\n nameWriter.writeVarUInt32(globalNameWriter.length);\r\n nameWriter.writeBytes(globalNameWriter);\r\n }\r\n\r\n // Write as custom section with name \"name\"\r\n const sectionWriter = new BinaryWriter();\r\n const sectionName = 'name';\r\n sectionWriter.writeVarUInt32(sectionName.length);\r\n sectionWriter.writeString(sectionName);\r\n sectionWriter.writeBytes(nameWriter);\r\n\r\n writer.writeVarUInt7(0); // custom section id\r\n writer.writeVarUInt32(sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n writeCustomSections(writer: BinaryWriter): void {\r\n // Write user-defined custom sections (excluding \"name\" which is reserved)\r\n this.moduleBuilder._customSections.forEach((x) => {\r\n BinaryModuleWriter.writeCustomSection(writer, x);\r\n });\r\n\r\n // Auto-generate name section if enabled and not user-provided\r\n if (this.moduleBuilder._options.generateNameSection) {\r\n this.writeNameSection(writer);\r\n }\r\n }\r\n\r\n write(): Uint8Array {\r\n const writer = new BinaryWriter();\r\n writer.writeUInt32(MagicHeader);\r\n writer.writeUInt32(Version);\r\n\r\n this.writeTypeSection(writer);\r\n this.writeImportSection(writer);\r\n this.writeFunctionSection(writer);\r\n this.writeTableSection(writer);\r\n this.writeMemorySection(writer);\r\n this.writeGlobalSection(writer);\r\n this.writeTagSection(writer);\r\n this.writeExportSection(writer);\r\n this.writeStartSection(writer);\r\n this.writeElementSection(writer);\r\n this.writeCodeSection(writer);\r\n this.writeDataSection(writer);\r\n this.writeCustomSections(writer);\r\n\r\n return writer.toArray();\r\n }\r\n}\r\n", "import type { OpCodeDef } from './types';\n\nconst OpCodes = {\n \"unreachable\": {\n value: 0,\n mnemonic: \"unreachable\",\n stackBehavior: \"None\",\n },\n \"nop\": {\n value: 1,\n mnemonic: \"nop\",\n stackBehavior: \"None\",\n },\n \"block\": {\n value: 2,\n mnemonic: \"block\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"None\",\n },\n \"loop\": {\n value: 3,\n mnemonic: \"loop\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"None\",\n },\n \"if\": {\n value: 4,\n mnemonic: \"if\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"else\": {\n value: 5,\n mnemonic: \"else\",\n stackBehavior: \"None\",\n },\n \"try\": {\n value: 6,\n mnemonic: \"try\",\n immediate: \"BlockSignature\",\n controlFlow: \"Push\",\n stackBehavior: \"None\",\n feature: \"exception-handling\",\n },\n \"catch\": {\n value: 7,\n mnemonic: \"catch\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n feature: \"exception-handling\",\n },\n \"throw\": {\n value: 8,\n mnemonic: \"throw\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n feature: \"exception-handling\",\n },\n \"rethrow\": {\n value: 9,\n mnemonic: \"rethrow\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n feature: \"exception-handling\",\n },\n \"end\": {\n value: 11,\n mnemonic: \"end\",\n controlFlow: \"Pop\",\n stackBehavior: \"None\",\n },\n \"br\": {\n value: 12,\n mnemonic: \"br\",\n immediate: \"RelativeDepth\",\n stackBehavior: \"None\",\n },\n \"br_if\": {\n value: 13,\n mnemonic: \"br_if\",\n immediate: \"RelativeDepth\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"br_table\": {\n value: 14,\n mnemonic: \"br_table\",\n immediate: \"BranchTable\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\"] as const,\n },\n \"return\": {\n value: 15,\n mnemonic: \"return\",\n stackBehavior: \"None\",\n },\n \"call\": {\n value: 16,\n mnemonic: \"call\",\n immediate: \"Function\",\n stackBehavior: \"PopPush\",\n },\n \"call_indirect\": {\n value: 17,\n mnemonic: \"call_indirect\",\n immediate: \"IndirectFunction\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n },\n \"return_call\": {\n value: 18,\n mnemonic: \"return_call\",\n immediate: \"Function\",\n stackBehavior: \"PopPush\",\n feature: \"tail-call\",\n },\n \"return_call_indirect\": {\n value: 19,\n mnemonic: \"return_call_indirect\",\n immediate: \"IndirectFunction\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n feature: \"tail-call\",\n },\n \"delegate\": {\n value: 24,\n mnemonic: \"delegate\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n feature: \"exception-handling\",\n },\n \"catch_all\": {\n value: 25,\n mnemonic: \"catch_all\",\n stackBehavior: \"None\",\n feature: \"exception-handling\",\n },\n \"drop\": {\n value: 26,\n mnemonic: \"drop\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"select\": {\n value: 27,\n mnemonic: \"select\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Any\",\"Any\",\"Int32\"] as const,\n pushOperands: [\"Any\"] as const,\n },\n \"get_local\": {\n value: 32,\n mnemonic: \"local.get\",\n immediate: \"Local\",\n stackBehavior: \"Push\",\n pushOperands: [\"Any\"] as const,\n },\n \"set_local\": {\n value: 33,\n mnemonic: \"local.set\",\n immediate: \"Local\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"tee_local\": {\n value: 34,\n mnemonic: \"local.tee\",\n immediate: \"Local\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Any\"] as const,\n pushOperands: [\"Any\"] as const,\n },\n \"get_global\": {\n value: 35,\n mnemonic: \"global.get\",\n immediate: \"Global\",\n stackBehavior: \"Push\",\n pushOperands: [\"Any\"] as const,\n },\n \"set_global\": {\n value: 36,\n mnemonic: \"global.set\",\n immediate: \"Global\",\n stackBehavior: \"Pop\",\n popOperands: [\"Any\"] as const,\n },\n \"i32_load\": {\n value: 40,\n mnemonic: \"i32.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_load\": {\n value: 41,\n mnemonic: \"i64.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_load\": {\n value: 42,\n mnemonic: \"f32.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_load\": {\n value: 43,\n mnemonic: \"f64.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_load8_s\": {\n value: 44,\n mnemonic: \"i32.load8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load8_u\": {\n value: 45,\n mnemonic: \"i32.load8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load16_s\": {\n value: 46,\n mnemonic: \"i32.load16_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_load16_u\": {\n value: 47,\n mnemonic: \"i32.load16_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_load8_s\": {\n value: 48,\n mnemonic: \"i64.load8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load8_u\": {\n value: 49,\n mnemonic: \"i64.load8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load16_s\": {\n value: 50,\n mnemonic: \"i64.load16_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load16_u\": {\n value: 51,\n mnemonic: \"i64.load16_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load32_s\": {\n value: 52,\n mnemonic: \"i64.load32_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_load32_u\": {\n value: 53,\n mnemonic: \"i64.load32_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i32_store\": {\n value: 54,\n mnemonic: \"i32.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i64_store\": {\n value: 55,\n mnemonic: \"i64.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"f32_store\": {\n value: 56,\n mnemonic: \"f32.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Float32\"] as const,\n },\n \"f64_store\": {\n value: 57,\n mnemonic: \"f64.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Float64\"] as const,\n },\n \"i32_store8\": {\n value: 58,\n mnemonic: \"i32.store8\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i32_store16\": {\n value: 59,\n mnemonic: \"i32.store16\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n },\n \"i64_store8\": {\n value: 60,\n mnemonic: \"i64.store8\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"i64_store16\": {\n value: 61,\n mnemonic: \"i64.store16\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"i64_store32\": {\n value: 62,\n mnemonic: \"i64.store32\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n },\n \"mem_size\": {\n value: 63,\n mnemonic: \"memory.size\",\n immediate: \"VarUInt1\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n },\n \"mem_grow\": {\n value: 64,\n mnemonic: \"memory.grow\",\n immediate: \"VarUInt1\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_const\": {\n value: 65,\n mnemonic: \"i32.const\",\n immediate: \"VarInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_const\": {\n value: 66,\n mnemonic: \"i64.const\",\n immediate: \"VarInt64\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_const\": {\n value: 67,\n mnemonic: \"f32.const\",\n immediate: \"Float32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_const\": {\n value: 68,\n mnemonic: \"f64.const\",\n immediate: \"Float64\",\n stackBehavior: \"Push\",\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_eqz\": {\n value: 69,\n mnemonic: \"i32.eqz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_eq\": {\n value: 70,\n mnemonic: \"i32.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ne\": {\n value: 71,\n mnemonic: \"i32.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_lt_s\": {\n value: 72,\n mnemonic: \"i32.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_lt_u\": {\n value: 73,\n mnemonic: \"i32.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_gt_s\": {\n value: 74,\n mnemonic: \"i32.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_gt_u\": {\n value: 75,\n mnemonic: \"i32.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_le_s\": {\n value: 76,\n mnemonic: \"i32.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_le_u\": {\n value: 77,\n mnemonic: \"i32.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ge_s\": {\n value: 78,\n mnemonic: \"i32.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ge_u\": {\n value: 79,\n mnemonic: \"i32.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_eqz\": {\n value: 80,\n mnemonic: \"i64.eqz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_eq\": {\n value: 81,\n mnemonic: \"i64.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ne\": {\n value: 82,\n mnemonic: \"i64.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_lt_s\": {\n value: 83,\n mnemonic: \"i64.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_lt_u\": {\n value: 84,\n mnemonic: \"i64.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_gt_s\": {\n value: 85,\n mnemonic: \"i64.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_gt_u\": {\n value: 86,\n mnemonic: \"i64.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_le_s\": {\n value: 87,\n mnemonic: \"i64.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_le_u\": {\n value: 88,\n mnemonic: \"i64.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ge_s\": {\n value: 89,\n mnemonic: \"i64.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_ge_u\": {\n value: 90,\n mnemonic: \"i64.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_eq\": {\n value: 91,\n mnemonic: \"f32.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_ne\": {\n value: 92,\n mnemonic: \"f32.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_lt\": {\n value: 93,\n mnemonic: \"f32.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_gt\": {\n value: 94,\n mnemonic: \"f32.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_le\": {\n value: 95,\n mnemonic: \"f32.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f32_ge\": {\n value: 96,\n mnemonic: \"f32.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_eq\": {\n value: 97,\n mnemonic: \"f64.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_ne\": {\n value: 98,\n mnemonic: \"f64.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_lt\": {\n value: 99,\n mnemonic: \"f64.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_gt\": {\n value: 100,\n mnemonic: \"f64.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_le\": {\n value: 101,\n mnemonic: \"f64.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"f64_ge\": {\n value: 102,\n mnemonic: \"f64.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_clz\": {\n value: 103,\n mnemonic: \"i32.clz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_ctz\": {\n value: 104,\n mnemonic: \"i32.ctz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_popcnt\": {\n value: 105,\n mnemonic: \"i32.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_add\": {\n value: 106,\n mnemonic: \"i32.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_sub\": {\n value: 107,\n mnemonic: \"i32.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_mul\": {\n value: 108,\n mnemonic: \"i32.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_div_s\": {\n value: 109,\n mnemonic: \"i32.div_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_div_u\": {\n value: 110,\n mnemonic: \"i32.div_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rem_s\": {\n value: 111,\n mnemonic: \"i32.rem_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rem_u\": {\n value: 112,\n mnemonic: \"i32.rem_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_and\": {\n value: 113,\n mnemonic: \"i32.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_or\": {\n value: 114,\n mnemonic: \"i32.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_xor\": {\n value: 115,\n mnemonic: \"i32.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shl\": {\n value: 116,\n mnemonic: \"i32.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shr_s\": {\n value: 117,\n mnemonic: \"i32.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_shr_u\": {\n value: 118,\n mnemonic: \"i32.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rotl\": {\n value: 119,\n mnemonic: \"i32.rotl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_rotr\": {\n value: 120,\n mnemonic: \"i32.rotr\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_clz\": {\n value: 121,\n mnemonic: \"i64.clz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_ctz\": {\n value: 122,\n mnemonic: \"i64.ctz\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_popcnt\": {\n value: 123,\n mnemonic: \"i64.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_add\": {\n value: 124,\n mnemonic: \"i64.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_sub\": {\n value: 125,\n mnemonic: \"i64.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_mul\": {\n value: 126,\n mnemonic: \"i64.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_div_s\": {\n value: 127,\n mnemonic: \"i64.div_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_div_u\": {\n value: 128,\n mnemonic: \"i64.div_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rem_s\": {\n value: 129,\n mnemonic: \"i64.rem_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rem_u\": {\n value: 130,\n mnemonic: \"i64.rem_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_and\": {\n value: 131,\n mnemonic: \"i64.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_or\": {\n value: 132,\n mnemonic: \"i64.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_xor\": {\n value: 133,\n mnemonic: \"i64.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shl\": {\n value: 134,\n mnemonic: \"i64.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shr_s\": {\n value: 135,\n mnemonic: \"i64.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_shr_u\": {\n value: 136,\n mnemonic: \"i64.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rotl\": {\n value: 137,\n mnemonic: \"i64.rotl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_rotr\": {\n value: 138,\n mnemonic: \"i64.rotr\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_abs\": {\n value: 139,\n mnemonic: \"f32.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_neg\": {\n value: 140,\n mnemonic: \"f32.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_ceil\": {\n value: 141,\n mnemonic: \"f32.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_floor\": {\n value: 142,\n mnemonic: \"f32.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_trunc\": {\n value: 143,\n mnemonic: \"f32.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_nearest\": {\n value: 144,\n mnemonic: \"f32.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_sqrt\": {\n value: 145,\n mnemonic: \"f32.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_add\": {\n value: 146,\n mnemonic: \"f32.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_sub\": {\n value: 147,\n mnemonic: \"f32.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_mul\": {\n value: 148,\n mnemonic: \"f32.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_div\": {\n value: 149,\n mnemonic: \"f32.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_min\": {\n value: 150,\n mnemonic: \"f32.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_max\": {\n value: 151,\n mnemonic: \"f32.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_copysign\": {\n value: 152,\n mnemonic: \"f32.copysign\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\",\"Float32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_abs\": {\n value: 153,\n mnemonic: \"f64.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_neg\": {\n value: 154,\n mnemonic: \"f64.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_ceil\": {\n value: 155,\n mnemonic: \"f64.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_floor\": {\n value: 156,\n mnemonic: \"f64.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_trunc\": {\n value: 157,\n mnemonic: \"f64.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_nearest\": {\n value: 158,\n mnemonic: \"f64.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_sqrt\": {\n value: 159,\n mnemonic: \"f64.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_add\": {\n value: 160,\n mnemonic: \"f64.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_sub\": {\n value: 161,\n mnemonic: \"f64.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_mul\": {\n value: 162,\n mnemonic: \"f64.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_div\": {\n value: 163,\n mnemonic: \"f64.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_min\": {\n value: 164,\n mnemonic: \"f64.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_max\": {\n value: 165,\n mnemonic: \"f64.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_copysign\": {\n value: 166,\n mnemonic: \"f64.copysign\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\",\"Float64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_wrap_i64\": {\n value: 167,\n mnemonic: \"i32.wrap_i64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f32_s\": {\n value: 168,\n mnemonic: \"i32.trunc_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f32_u\": {\n value: 169,\n mnemonic: \"i32.trunc_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f64_s\": {\n value: 170,\n mnemonic: \"i32.trunc_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i32_trunc_f64_u\": {\n value: 171,\n mnemonic: \"i32.trunc_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_extend_i32_s\": {\n value: 172,\n mnemonic: \"i64.extend_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_extend_i32_u\": {\n value: 173,\n mnemonic: \"i64.extend_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f32_s\": {\n value: 174,\n mnemonic: \"i64.trunc_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f32_u\": {\n value: 175,\n mnemonic: \"i64.trunc_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f64_s\": {\n value: 176,\n mnemonic: \"i64.trunc_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"i64_trunc_f64_u\": {\n value: 177,\n mnemonic: \"i64.trunc_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_convert_i32_s\": {\n value: 178,\n mnemonic: \"f32.convert_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i32_u\": {\n value: 179,\n mnemonic: \"f32.convert_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i64_s\": {\n value: 180,\n mnemonic: \"f32.convert_i64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_convert_i64_u\": {\n value: 181,\n mnemonic: \"f32.convert_i64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f32_demote_f64\": {\n value: 182,\n mnemonic: \"f32.demote_f64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_convert_i32_s\": {\n value: 183,\n mnemonic: \"f64.convert_i32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i32_u\": {\n value: 184,\n mnemonic: \"f64.convert_i32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i64_s\": {\n value: 185,\n mnemonic: \"f64.convert_i64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_convert_i64_u\": {\n value: 186,\n mnemonic: \"f64.convert_i64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"f64_promote_f32\": {\n value: 187,\n mnemonic: \"f64.promote_f32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_reinterpret_f32\": {\n value: 188,\n mnemonic: \"i32.reinterpret_f32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n },\n \"i64_reinterpret_f64\": {\n value: 189,\n mnemonic: \"i64.reinterpret_f64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n },\n \"f32_reinterpret_i32\": {\n value: 190,\n mnemonic: \"f32.reinterpret_i32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Float32\"] as const,\n },\n \"f64_reinterpret_i64\": {\n value: 191,\n mnemonic: \"f64.reinterpret_i64\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Float64\"] as const,\n },\n \"i32_extend8_s\": {\n value: 192,\n mnemonic: \"i32.extend8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"sign-extend\",\n },\n \"i32_extend16_s\": {\n value: 193,\n mnemonic: \"i32.extend16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend8_s\": {\n value: 194,\n mnemonic: \"i64.extend8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend16_s\": {\n value: 195,\n mnemonic: \"i64.extend16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i64_extend32_s\": {\n value: 196,\n mnemonic: \"i64.extend32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n feature: \"sign-extend\",\n },\n \"i32_trunc_sat_f32_s\": {\n value: 0,\n mnemonic: \"i32.trunc_sat_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f32_u\": {\n value: 1,\n mnemonic: \"i32.trunc_sat_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f64_s\": {\n value: 2,\n mnemonic: \"i32.trunc_sat_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i32_trunc_sat_f64_u\": {\n value: 3,\n mnemonic: \"i32.trunc_sat_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f32_s\": {\n value: 4,\n mnemonic: \"i64.trunc_sat_f32_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f32_u\": {\n value: 5,\n mnemonic: \"i64.trunc_sat_f32_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f64_s\": {\n value: 6,\n mnemonic: \"i64.trunc_sat_f64_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"i64_trunc_sat_f64_u\": {\n value: 7,\n mnemonic: \"i64.trunc_sat_f64_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 252,\n feature: \"sat-trunc\",\n },\n \"memory_init\": {\n value: 8,\n mnemonic: \"memory.init\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"data_drop\": {\n value: 9,\n mnemonic: \"data.drop\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"memory_copy\": {\n value: 10,\n mnemonic: \"memory.copy\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"memory_fill\": {\n value: 11,\n mnemonic: \"memory.fill\",\n immediate: \"VarUInt1\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_init\": {\n value: 12,\n mnemonic: \"table.init\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"elem_drop\": {\n value: 13,\n mnemonic: \"elem.drop\",\n immediate: \"VarUInt32\",\n stackBehavior: \"None\",\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_copy\": {\n value: 14,\n mnemonic: \"table.copy\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"bulk-memory\",\n },\n \"table_grow\": {\n value: 15,\n mnemonic: \"table.grow\",\n immediate: \"VarUInt32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"table_size\": {\n value: 16,\n mnemonic: \"table.size\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"table_fill\": {\n value: 17,\n mnemonic: \"table.fill\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n prefix: 252,\n feature: \"reference-types\",\n },\n \"ref_null\": {\n value: 208,\n mnemonic: \"ref.null\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"ref_is_null\": {\n value: 209,\n mnemonic: \"ref.is_null\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"ref_func\": {\n value: 210,\n mnemonic: \"ref.func\",\n immediate: \"Function\",\n stackBehavior: \"Push\",\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"table_get\": {\n value: 37,\n mnemonic: \"table.get\",\n immediate: \"VarUInt32\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"table_set\": {\n value: 38,\n mnemonic: \"table.set\",\n immediate: \"VarUInt32\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n feature: \"reference-types\",\n },\n \"v128_load\": {\n value: 0,\n mnemonic: \"v128.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8x8_s\": {\n value: 1,\n mnemonic: \"v128.load8x8_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8x8_u\": {\n value: 2,\n mnemonic: \"v128.load8x8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16x4_s\": {\n value: 3,\n mnemonic: \"v128.load16x4_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16x4_u\": {\n value: 4,\n mnemonic: \"v128.load16x4_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32x2_s\": {\n value: 5,\n mnemonic: \"v128.load32x2_s\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32x2_u\": {\n value: 6,\n mnemonic: \"v128.load32x2_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8_splat\": {\n value: 7,\n mnemonic: \"v128.load8_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16_splat\": {\n value: 8,\n mnemonic: \"v128.load16_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_splat\": {\n value: 9,\n mnemonic: \"v128.load32_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_splat\": {\n value: 10,\n mnemonic: \"v128.load64_splat\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store\": {\n value: 11,\n mnemonic: \"v128.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_const\": {\n value: 12,\n mnemonic: \"v128.const\",\n immediate: \"V128Const\",\n stackBehavior: \"Push\",\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shuffle\": {\n value: 13,\n mnemonic: \"i8x16.shuffle\",\n immediate: \"ShuffleMask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_swizzle\": {\n value: 14,\n mnemonic: \"i8x16.swizzle\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_splat\": {\n value: 15,\n mnemonic: \"i8x16.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_splat\": {\n value: 16,\n mnemonic: \"i16x8.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_splat\": {\n value: 17,\n mnemonic: \"i32x4.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_splat\": {\n value: 18,\n mnemonic: \"i64x2.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_splat\": {\n value: 19,\n mnemonic: \"f32x4.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_splat\": {\n value: 20,\n mnemonic: \"f64x2.splat\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Float64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_extract_lane_s\": {\n value: 21,\n mnemonic: \"i8x16.extract_lane_s\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_extract_lane_u\": {\n value: 22,\n mnemonic: \"i8x16.extract_lane_u\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_replace_lane\": {\n value: 23,\n mnemonic: \"i8x16.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extract_lane_s\": {\n value: 24,\n mnemonic: \"i16x8.extract_lane_s\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extract_lane_u\": {\n value: 25,\n mnemonic: \"i16x8.extract_lane_u\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_replace_lane\": {\n value: 26,\n mnemonic: \"i16x8.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extract_lane\": {\n value: 27,\n mnemonic: \"i32x4.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_replace_lane\": {\n value: 28,\n mnemonic: \"i32x4.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extract_lane\": {\n value: 29,\n mnemonic: \"i64x2.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_replace_lane\": {\n value: 30,\n mnemonic: \"i64x2.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_extract_lane\": {\n value: 31,\n mnemonic: \"f32x4.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Float32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_replace_lane\": {\n value: 32,\n mnemonic: \"f32x4.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Float32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_extract_lane\": {\n value: 33,\n mnemonic: \"f64x2.extract_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Float64\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_replace_lane\": {\n value: 34,\n mnemonic: \"f64x2.replace_lane\",\n immediate: \"LaneIndex\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Float64\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_eq\": {\n value: 35,\n mnemonic: \"i8x16.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ne\": {\n value: 36,\n mnemonic: \"i8x16.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_lt_s\": {\n value: 37,\n mnemonic: \"i8x16.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_lt_u\": {\n value: 38,\n mnemonic: \"i8x16.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_gt_s\": {\n value: 39,\n mnemonic: \"i8x16.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_gt_u\": {\n value: 40,\n mnemonic: \"i8x16.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_le_s\": {\n value: 41,\n mnemonic: \"i8x16.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_le_u\": {\n value: 42,\n mnemonic: \"i8x16.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ge_s\": {\n value: 43,\n mnemonic: \"i8x16.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_ge_u\": {\n value: 44,\n mnemonic: \"i8x16.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_eq\": {\n value: 45,\n mnemonic: \"i16x8.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ne\": {\n value: 46,\n mnemonic: \"i16x8.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_lt_s\": {\n value: 47,\n mnemonic: \"i16x8.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_lt_u\": {\n value: 48,\n mnemonic: \"i16x8.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_gt_s\": {\n value: 49,\n mnemonic: \"i16x8.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_gt_u\": {\n value: 50,\n mnemonic: \"i16x8.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_le_s\": {\n value: 51,\n mnemonic: \"i16x8.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_le_u\": {\n value: 52,\n mnemonic: \"i16x8.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ge_s\": {\n value: 53,\n mnemonic: \"i16x8.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_ge_u\": {\n value: 54,\n mnemonic: \"i16x8.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_eq\": {\n value: 55,\n mnemonic: \"i32x4.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ne\": {\n value: 56,\n mnemonic: \"i32x4.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_lt_s\": {\n value: 57,\n mnemonic: \"i32x4.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_lt_u\": {\n value: 58,\n mnemonic: \"i32x4.lt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_gt_s\": {\n value: 59,\n mnemonic: \"i32x4.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_gt_u\": {\n value: 60,\n mnemonic: \"i32x4.gt_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_le_s\": {\n value: 61,\n mnemonic: \"i32x4.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_le_u\": {\n value: 62,\n mnemonic: \"i32x4.le_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ge_s\": {\n value: 63,\n mnemonic: \"i32x4.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_ge_u\": {\n value: 64,\n mnemonic: \"i32x4.ge_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_eq\": {\n value: 65,\n mnemonic: \"f32x4.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ne\": {\n value: 66,\n mnemonic: \"f32x4.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_lt\": {\n value: 67,\n mnemonic: \"f32x4.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_gt\": {\n value: 68,\n mnemonic: \"f32x4.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_le\": {\n value: 69,\n mnemonic: \"f32x4.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ge\": {\n value: 70,\n mnemonic: \"f32x4.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_eq\": {\n value: 71,\n mnemonic: \"f64x2.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ne\": {\n value: 72,\n mnemonic: \"f64x2.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_lt\": {\n value: 73,\n mnemonic: \"f64x2.lt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_gt\": {\n value: 74,\n mnemonic: \"f64x2.gt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_le\": {\n value: 75,\n mnemonic: \"f64x2.le\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ge\": {\n value: 76,\n mnemonic: \"f64x2.ge\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_not\": {\n value: 77,\n mnemonic: \"v128.not\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_and\": {\n value: 78,\n mnemonic: \"v128.and\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_andnot\": {\n value: 79,\n mnemonic: \"v128.andnot\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_or\": {\n value: 80,\n mnemonic: \"v128.or\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_xor\": {\n value: 81,\n mnemonic: \"v128.xor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_bitselect\": {\n value: 82,\n mnemonic: \"v128.bitselect\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_any_true\": {\n value: 83,\n mnemonic: \"v128.any_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load8_lane\": {\n value: 84,\n mnemonic: \"v128.load8_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load16_lane\": {\n value: 85,\n mnemonic: \"v128.load16_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_lane\": {\n value: 86,\n mnemonic: \"v128.load32_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_lane\": {\n value: 87,\n mnemonic: \"v128.load64_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store8_lane\": {\n value: 88,\n mnemonic: \"v128.store8_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store16_lane\": {\n value: 89,\n mnemonic: \"v128.store16_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store32_lane\": {\n value: 90,\n mnemonic: \"v128.store32_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_store64_lane\": {\n value: 91,\n mnemonic: \"v128.store64_lane\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load32_zero\": {\n value: 92,\n mnemonic: \"v128.load32_zero\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"v128_load64_zero\": {\n value: 93,\n mnemonic: \"v128.load64_zero\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f32x4_s\": {\n value: 94,\n mnemonic: \"i32x4.trunc_sat_f32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f32x4_u\": {\n value: 95,\n mnemonic: \"i32x4.trunc_sat_f32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_abs\": {\n value: 96,\n mnemonic: \"i8x16.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_neg\": {\n value: 97,\n mnemonic: \"i8x16.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_popcnt\": {\n value: 98,\n mnemonic: \"i8x16.popcnt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_all_true\": {\n value: 99,\n mnemonic: \"i8x16.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_bitmask\": {\n value: 100,\n mnemonic: \"i8x16.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_narrow_i16x8_s\": {\n value: 101,\n mnemonic: \"i8x16.narrow_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_narrow_i16x8_u\": {\n value: 102,\n mnemonic: \"i8x16.narrow_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_ceil\": {\n value: 103,\n mnemonic: \"f32x4.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_floor\": {\n value: 104,\n mnemonic: \"f32x4.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_trunc\": {\n value: 105,\n mnemonic: \"f32x4.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_nearest\": {\n value: 106,\n mnemonic: \"f32x4.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shl\": {\n value: 107,\n mnemonic: \"i8x16.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shr_s\": {\n value: 108,\n mnemonic: \"i8x16.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_shr_u\": {\n value: 109,\n mnemonic: \"i8x16.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add\": {\n value: 110,\n mnemonic: \"i8x16.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add_sat_s\": {\n value: 111,\n mnemonic: \"i8x16.add_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_add_sat_u\": {\n value: 112,\n mnemonic: \"i8x16.add_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub\": {\n value: 113,\n mnemonic: \"i8x16.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub_sat_s\": {\n value: 114,\n mnemonic: \"i8x16.sub_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_sub_sat_u\": {\n value: 115,\n mnemonic: \"i8x16.sub_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_ceil\": {\n value: 116,\n mnemonic: \"f64x2.ceil\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_floor\": {\n value: 117,\n mnemonic: \"f64x2.floor\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_min_s\": {\n value: 118,\n mnemonic: \"i8x16.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_min_u\": {\n value: 119,\n mnemonic: \"i8x16.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_max_s\": {\n value: 120,\n mnemonic: \"i8x16.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_max_u\": {\n value: 121,\n mnemonic: \"i8x16.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_trunc\": {\n value: 122,\n mnemonic: \"f64x2.trunc\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i8x16_avgr_u\": {\n value: 123,\n mnemonic: \"i8x16.avgr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extadd_pairwise_i8x16_s\": {\n value: 124,\n mnemonic: \"i16x8.extadd_pairwise_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extadd_pairwise_i8x16_u\": {\n value: 125,\n mnemonic: \"i16x8.extadd_pairwise_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extadd_pairwise_i16x8_s\": {\n value: 126,\n mnemonic: \"i32x4.extadd_pairwise_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extadd_pairwise_i16x8_u\": {\n value: 127,\n mnemonic: \"i32x4.extadd_pairwise_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_abs\": {\n value: 128,\n mnemonic: \"i16x8.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_neg\": {\n value: 129,\n mnemonic: \"i16x8.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_q15mulr_sat_s\": {\n value: 130,\n mnemonic: \"i16x8.q15mulr_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_all_true\": {\n value: 131,\n mnemonic: \"i16x8.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_bitmask\": {\n value: 132,\n mnemonic: \"i16x8.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_narrow_i32x4_s\": {\n value: 133,\n mnemonic: \"i16x8.narrow_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_narrow_i32x4_u\": {\n value: 134,\n mnemonic: \"i16x8.narrow_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_low_i8x16_s\": {\n value: 135,\n mnemonic: \"i16x8.extend_low_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_high_i8x16_s\": {\n value: 136,\n mnemonic: \"i16x8.extend_high_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_low_i8x16_u\": {\n value: 137,\n mnemonic: \"i16x8.extend_low_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extend_high_i8x16_u\": {\n value: 138,\n mnemonic: \"i16x8.extend_high_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shl\": {\n value: 139,\n mnemonic: \"i16x8.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shr_s\": {\n value: 140,\n mnemonic: \"i16x8.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_shr_u\": {\n value: 141,\n mnemonic: \"i16x8.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add\": {\n value: 142,\n mnemonic: \"i16x8.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add_sat_s\": {\n value: 143,\n mnemonic: \"i16x8.add_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_add_sat_u\": {\n value: 144,\n mnemonic: \"i16x8.add_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub\": {\n value: 145,\n mnemonic: \"i16x8.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub_sat_s\": {\n value: 146,\n mnemonic: \"i16x8.sub_sat_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_sub_sat_u\": {\n value: 147,\n mnemonic: \"i16x8.sub_sat_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_nearest\": {\n value: 148,\n mnemonic: \"f64x2.nearest\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_mul\": {\n value: 149,\n mnemonic: \"i16x8.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_min_s\": {\n value: 150,\n mnemonic: \"i16x8.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_min_u\": {\n value: 151,\n mnemonic: \"i16x8.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_max_s\": {\n value: 152,\n mnemonic: \"i16x8.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_max_u\": {\n value: 153,\n mnemonic: \"i16x8.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_avgr_u\": {\n value: 155,\n mnemonic: \"i16x8.avgr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_low_i8x16_s\": {\n value: 156,\n mnemonic: \"i16x8.extmul_low_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_high_i8x16_s\": {\n value: 157,\n mnemonic: \"i16x8.extmul_high_i8x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_low_i8x16_u\": {\n value: 158,\n mnemonic: \"i16x8.extmul_low_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i16x8_extmul_high_i8x16_u\": {\n value: 159,\n mnemonic: \"i16x8.extmul_high_i8x16_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_abs\": {\n value: 160,\n mnemonic: \"i32x4.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_neg\": {\n value: 161,\n mnemonic: \"i32x4.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_all_true\": {\n value: 163,\n mnemonic: \"i32x4.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_bitmask\": {\n value: 164,\n mnemonic: \"i32x4.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_low_i16x8_s\": {\n value: 167,\n mnemonic: \"i32x4.extend_low_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_high_i16x8_s\": {\n value: 168,\n mnemonic: \"i32x4.extend_high_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_low_i16x8_u\": {\n value: 169,\n mnemonic: \"i32x4.extend_low_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extend_high_i16x8_u\": {\n value: 170,\n mnemonic: \"i32x4.extend_high_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shl\": {\n value: 171,\n mnemonic: \"i32x4.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shr_s\": {\n value: 172,\n mnemonic: \"i32x4.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_shr_u\": {\n value: 173,\n mnemonic: \"i32x4.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_add\": {\n value: 174,\n mnemonic: \"i32x4.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_convert_i32x4_s\": {\n value: 175,\n mnemonic: \"f32x4.convert_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_convert_i32x4_u\": {\n value: 176,\n mnemonic: \"f32x4.convert_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_sub\": {\n value: 177,\n mnemonic: \"i32x4.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_mul\": {\n value: 181,\n mnemonic: \"i32x4.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_min_s\": {\n value: 182,\n mnemonic: \"i32x4.min_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_min_u\": {\n value: 183,\n mnemonic: \"i32x4.min_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_max_s\": {\n value: 184,\n mnemonic: \"i32x4.max_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_max_u\": {\n value: 185,\n mnemonic: \"i32x4.max_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_dot_i16x8_s\": {\n value: 186,\n mnemonic: \"i32x4.dot_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_low_i16x8_s\": {\n value: 188,\n mnemonic: \"i32x4.extmul_low_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_high_i16x8_s\": {\n value: 189,\n mnemonic: \"i32x4.extmul_high_i16x8_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_low_i16x8_u\": {\n value: 190,\n mnemonic: \"i32x4.extmul_low_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_extmul_high_i16x8_u\": {\n value: 191,\n mnemonic: \"i32x4.extmul_high_i16x8_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_abs\": {\n value: 192,\n mnemonic: \"i64x2.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_neg\": {\n value: 193,\n mnemonic: \"i64x2.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_all_true\": {\n value: 195,\n mnemonic: \"i64x2.all_true\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_bitmask\": {\n value: 196,\n mnemonic: \"i64x2.bitmask\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_low_i32x4_s\": {\n value: 199,\n mnemonic: \"i64x2.extend_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_high_i32x4_s\": {\n value: 200,\n mnemonic: \"i64x2.extend_high_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_low_i32x4_u\": {\n value: 201,\n mnemonic: \"i64x2.extend_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extend_high_i32x4_u\": {\n value: 202,\n mnemonic: \"i64x2.extend_high_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shl\": {\n value: 203,\n mnemonic: \"i64x2.shl\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shr_s\": {\n value: 204,\n mnemonic: \"i64x2.shr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_shr_u\": {\n value: 205,\n mnemonic: \"i64x2.shr_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"Int32\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_add\": {\n value: 206,\n mnemonic: \"i64x2.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_sub\": {\n value: 209,\n mnemonic: \"i64x2.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_mul\": {\n value: 213,\n mnemonic: \"i64x2.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_eq\": {\n value: 214,\n mnemonic: \"i64x2.eq\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_ne\": {\n value: 215,\n mnemonic: \"i64x2.ne\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_lt_s\": {\n value: 216,\n mnemonic: \"i64x2.lt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_gt_s\": {\n value: 217,\n mnemonic: \"i64x2.gt_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_le_s\": {\n value: 218,\n mnemonic: \"i64x2.le_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_ge_s\": {\n value: 219,\n mnemonic: \"i64x2.ge_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_low_i32x4_s\": {\n value: 220,\n mnemonic: \"i64x2.extmul_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_high_i32x4_s\": {\n value: 221,\n mnemonic: \"i64x2.extmul_high_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_low_i32x4_u\": {\n value: 222,\n mnemonic: \"i64x2.extmul_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i64x2_extmul_high_i32x4_u\": {\n value: 223,\n mnemonic: \"i64x2.extmul_high_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_abs\": {\n value: 224,\n mnemonic: \"f32x4.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_neg\": {\n value: 225,\n mnemonic: \"f32x4.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_sqrt\": {\n value: 227,\n mnemonic: \"f32x4.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_add\": {\n value: 228,\n mnemonic: \"f32x4.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_sub\": {\n value: 229,\n mnemonic: \"f32x4.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_mul\": {\n value: 230,\n mnemonic: \"f32x4.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_div\": {\n value: 231,\n mnemonic: \"f32x4.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_min\": {\n value: 232,\n mnemonic: \"f32x4.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_max\": {\n value: 233,\n mnemonic: \"f32x4.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_pmin\": {\n value: 234,\n mnemonic: \"f32x4.pmin\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_pmax\": {\n value: 235,\n mnemonic: \"f32x4.pmax\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_abs\": {\n value: 236,\n mnemonic: \"f64x2.abs\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_neg\": {\n value: 237,\n mnemonic: \"f64x2.neg\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_sqrt\": {\n value: 239,\n mnemonic: \"f64x2.sqrt\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_add\": {\n value: 240,\n mnemonic: \"f64x2.add\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_sub\": {\n value: 241,\n mnemonic: \"f64x2.sub\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_mul\": {\n value: 242,\n mnemonic: \"f64x2.mul\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_div\": {\n value: 243,\n mnemonic: \"f64x2.div\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_min\": {\n value: 244,\n mnemonic: \"f64x2.min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_max\": {\n value: 245,\n mnemonic: \"f64x2.max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_pmin\": {\n value: 246,\n mnemonic: \"f64x2.pmin\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_pmax\": {\n value: 247,\n mnemonic: \"f64x2.pmax\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f64x2_s_zero\": {\n value: 248,\n mnemonic: \"i32x4.trunc_sat_f64x2_s_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"i32x4_trunc_sat_f64x2_u_zero\": {\n value: 249,\n mnemonic: \"i32x4.trunc_sat_f64x2_u_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_convert_low_i32x4_s\": {\n value: 250,\n mnemonic: \"f64x2.convert_low_i32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_convert_low_i32x4_u\": {\n value: 251,\n mnemonic: \"f64x2.convert_low_i32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f32x4_demote_f64x2_zero\": {\n value: 252,\n mnemonic: \"f32x4.demote_f64x2_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"f64x2_promote_low_f32x4\": {\n value: 253,\n mnemonic: \"f64x2.promote_low_f32x4\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"simd\",\n },\n \"memory_atomic_notify\": {\n value: 0,\n mnemonic: \"memory.atomic.notify\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"memory_atomic_wait32\": {\n value: 1,\n mnemonic: \"memory.atomic.wait32\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"memory_atomic_wait64\": {\n value: 2,\n mnemonic: \"memory.atomic.wait64\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"atomic_fence\": {\n value: 3,\n mnemonic: \"atomic.fence\",\n immediate: \"VarUInt1\",\n stackBehavior: \"None\",\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_load\": {\n value: 16,\n mnemonic: \"i32.atomic.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_load\": {\n value: 17,\n mnemonic: \"i64.atomic.load\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_load8_u\": {\n value: 18,\n mnemonic: \"i32.atomic.load8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_load16_u\": {\n value: 19,\n mnemonic: \"i32.atomic.load16_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_load8_u\": {\n value: 20,\n mnemonic: \"i64.atomic.load8_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_load16_u\": {\n value: 21,\n mnemonic: \"i64.atomic.load16_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_load32_u\": {\n value: 22,\n mnemonic: \"i64.atomic.load32_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_store\": {\n value: 23,\n mnemonic: \"i32.atomic.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_store\": {\n value: 24,\n mnemonic: \"i64.atomic.store\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_store8\": {\n value: 25,\n mnemonic: \"i32.atomic.store8\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_store16\": {\n value: 26,\n mnemonic: \"i32.atomic.store16\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_store8\": {\n value: 27,\n mnemonic: \"i64.atomic.store8\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_store16\": {\n value: 28,\n mnemonic: \"i64.atomic.store16\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_store32\": {\n value: 29,\n mnemonic: \"i64.atomic.store32\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"Pop\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw_add\": {\n value: 30,\n mnemonic: \"i32.atomic.rmw.add\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw_add\": {\n value: 31,\n mnemonic: \"i64.atomic.rmw.add\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw8_add_u\": {\n value: 32,\n mnemonic: \"i32.atomic.rmw8.add_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw16_add_u\": {\n value: 33,\n mnemonic: \"i32.atomic.rmw16.add_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw8_add_u\": {\n value: 34,\n mnemonic: \"i64.atomic.rmw8.add_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw16_add_u\": {\n value: 35,\n mnemonic: \"i64.atomic.rmw16.add_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw32_add_u\": {\n value: 36,\n mnemonic: \"i64.atomic.rmw32.add_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw_sub\": {\n value: 37,\n mnemonic: \"i32.atomic.rmw.sub\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw_sub\": {\n value: 38,\n mnemonic: \"i64.atomic.rmw.sub\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw8_sub_u\": {\n value: 39,\n mnemonic: \"i32.atomic.rmw8.sub_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw16_sub_u\": {\n value: 40,\n mnemonic: \"i32.atomic.rmw16.sub_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw8_sub_u\": {\n value: 41,\n mnemonic: \"i64.atomic.rmw8.sub_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw16_sub_u\": {\n value: 42,\n mnemonic: \"i64.atomic.rmw16.sub_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw32_sub_u\": {\n value: 43,\n mnemonic: \"i64.atomic.rmw32.sub_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw_and\": {\n value: 44,\n mnemonic: \"i32.atomic.rmw.and\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw_and\": {\n value: 45,\n mnemonic: \"i64.atomic.rmw.and\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw8_and_u\": {\n value: 46,\n mnemonic: \"i32.atomic.rmw8.and_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw16_and_u\": {\n value: 47,\n mnemonic: \"i32.atomic.rmw16.and_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw8_and_u\": {\n value: 48,\n mnemonic: \"i64.atomic.rmw8.and_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw16_and_u\": {\n value: 49,\n mnemonic: \"i64.atomic.rmw16.and_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw32_and_u\": {\n value: 50,\n mnemonic: \"i64.atomic.rmw32.and_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw_or\": {\n value: 51,\n mnemonic: \"i32.atomic.rmw.or\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw_or\": {\n value: 52,\n mnemonic: \"i64.atomic.rmw.or\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw8_or_u\": {\n value: 53,\n mnemonic: \"i32.atomic.rmw8.or_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw16_or_u\": {\n value: 54,\n mnemonic: \"i32.atomic.rmw16.or_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw8_or_u\": {\n value: 55,\n mnemonic: \"i64.atomic.rmw8.or_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw16_or_u\": {\n value: 56,\n mnemonic: \"i64.atomic.rmw16.or_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw32_or_u\": {\n value: 57,\n mnemonic: \"i64.atomic.rmw32.or_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw_xor\": {\n value: 58,\n mnemonic: \"i32.atomic.rmw.xor\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw_xor\": {\n value: 59,\n mnemonic: \"i64.atomic.rmw.xor\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw8_xor_u\": {\n value: 60,\n mnemonic: \"i32.atomic.rmw8.xor_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw16_xor_u\": {\n value: 61,\n mnemonic: \"i32.atomic.rmw16.xor_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw8_xor_u\": {\n value: 62,\n mnemonic: \"i64.atomic.rmw8.xor_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw16_xor_u\": {\n value: 63,\n mnemonic: \"i64.atomic.rmw16.xor_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw32_xor_u\": {\n value: 64,\n mnemonic: \"i64.atomic.rmw32.xor_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw_xchg\": {\n value: 65,\n mnemonic: \"i32.atomic.rmw.xchg\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw_xchg\": {\n value: 66,\n mnemonic: \"i64.atomic.rmw.xchg\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw8_xchg_u\": {\n value: 67,\n mnemonic: \"i32.atomic.rmw8.xchg_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw16_xchg_u\": {\n value: 68,\n mnemonic: \"i32.atomic.rmw16.xchg_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw8_xchg_u\": {\n value: 69,\n mnemonic: \"i64.atomic.rmw8.xchg_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw16_xchg_u\": {\n value: 70,\n mnemonic: \"i64.atomic.rmw16.xchg_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw32_xchg_u\": {\n value: 71,\n mnemonic: \"i64.atomic.rmw32.xchg_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw_cmpxchg\": {\n value: 72,\n mnemonic: \"i32.atomic.rmw.cmpxchg\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw_cmpxchg\": {\n value: 73,\n mnemonic: \"i64.atomic.rmw.cmpxchg\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw8_cmpxchg_u\": {\n value: 74,\n mnemonic: \"i32.atomic.rmw8.cmpxchg_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i32_atomic_rmw16_cmpxchg_u\": {\n value: 75,\n mnemonic: \"i32.atomic.rmw16.cmpxchg_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int32\",\"Int32\"] as const,\n pushOperands: [\"Int32\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw8_cmpxchg_u\": {\n value: 76,\n mnemonic: \"i64.atomic.rmw8.cmpxchg_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw16_cmpxchg_u\": {\n value: 77,\n mnemonic: \"i64.atomic.rmw16.cmpxchg_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i64_atomic_rmw32_cmpxchg_u\": {\n value: 78,\n mnemonic: \"i64.atomic.rmw32.cmpxchg_u\",\n immediate: \"MemoryImmediate\",\n stackBehavior: \"PopPush\",\n popOperands: [\"Int32\",\"Int64\",\"Int64\"] as const,\n pushOperands: [\"Int64\"] as const,\n prefix: 254,\n feature: \"threads\",\n },\n \"i8x16_relaxed_swizzle\": {\n value: 256,\n mnemonic: \"i8x16.relaxed_swizzle\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"i32x4_relaxed_trunc_f32x4_s\": {\n value: 257,\n mnemonic: \"i32x4.relaxed_trunc_f32x4_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"i32x4_relaxed_trunc_f32x4_u\": {\n value: 258,\n mnemonic: \"i32x4.relaxed_trunc_f32x4_u\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"i32x4_relaxed_trunc_f64x2_s_zero\": {\n value: 259,\n mnemonic: \"i32x4.relaxed_trunc_f64x2_s_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"i32x4_relaxed_trunc_f64x2_u_zero\": {\n value: 260,\n mnemonic: \"i32x4.relaxed_trunc_f64x2_u_zero\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"f32x4_relaxed_madd\": {\n value: 261,\n mnemonic: \"f32x4.relaxed_madd\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"f32x4_relaxed_nmadd\": {\n value: 262,\n mnemonic: \"f32x4.relaxed_nmadd\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"f64x2_relaxed_madd\": {\n value: 263,\n mnemonic: \"f64x2.relaxed_madd\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"f64x2_relaxed_nmadd\": {\n value: 264,\n mnemonic: \"f64x2.relaxed_nmadd\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"i8x16_relaxed_laneselect\": {\n value: 265,\n mnemonic: \"i8x16.relaxed_laneselect\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"i16x8_relaxed_laneselect\": {\n value: 266,\n mnemonic: \"i16x8.relaxed_laneselect\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"i32x4_relaxed_laneselect\": {\n value: 267,\n mnemonic: \"i32x4.relaxed_laneselect\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"i64x2_relaxed_laneselect\": {\n value: 268,\n mnemonic: \"i64x2.relaxed_laneselect\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"f32x4_relaxed_min\": {\n value: 269,\n mnemonic: \"f32x4.relaxed_min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"f32x4_relaxed_max\": {\n value: 270,\n mnemonic: \"f32x4.relaxed_max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"f64x2_relaxed_min\": {\n value: 271,\n mnemonic: \"f64x2.relaxed_min\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"f64x2_relaxed_max\": {\n value: 272,\n mnemonic: \"f64x2.relaxed_max\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"i16x8_relaxed_q15mulr_s\": {\n value: 273,\n mnemonic: \"i16x8.relaxed_q15mulr_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"i16x8_relaxed_dot_i8x16_i7x16_s\": {\n value: 274,\n mnemonic: \"i16x8.relaxed_dot_i8x16_i7x16_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n \"i32x4_relaxed_dot_i8x16_i7x16_add_s\": {\n value: 275,\n mnemonic: \"i32x4.relaxed_dot_i8x16_i7x16_add_s\",\n stackBehavior: \"PopPush\",\n popOperands: [\"V128\",\"V128\",\"V128\"] as const,\n pushOperands: [\"V128\"] as const,\n prefix: 253,\n feature: \"relaxed-simd\",\n },\n} as const satisfies Record;\n\nexport default OpCodes;\n", "import {\r\n SectionType,\r\n SectionTypeDescriptor,\r\n ExternalKind,\r\n ValueType,\r\n ElementType,\r\n ValueTypeDescriptor,\r\n ImmediateType,\r\n LanguageType,\r\n} from './types';\r\nimport OpCodes from './OpCodes';\r\n\r\nexport interface ModuleInfo {\r\n version: number;\r\n types: FuncTypeInfo[];\r\n imports: ImportInfo[];\r\n functions: FunctionInfo[];\r\n tables: TableInfo[];\r\n memories: MemoryInfo[];\r\n globals: GlobalInfo[];\r\n exports: ExportInfo[];\r\n start: number | null;\r\n elements: ElementInfo[];\r\n data: DataInfo[];\r\n customSections: CustomSectionInfo[];\r\n nameSection?: NameSectionInfo;\r\n}\r\n\r\nexport interface FuncTypeInfo {\r\n parameterTypes: ValueTypeDescriptor[];\r\n returnTypes: ValueTypeDescriptor[];\r\n}\r\n\r\nexport interface ImportInfo {\r\n moduleName: string;\r\n fieldName: string;\r\n kind: number;\r\n typeIndex?: number;\r\n tableType?: { elementType: number; initial: number; maximum: number | null };\r\n memoryType?: { initial: number; maximum: number | null };\r\n globalType?: { valueType: number; mutable: boolean };\r\n}\r\n\r\nexport interface FunctionInfo {\r\n typeIndex: number;\r\n locals: { count: number; type: number }[];\r\n body: Uint8Array;\r\n}\r\n\r\nexport interface TableInfo {\r\n elementType: number;\r\n initial: number;\r\n maximum: number | null;\r\n}\r\n\r\nexport interface MemoryInfo {\r\n initial: number;\r\n maximum: number | null;\r\n}\r\n\r\nexport interface GlobalInfo {\r\n valueType: number;\r\n mutable: boolean;\r\n initExpr: Uint8Array;\r\n}\r\n\r\nexport interface ExportInfo {\r\n name: string;\r\n kind: number;\r\n index: number;\r\n}\r\n\r\nexport interface ElementInfo {\r\n tableIndex: number;\r\n offsetExpr: Uint8Array;\r\n functionIndices: number[];\r\n}\r\n\r\nexport interface DataInfo {\r\n memoryIndex: number;\r\n offsetExpr: Uint8Array;\r\n data: Uint8Array;\r\n}\r\n\r\nexport interface CustomSectionInfo {\r\n name: string;\r\n data: Uint8Array;\r\n}\r\n\r\nexport interface NameSectionInfo {\r\n moduleName?: string;\r\n functionNames?: Map;\r\n localNames?: Map>;\r\n globalNames?: Map;\r\n}\r\n\r\nconst MagicHeader = 0x6d736100;\r\n\r\nexport default class BinaryReader {\r\n buffer: Uint8Array;\r\n offset: number;\r\n\r\n constructor(buffer: Uint8Array) {\r\n this.buffer = buffer;\r\n this.offset = 0;\r\n }\r\n\r\n read(): ModuleInfo {\r\n const magic = this.readUInt32();\r\n if (magic !== MagicHeader) {\r\n throw new Error(`Invalid WASM magic header: 0x${magic.toString(16)}`);\r\n }\r\n\r\n const version = this.readUInt32();\r\n if (version !== 1) {\r\n throw new Error(`Unsupported WASM version: ${version}`);\r\n }\r\n\r\n const module: ModuleInfo = {\r\n version,\r\n types: [],\r\n imports: [],\r\n functions: [],\r\n tables: [],\r\n memories: [],\r\n globals: [],\r\n exports: [],\r\n start: null,\r\n elements: [],\r\n data: [],\r\n customSections: [],\r\n };\r\n\r\n // Track function type indices separately (function section only stores type indices)\r\n const functionTypeIndices: number[] = [];\r\n\r\n while (this.offset < this.buffer.length) {\r\n const sectionId = this.readVarUInt7();\r\n const sectionSize = this.readVarUInt32();\r\n const sectionEnd = this.offset + sectionSize;\r\n\r\n switch (sectionId) {\r\n case 0: // Custom\r\n this.readCustomSection(module, sectionEnd);\r\n break;\r\n case 1: // Type\r\n this.readTypeSection(module);\r\n break;\r\n case 2: // Import\r\n this.readImportSection(module);\r\n break;\r\n case 3: // Function\r\n this.readFunctionSection(functionTypeIndices);\r\n break;\r\n case 4: // Table\r\n this.readTableSection(module);\r\n break;\r\n case 5: // Memory\r\n this.readMemorySection(module);\r\n break;\r\n case 6: // Global\r\n this.readGlobalSection(module);\r\n break;\r\n case 7: // Export\r\n this.readExportSection(module);\r\n break;\r\n case 8: // Start\r\n module.start = this.readVarUInt32();\r\n break;\r\n case 9: // Element\r\n this.readElementSection(module);\r\n break;\r\n case 10: // Code\r\n this.readCodeSection(module, functionTypeIndices);\r\n break;\r\n case 11: // Data\r\n this.readDataSection(module);\r\n break;\r\n default:\r\n // Skip unknown section\r\n this.offset = sectionEnd;\r\n break;\r\n }\r\n\r\n this.offset = sectionEnd;\r\n }\r\n\r\n return module;\r\n }\r\n\r\n private readCustomSection(module: ModuleInfo, sectionEnd: number): void {\r\n const nameLen = this.readVarUInt32();\r\n const name = this.readString(nameLen);\r\n\r\n if (name === 'name') {\r\n module.nameSection = this.readNameSection(sectionEnd);\r\n return;\r\n }\r\n\r\n const remaining = sectionEnd - this.offset;\r\n const data = this.readBytes(remaining);\r\n module.customSections.push({ name, data });\r\n }\r\n\r\n private readNameSection(sectionEnd: number): NameSectionInfo {\r\n const info: NameSectionInfo = {};\r\n\r\n while (this.offset < sectionEnd) {\r\n const subsectionId = this.readVarUInt7();\r\n const subsectionSize = this.readVarUInt32();\r\n const subsectionEnd = this.offset + subsectionSize;\r\n\r\n switch (subsectionId) {\r\n case 0: { // module name\r\n const len = this.readVarUInt32();\r\n info.moduleName = this.readString(len);\r\n break;\r\n }\r\n case 1: { // function names\r\n const count = this.readVarUInt32();\r\n info.functionNames = new Map();\r\n for (let i = 0; i < count; i++) {\r\n const index = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n info.functionNames.set(index, this.readString(len));\r\n }\r\n break;\r\n }\r\n case 2: { // local names\r\n const funcCount = this.readVarUInt32();\r\n info.localNames = new Map();\r\n for (let i = 0; i < funcCount; i++) {\r\n const funcIndex = this.readVarUInt32();\r\n const localCount = this.readVarUInt32();\r\n const locals = new Map();\r\n for (let j = 0; j < localCount; j++) {\r\n const localIndex = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n locals.set(localIndex, this.readString(len));\r\n }\r\n info.localNames.set(funcIndex, locals);\r\n }\r\n break;\r\n }\r\n case 7: { // global names\r\n const count = this.readVarUInt32();\r\n info.globalNames = new Map();\r\n for (let i = 0; i < count; i++) {\r\n const index = this.readVarUInt32();\r\n const len = this.readVarUInt32();\r\n info.globalNames.set(index, this.readString(len));\r\n }\r\n break;\r\n }\r\n default:\r\n // Skip unknown subsections\r\n this.offset = subsectionEnd;\r\n break;\r\n }\r\n\r\n this.offset = subsectionEnd;\r\n }\r\n\r\n return info;\r\n }\r\n\r\n private readTypeSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const form = this.readVarInt7(); // 0x60 = func\r\n const paramCount = this.readVarUInt32();\r\n const parameterTypes: ValueTypeDescriptor[] = [];\r\n for (let j = 0; j < paramCount; j++) {\r\n parameterTypes.push(this.readValueType());\r\n }\r\n const returnCount = this.readVarUInt32();\r\n const returnTypes: ValueTypeDescriptor[] = [];\r\n for (let j = 0; j < returnCount; j++) {\r\n returnTypes.push(this.readValueType());\r\n }\r\n module.types.push({ parameterTypes, returnTypes });\r\n }\r\n }\r\n\r\n private readImportSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const moduleNameLen = this.readVarUInt32();\r\n const moduleName = this.readString(moduleNameLen);\r\n const fieldNameLen = this.readVarUInt32();\r\n const fieldName = this.readString(fieldNameLen);\r\n const kind = this.readUInt8();\r\n\r\n const imp: ImportInfo = { moduleName, fieldName, kind };\r\n\r\n switch (kind) {\r\n case 0: // Function\r\n imp.typeIndex = this.readVarUInt32();\r\n break;\r\n case 1: { // Table\r\n const elementType = this.readVarInt7();\r\n const { initial, maximum } = this.readResizableLimits();\r\n imp.tableType = { elementType, initial, maximum };\r\n break;\r\n }\r\n case 2: { // Memory\r\n const { initial, maximum } = this.readResizableLimits();\r\n imp.memoryType = { initial, maximum };\r\n break;\r\n }\r\n case 3: { // Global\r\n const valueType = this.readVarInt7();\r\n const mutable = this.readVarUInt1() === 1;\r\n imp.globalType = { valueType, mutable };\r\n break;\r\n }\r\n }\r\n\r\n module.imports.push(imp);\r\n }\r\n }\r\n\r\n private readFunctionSection(functionTypeIndices: number[]): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n functionTypeIndices.push(this.readVarUInt32());\r\n }\r\n }\r\n\r\n private readTableSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const elementType = this.readVarInt7();\r\n const { initial, maximum } = this.readResizableLimits();\r\n module.tables.push({ elementType, initial, maximum });\r\n }\r\n }\r\n\r\n private readMemorySection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const { initial, maximum } = this.readResizableLimits();\r\n module.memories.push({ initial, maximum });\r\n }\r\n }\r\n\r\n private readGlobalSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const valueType = this.readVarInt7();\r\n const mutable = this.readVarUInt1() === 1;\r\n const initExpr = this.readInitExpr();\r\n module.globals.push({ valueType, mutable, initExpr });\r\n }\r\n }\r\n\r\n private readExportSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const nameLen = this.readVarUInt32();\r\n const name = this.readString(nameLen);\r\n const kind = this.readUInt8();\r\n const index = this.readVarUInt32();\r\n module.exports.push({ name, kind, index });\r\n }\r\n }\r\n\r\n private readElementSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const tableIndex = this.readVarUInt32();\r\n const offsetExpr = this.readInitExpr();\r\n const numElems = this.readVarUInt32();\r\n const functionIndices: number[] = [];\r\n for (let j = 0; j < numElems; j++) {\r\n functionIndices.push(this.readVarUInt32());\r\n }\r\n module.elements.push({ tableIndex, offsetExpr, functionIndices });\r\n }\r\n }\r\n\r\n private readCodeSection(module: ModuleInfo, functionTypeIndices: number[]): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const bodySize = this.readVarUInt32();\r\n const bodyEnd = this.offset + bodySize;\r\n\r\n const localCount = this.readVarUInt32();\r\n const locals: { count: number; type: number }[] = [];\r\n for (let j = 0; j < localCount; j++) {\r\n const lCount = this.readVarUInt32();\r\n const type = this.readVarInt7();\r\n locals.push({ count: lCount, type });\r\n }\r\n\r\n const bodyLength = bodyEnd - this.offset;\r\n const body = this.readBytes(bodyLength);\r\n\r\n module.functions.push({\r\n typeIndex: functionTypeIndices[i],\r\n locals,\r\n body,\r\n });\r\n\r\n this.offset = bodyEnd;\r\n }\r\n }\r\n\r\n private readDataSection(module: ModuleInfo): void {\r\n const count = this.readVarUInt32();\r\n for (let i = 0; i < count; i++) {\r\n const memoryIndex = this.readVarUInt32();\r\n const offsetExpr = this.readInitExpr();\r\n const dataSize = this.readVarUInt32();\r\n const data = this.readBytes(dataSize);\r\n module.data.push({ memoryIndex, offsetExpr, data });\r\n }\r\n }\r\n\r\n private readInitExpr(): Uint8Array {\r\n const start = this.offset;\r\n while (this.offset < this.buffer.length) {\r\n const byte = this.buffer[this.offset++];\r\n if (byte === OpCodes.end.value) {\r\n break;\r\n }\r\n // Skip over immediate operands for known init expression opcodes\r\n switch (byte) {\r\n case OpCodes.i32_const.value:\r\n this.readVarInt32();\r\n break;\r\n case OpCodes.i64_const.value:\r\n this.readVarInt64();\r\n break;\r\n case OpCodes.f32_const.value:\r\n this.offset += 4;\r\n break;\r\n case OpCodes.f64_const.value:\r\n this.offset += 8;\r\n break;\r\n case OpCodes.get_global.value:\r\n this.readVarUInt32();\r\n break;\r\n }\r\n }\r\n return this.buffer.slice(start, this.offset);\r\n }\r\n\r\n private readResizableLimits(): { initial: number; maximum: number | null } {\r\n const flags = this.readVarUInt1();\r\n const initial = this.readVarUInt32();\r\n const maximum = flags === 1 ? this.readVarUInt32() : null;\r\n return { initial, maximum };\r\n }\r\n\r\n private readValueType(): ValueTypeDescriptor {\r\n const value = this.readVarInt7();\r\n // Value types are signed: -1=i32, -2=i64, -3=f32, -4=f64\r\n switch (value) {\r\n case -1: return ValueType.Int32;\r\n case -2: return ValueType.Int64;\r\n case -3: return ValueType.Float32;\r\n case -4: return ValueType.Float64;\r\n default:\r\n throw new Error(`Unknown value type: 0x${(value & 0xff).toString(16)}`);\r\n }\r\n }\r\n\r\n // --- Primitive readers ---\r\n\r\n private readUInt8(): number {\r\n return this.buffer[this.offset++];\r\n }\r\n\r\n private readUInt32(): number {\r\n const value =\r\n this.buffer[this.offset] |\r\n (this.buffer[this.offset + 1] << 8) |\r\n (this.buffer[this.offset + 2] << 16) |\r\n (this.buffer[this.offset + 3] << 24);\r\n this.offset += 4;\r\n return value >>> 0;\r\n }\r\n\r\n private readVarUInt1(): number {\r\n return this.buffer[this.offset++] & 1;\r\n }\r\n\r\n private readVarUInt7(): number {\r\n return this.buffer[this.offset++] & 0x7f;\r\n }\r\n\r\n private readVarUInt32(): number {\r\n let result = 0;\r\n let shift = 0;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= (byte & 0x7f) << shift;\r\n shift += 7;\r\n } while (byte & 0x80);\r\n return result >>> 0;\r\n }\r\n\r\n private readVarInt7(): number {\r\n const byte = this.buffer[this.offset++];\r\n return byte & 0x40 ? byte | 0xffffff80 : byte & 0x7f;\r\n }\r\n\r\n private readVarInt32(): number {\r\n let result = 0;\r\n let shift = 0;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= (byte & 0x7f) << shift;\r\n shift += 7;\r\n } while (byte & 0x80);\r\n if (shift < 32 && byte & 0x40) {\r\n result |= -(1 << shift);\r\n }\r\n return result;\r\n }\r\n\r\n private readVarInt64(): bigint {\r\n let result = 0n;\r\n let shift = 0n;\r\n let byte: number;\r\n do {\r\n byte = this.buffer[this.offset++];\r\n result |= BigInt(byte & 0x7f) << shift;\r\n shift += 7n;\r\n } while (byte & 0x80);\r\n if (shift < 64n && byte & 0x40) {\r\n result |= -(1n << shift);\r\n }\r\n return result;\r\n }\r\n\r\n private readString(length: number): string {\r\n const bytes = this.buffer.slice(this.offset, this.offset + length);\r\n this.offset += length;\r\n return new TextDecoder().decode(bytes);\r\n }\r\n\r\n private readBytes(length: number): Uint8Array {\r\n const bytes = this.buffer.slice(this.offset, this.offset + length);\r\n this.offset += length;\r\n return bytes;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { SectionType, SectionTypeDescriptor } from './types';\r\n\r\nexport default class CustomSectionBuilder {\r\n name: string;\r\n type: SectionTypeDescriptor;\r\n _data: Uint8Array;\r\n\r\n constructor(name: string, data?: Uint8Array) {\r\n this.name = name;\r\n this.type = SectionType.createCustom(name);\r\n this._data = data || new Uint8Array(0);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n const sectionWriter = new BinaryWriter();\r\n sectionWriter.writeVarUInt32(this.name.length);\r\n sectionWriter.writeString(this.name);\r\n if (this._data.length > 0) {\r\n sectionWriter.writeBytes(this._data);\r\n }\r\n\r\n writer.writeVarUInt7(0); // custom section id\r\n writer.writeVarUInt32(sectionWriter.length);\r\n writer.writeBytes(sectionWriter);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FunctionParameterBuilder {\r\n name: string | null;\r\n valueType: ValueTypeDescriptor;\r\n index: number;\r\n\r\n constructor(valueType: ValueTypeDescriptor, index: number) {\r\n this.name = null;\r\n this.valueType = valueType;\r\n this.index = index;\r\n }\r\n\r\n withName(name: string): this {\r\n this.name = name;\r\n return this;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class LocalBuilder {\r\n index: number;\r\n valueType: ValueTypeDescriptor;\r\n name: string | null;\r\n count: number;\r\n\r\n constructor(valueType: ValueTypeDescriptor, name: string | null, index: number, count: number) {\r\n this.index = index;\r\n this.valueType = valueType;\r\n this.name = name;\r\n this.count = count;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.count);\r\n writer.writeVarInt7(this.valueType.value);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class GlobalType {\r\n private _valueType: ValueTypeDescriptor;\r\n private _mutable: boolean;\r\n\r\n constructor(valueType: ValueTypeDescriptor, mutable: boolean) {\r\n this._valueType = valueType;\r\n this._mutable = mutable;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n return this._valueType;\r\n }\r\n\r\n get mutable(): boolean {\r\n return this._mutable;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarInt7(this._valueType.value);\r\n writer.writeVarUInt1(this._mutable ? 1 : 0);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import GlobalType from './GlobalType';\r\nimport { InitExpressionType, ValueType, ValueTypeDescriptor } from './types';\r\nimport InitExpressionEmitter from './InitExpressionEmitter';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class GlobalBuilder {\r\n _globalType: GlobalType;\r\n _index: number;\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n _moduleBuilder: ModuleBuilder;\r\n name: string | null = null;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._globalType = new GlobalType(valueType, mutable);\r\n this._index = index;\r\n }\r\n\r\n withName(name: string): this {\r\n this.name = name;\r\n return this;\r\n }\r\n\r\n get globalType(): GlobalType {\r\n return this._globalType;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n return this._globalType.valueType;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Global,\r\n this.valueType,\r\n this._moduleBuilder.features\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n value(value: number | bigint | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number' || typeof value === 'bigint') {\r\n this.createInitEmitter((asm) => {\r\n const vt = this.valueType;\r\n if (vt === ValueType.Int32) {\r\n asm.const_i32(Number(value));\r\n } else if (vt === ValueType.Int64) {\r\n asm.const_i64(BigInt(value));\r\n } else if (vt === ValueType.Float32) {\r\n asm.const_f32(Number(value));\r\n } else if (vt === ValueType.Float64) {\r\n asm.const_f64(Number(value));\r\n } else {\r\n throw new Error(`Unsupported global value type: ${vt.name}`);\r\n }\r\n });\r\n } else {\r\n throw new Error('Unsupported global value.');\r\n }\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportGlobal(this, name);\r\n return this;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n this._globalType.write(writer);\r\n this._initExpressionEmitter.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ExternalKind, ExternalKindType } from './types';\r\nimport GlobalType from './GlobalType';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport MemoryType from './MemoryType';\r\nimport TableType from './TableType';\r\n\r\nexport default class ImportBuilder {\r\n moduleName: string;\r\n fieldName: string;\r\n externalKind: ExternalKindType;\r\n data: FuncTypeBuilder | GlobalType | MemoryType | TableType;\r\n index: number;\r\n\r\n constructor(\r\n moduleName: string,\r\n fieldName: string,\r\n externalKind: ExternalKindType,\r\n data: FuncTypeBuilder | GlobalType | MemoryType | TableType,\r\n index: number\r\n ) {\r\n this.moduleName = moduleName;\r\n this.fieldName = fieldName;\r\n this.externalKind = externalKind;\r\n this.data = data;\r\n this.index = index;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.moduleName.length);\r\n writer.writeString(this.moduleName);\r\n writer.writeVarUInt32(this.fieldName.length);\r\n writer.writeString(this.fieldName);\r\n writer.writeUInt8(this.externalKind.value);\r\n switch (this.externalKind) {\r\n case ExternalKind.Function:\r\n writer.writeVarUInt32((this.data as FuncTypeBuilder).index);\r\n break;\r\n\r\n case ExternalKind.Global:\r\n case ExternalKind.Memory:\r\n case ExternalKind.Table:\r\n (this.data as GlobalType | MemoryType | TableType).write(writer);\r\n break;\r\n\r\n default:\r\n throw new Error('Unknown external kind.');\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport { ExternalKind, BlockTypeDescriptor } from './types';\r\n\r\nexport default class ImmediateEncoder {\r\n static encodeBlockSignature(writer: BinaryWriter, blockType: BlockTypeDescriptor): void {\r\n writer.writeVarInt7(blockType.value);\r\n }\r\n\r\n static encodeRelativeDepth(writer: BinaryWriter, label: any, depth: number): void {\r\n const relativeDepth = depth - label.block.depth;\r\n writer.writeVarInt7(relativeDepth);\r\n }\r\n\r\n static encodeBranchTable(\r\n writer: BinaryWriter,\r\n defaultLabel: number,\r\n labels: number[]\r\n ): void {\r\n writer.writeVarUInt32(labels.length);\r\n labels.forEach((x) => {\r\n writer.writeVarUInt32(x);\r\n });\r\n writer.writeVarUInt32(defaultLabel);\r\n }\r\n\r\n static encodeFunction(writer: BinaryWriter, func: FunctionBuilder | ImportBuilder | number): void {\r\n let functionIndex = 0;\r\n if (func instanceof ImportBuilder) {\r\n functionIndex = func.index;\r\n } else if (typeof func === 'object' && func !== null && '_index' in func) {\r\n functionIndex = (func as FunctionBuilder)._index;\r\n } else if (typeof func === 'number') {\r\n functionIndex = func;\r\n } else {\r\n throw new Error(\r\n 'Function argument must either be the index of the function or a FunctionBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(functionIndex);\r\n }\r\n\r\n static encodeIndirectFunction(writer: BinaryWriter, funcType: FuncTypeBuilder): void {\r\n writer.writeVarUInt32(funcType.index);\r\n writer.writeVarUInt1(0);\r\n }\r\n\r\n static encodeLocal(\r\n writer: BinaryWriter,\r\n local: LocalBuilder | FunctionParameterBuilder | number\r\n ): void {\r\n Arg.notNull('local', local);\r\n\r\n let localIndex = 0;\r\n if (local instanceof LocalBuilder) {\r\n localIndex = local.index;\r\n } else if (local instanceof FunctionParameterBuilder) {\r\n localIndex = local.index;\r\n } else if (typeof local === 'number') {\r\n localIndex = local;\r\n } else {\r\n throw new Error(\r\n 'Local argument must either be the index of the local variable or a LocalBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(localIndex);\r\n }\r\n\r\n static encodeGlobal(\r\n writer: BinaryWriter,\r\n global: GlobalBuilder | ImportBuilder | number\r\n ): void {\r\n Arg.notNull('global', global);\r\n\r\n let globalIndex = 0;\r\n if (global instanceof GlobalBuilder) {\r\n globalIndex = global._index;\r\n } else if (global instanceof ImportBuilder) {\r\n if (global.externalKind !== ExternalKind.Global) {\r\n throw new Error('Import external kind must be global.');\r\n }\r\n globalIndex = global.index;\r\n } else if (typeof global === 'number') {\r\n globalIndex = global;\r\n } else {\r\n throw new Error(\r\n 'Global argument must either be the index of the global variable, GlobalBuilder, or an ImportBuilder.'\r\n );\r\n }\r\n\r\n writer.writeVarUInt32(globalIndex);\r\n }\r\n\r\n static encodeFloat32(writer: BinaryWriter, value: number): void {\r\n writer.writeFloat32(value);\r\n }\r\n\r\n static encodeFloat64(writer: BinaryWriter, value: number): void {\r\n writer.writeFloat64(value);\r\n }\r\n\r\n static encodeVarInt32(writer: BinaryWriter, value: number): void {\r\n writer.writeVarInt32(value);\r\n }\r\n\r\n static encodeVarInt64(writer: BinaryWriter, value: number | bigint): void {\r\n writer.writeVarInt64(value);\r\n }\r\n\r\n static encodeVarUInt32(writer: BinaryWriter, value: number): void {\r\n writer.writeVarUInt32(value);\r\n }\r\n\r\n static encodeVarUInt1(writer: BinaryWriter, value: number): void {\r\n writer.writeVarUInt1(value);\r\n }\r\n\r\n static encodeMemoryImmediate(\r\n writer: BinaryWriter,\r\n alignment: number,\r\n offset: number\r\n ): void {\r\n writer.writeVarUInt32(alignment);\r\n writer.writeVarUInt32(offset);\r\n }\r\n\r\n static encodeV128Const(writer: BinaryWriter, bytes: Uint8Array): void {\r\n for (let i = 0; i < 16; i++) {\r\n writer.writeByte(bytes[i]);\r\n }\r\n }\r\n\r\n static encodeLaneIndex(writer: BinaryWriter, index: number): void {\r\n writer.writeByte(index);\r\n }\r\n\r\n static encodeShuffleMask(writer: BinaryWriter, mask: Uint8Array): void {\r\n for (let i = 0; i < 16; i++) {\r\n writer.writeByte(mask[i]);\r\n }\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport { ImmediateType } from './types';\r\nimport ImmediateEncoder from './ImmediateEncoder';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class Immediate {\r\n type: ImmediateType;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n values: any[];\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n constructor(type: ImmediateType, values: any[]) {\r\n Arg.notNull('type', type);\r\n Arg.notNull('values', values);\r\n this.type = type;\r\n this.values = values;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createBlockSignature(blockType: any): Immediate {\r\n return new Immediate(ImmediateType.BlockSignature, [blockType]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createBranchTable(defaultLabel: any, labels: any[], depth: number): Immediate {\r\n const relativeDepths = labels.map((x) => {\r\n return depth - x.block.depth;\r\n });\r\n const defaultLabelDepth = depth - defaultLabel.block.depth;\r\n return new Immediate(ImmediateType.BranchTable, [defaultLabelDepth, relativeDepths]);\r\n }\r\n\r\n static createFloat32(value: number): Immediate {\r\n return new Immediate(ImmediateType.Float32, [value]);\r\n }\r\n\r\n static createFloat64(value: number): Immediate {\r\n return new Immediate(ImmediateType.Float64, [value]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createFunction(functionBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.Function, [functionBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createGlobal(globalBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.Global, [globalBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createIndirectFunction(functionTypeBuilder: any): Immediate {\r\n return new Immediate(ImmediateType.IndirectFunction, [functionTypeBuilder]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createLocal(local: any): Immediate {\r\n return new Immediate(ImmediateType.Local, [local]);\r\n }\r\n\r\n static createMemoryImmediate(alignment: number, offset: number): Immediate {\r\n return new Immediate(ImmediateType.MemoryImmediate, [alignment, offset]);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n static createRelativeDepth(label: any, depth: number): Immediate {\r\n return new Immediate(ImmediateType.RelativeDepth, [label, depth]);\r\n }\r\n\r\n static createVarUInt1(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarUInt1, [value]);\r\n }\r\n\r\n static createVarInt32(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarInt32, [value]);\r\n }\r\n\r\n static createVarInt64(value: number | bigint): Immediate {\r\n return new Immediate(ImmediateType.VarInt64, [value]);\r\n }\r\n\r\n static createVarUInt32(value: number): Immediate {\r\n return new Immediate(ImmediateType.VarUInt32, [value]);\r\n }\r\n\r\n static createV128Const(bytes: Uint8Array): Immediate {\r\n if (bytes.length !== 16) {\r\n throw new Error('V128 constant must be exactly 16 bytes.');\r\n }\r\n return new Immediate(ImmediateType.V128Const, [bytes]);\r\n }\r\n\r\n static createLaneIndex(index: number): Immediate {\r\n return new Immediate(ImmediateType.LaneIndex, [index]);\r\n }\r\n\r\n static createShuffleMask(mask: Uint8Array): Immediate {\r\n if (mask.length !== 16) {\r\n throw new Error('Shuffle mask must be exactly 16 bytes.');\r\n }\r\n return new Immediate(ImmediateType.ShuffleMask, [mask]);\r\n }\r\n\r\n writeBytes(writer: BinaryWriter): void {\r\n switch (this.type) {\r\n case ImmediateType.BlockSignature:\r\n ImmediateEncoder.encodeBlockSignature(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.BranchTable:\r\n ImmediateEncoder.encodeBranchTable(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.Float32:\r\n ImmediateEncoder.encodeFloat32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Float64:\r\n ImmediateEncoder.encodeFloat64(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Function:\r\n ImmediateEncoder.encodeFunction(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Global:\r\n ImmediateEncoder.encodeGlobal(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.IndirectFunction:\r\n ImmediateEncoder.encodeIndirectFunction(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.Local:\r\n ImmediateEncoder.encodeLocal(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.MemoryImmediate:\r\n ImmediateEncoder.encodeMemoryImmediate(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.RelativeDepth:\r\n ImmediateEncoder.encodeRelativeDepth(writer, this.values[0], this.values[1]);\r\n break;\r\n\r\n case ImmediateType.VarInt32:\r\n ImmediateEncoder.encodeVarInt32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarInt64:\r\n ImmediateEncoder.encodeVarInt64(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarUInt1:\r\n ImmediateEncoder.encodeVarUInt1(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.VarUInt32:\r\n ImmediateEncoder.encodeVarUInt32(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.V128Const:\r\n ImmediateEncoder.encodeV128Const(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.LaneIndex:\r\n ImmediateEncoder.encodeLaneIndex(writer, this.values[0]);\r\n break;\r\n\r\n case ImmediateType.ShuffleMask:\r\n ImmediateEncoder.encodeShuffleMask(writer, this.values[0]);\r\n break;\r\n\r\n default:\r\n throw new Error('Cannot encode unknown operand type.');\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.writeBytes(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport Immediate from './Immediate';\r\nimport { OpCodeDef } from './types';\r\n\r\nexport default class Instruction {\r\n opCode: OpCodeDef;\r\n immediate: Immediate | null;\r\n\r\n constructor(opCode: OpCodeDef, immediate: Immediate | null) {\r\n Arg.notNull('opCode', opCode);\r\n this.opCode = opCode;\r\n this.immediate = immediate;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (this.opCode.prefix !== undefined) {\r\n writer.writeByte(this.opCode.prefix);\r\n writer.writeVarUInt32(this.opCode.value);\r\n } else {\r\n writer.writeByte(this.opCode.value);\r\n }\r\n if (this.immediate) {\r\n this.immediate.writeBytes(writer);\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import type ControlFlowBlock from './verification/ControlFlowBlock';\r\n\r\nexport default class LabelBuilder {\r\n resolved: boolean;\r\n block: ControlFlowBlock | null;\r\n\r\n constructor() {\r\n this.resolved = false;\r\n this.block = null;\r\n }\r\n\r\n get isResolved(): boolean {\r\n return this.resolved;\r\n }\r\n\r\n resolve(block: ControlFlowBlock): void {\r\n this.block = block;\r\n this.resolved = true;\r\n }\r\n\r\n reference(block: ControlFlowBlock): void {\r\n if (this.isResolved) {\r\n throw new Error('Cannot add a reference to a label that has been resolved.');\r\n }\r\n this.block = block;\r\n }\r\n}\r\n", "import OpCodes from './OpCodes';\n\nexport default abstract class OpCodeEmitter {\n unreachable(): any {\n return this.emit(OpCodes.unreachable);\n }\n\n nop(): any {\n return this.emit(OpCodes.nop);\n }\n\n block(blockType: any, label?: any): any {\n return this.emit(OpCodes.block, blockType, label);\n }\n\n loop(blockType: any, label?: any): any {\n return this.emit(OpCodes.loop, blockType, label);\n }\n\n if(blockType: any, label?: any): any {\n return this.emit(OpCodes.if, blockType, label);\n }\n\n else(): any {\n return this.emit(OpCodes.else);\n }\n\n try(blockType: any, label?: any): any {\n return this.emit(OpCodes.try, blockType, label);\n }\n\n catch(varUInt32: number): any {\n return this.emit(OpCodes.catch, varUInt32);\n }\n\n throw(varUInt32: number): any {\n return this.emit(OpCodes.throw, varUInt32);\n }\n\n rethrow(varUInt32: number): any {\n return this.emit(OpCodes.rethrow, varUInt32);\n }\n\n end(): any {\n return this.emit(OpCodes.end);\n }\n\n br(labelBuilder: any): any {\n return this.emit(OpCodes.br, labelBuilder);\n }\n\n br_if(labelBuilder: any): any {\n return this.emit(OpCodes.br_if, labelBuilder);\n }\n\n br_table(defaultLabelBuilder: any, ...labelBuilders: any[]): any {\n return this.emit(OpCodes.br_table, defaultLabelBuilder, labelBuilders);\n }\n\n return(): any {\n return this.emit(OpCodes.return);\n }\n\n call(functionBuilder: any): any {\n return this.emit(OpCodes.call, functionBuilder);\n }\n\n call_indirect(funcTypeBuilder: any): any {\n return this.emit(OpCodes.call_indirect, funcTypeBuilder);\n }\n\n return_call(functionBuilder: any): any {\n return this.emit(OpCodes.return_call, functionBuilder);\n }\n\n return_call_indirect(funcTypeBuilder: any): any {\n return this.emit(OpCodes.return_call_indirect, funcTypeBuilder);\n }\n\n delegate(varUInt32: number): any {\n return this.emit(OpCodes.delegate, varUInt32);\n }\n\n catch_all(): any {\n return this.emit(OpCodes.catch_all);\n }\n\n drop(): any {\n return this.emit(OpCodes.drop);\n }\n\n select(): any {\n return this.emit(OpCodes.select);\n }\n\n get_local(local: any): any {\n return this.emit(OpCodes.get_local, local);\n }\n\n set_local(local: any): any {\n return this.emit(OpCodes.set_local, local);\n }\n\n tee_local(local: any): any {\n return this.emit(OpCodes.tee_local, local);\n }\n\n get_global(global: any): any {\n return this.emit(OpCodes.get_global, global);\n }\n\n set_global(global: any): any {\n return this.emit(OpCodes.set_global, global);\n }\n\n load_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load, alignment, offset);\n }\n\n load_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load, alignment, offset);\n }\n\n load_f32(alignment: number, offset: number): any {\n return this.emit(OpCodes.f32_load, alignment, offset);\n }\n\n load_f64(alignment: number, offset: number): any {\n return this.emit(OpCodes.f64_load, alignment, offset);\n }\n\n load8_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load8_s, alignment, offset);\n }\n\n load8_i32_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load8_u, alignment, offset);\n }\n\n load16_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load16_s, alignment, offset);\n }\n\n load16_i32_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_load16_u, alignment, offset);\n }\n\n load8_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load8_s, alignment, offset);\n }\n\n load8_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load8_u, alignment, offset);\n }\n\n load16_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load16_s, alignment, offset);\n }\n\n load16_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load16_u, alignment, offset);\n }\n\n load32_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load32_s, alignment, offset);\n }\n\n load32_i64_u(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_load32_u, alignment, offset);\n }\n\n store_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store, alignment, offset);\n }\n\n store_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store, alignment, offset);\n }\n\n store_f32(alignment: number, offset: number): any {\n return this.emit(OpCodes.f32_store, alignment, offset);\n }\n\n store_f64(alignment: number, offset: number): any {\n return this.emit(OpCodes.f64_store, alignment, offset);\n }\n\n store8_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store8, alignment, offset);\n }\n\n store16_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_store16, alignment, offset);\n }\n\n store8_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store8, alignment, offset);\n }\n\n store16_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store16, alignment, offset);\n }\n\n store32_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_store32, alignment, offset);\n }\n\n mem_size(varUInt1: number): any {\n return this.emit(OpCodes.mem_size, varUInt1);\n }\n\n mem_grow(varUInt1: number): any {\n return this.emit(OpCodes.mem_grow, varUInt1);\n }\n\n const_i32(varInt32: number): any {\n return this.emit(OpCodes.i32_const, varInt32);\n }\n\n const_i64(varInt64: number | bigint): any {\n return this.emit(OpCodes.i64_const, varInt64);\n }\n\n const_f32(float32: number): any {\n return this.emit(OpCodes.f32_const, float32);\n }\n\n const_f64(float64: number): any {\n return this.emit(OpCodes.f64_const, float64);\n }\n\n eqz_i32(): any {\n return this.emit(OpCodes.i32_eqz);\n }\n\n eq_i32(): any {\n return this.emit(OpCodes.i32_eq);\n }\n\n ne_i32(): any {\n return this.emit(OpCodes.i32_ne);\n }\n\n lt_i32(): any {\n return this.emit(OpCodes.i32_lt_s);\n }\n\n lt_i32_u(): any {\n return this.emit(OpCodes.i32_lt_u);\n }\n\n gt_i32(): any {\n return this.emit(OpCodes.i32_gt_s);\n }\n\n gt_i32_u(): any {\n return this.emit(OpCodes.i32_gt_u);\n }\n\n le_i32(): any {\n return this.emit(OpCodes.i32_le_s);\n }\n\n le_i32_u(): any {\n return this.emit(OpCodes.i32_le_u);\n }\n\n ge_i32(): any {\n return this.emit(OpCodes.i32_ge_s);\n }\n\n ge_i32_u(): any {\n return this.emit(OpCodes.i32_ge_u);\n }\n\n eqz_i64(): any {\n return this.emit(OpCodes.i64_eqz);\n }\n\n eq_i64(): any {\n return this.emit(OpCodes.i64_eq);\n }\n\n ne_i64(): any {\n return this.emit(OpCodes.i64_ne);\n }\n\n lt_i64(): any {\n return this.emit(OpCodes.i64_lt_s);\n }\n\n lt_i64_u(): any {\n return this.emit(OpCodes.i64_lt_u);\n }\n\n gt_i64(): any {\n return this.emit(OpCodes.i64_gt_s);\n }\n\n gt_i64_u(): any {\n return this.emit(OpCodes.i64_gt_u);\n }\n\n le_i64(): any {\n return this.emit(OpCodes.i64_le_s);\n }\n\n le_i64_u(): any {\n return this.emit(OpCodes.i64_le_u);\n }\n\n ge_i64(): any {\n return this.emit(OpCodes.i64_ge_s);\n }\n\n ge_i64_u(): any {\n return this.emit(OpCodes.i64_ge_u);\n }\n\n eq_f32(): any {\n return this.emit(OpCodes.f32_eq);\n }\n\n ne_f32(): any {\n return this.emit(OpCodes.f32_ne);\n }\n\n lt_f32(): any {\n return this.emit(OpCodes.f32_lt);\n }\n\n gt_f32(): any {\n return this.emit(OpCodes.f32_gt);\n }\n\n le_f32(): any {\n return this.emit(OpCodes.f32_le);\n }\n\n ge_f32(): any {\n return this.emit(OpCodes.f32_ge);\n }\n\n eq_f64(): any {\n return this.emit(OpCodes.f64_eq);\n }\n\n ne_f64(): any {\n return this.emit(OpCodes.f64_ne);\n }\n\n lt_f64(): any {\n return this.emit(OpCodes.f64_lt);\n }\n\n gt_f64(): any {\n return this.emit(OpCodes.f64_gt);\n }\n\n le_f64(): any {\n return this.emit(OpCodes.f64_le);\n }\n\n ge_f64(): any {\n return this.emit(OpCodes.f64_ge);\n }\n\n clz_i32(): any {\n return this.emit(OpCodes.i32_clz);\n }\n\n ctz_i32(): any {\n return this.emit(OpCodes.i32_ctz);\n }\n\n popcnt_i32(): any {\n return this.emit(OpCodes.i32_popcnt);\n }\n\n add_i32(): any {\n return this.emit(OpCodes.i32_add);\n }\n\n sub_i32(): any {\n return this.emit(OpCodes.i32_sub);\n }\n\n mul_i32(): any {\n return this.emit(OpCodes.i32_mul);\n }\n\n div_i32(): any {\n return this.emit(OpCodes.i32_div_s);\n }\n\n div_i32_u(): any {\n return this.emit(OpCodes.i32_div_u);\n }\n\n rem_i32(): any {\n return this.emit(OpCodes.i32_rem_s);\n }\n\n rem_i32_u(): any {\n return this.emit(OpCodes.i32_rem_u);\n }\n\n and_i32(): any {\n return this.emit(OpCodes.i32_and);\n }\n\n or_i32(): any {\n return this.emit(OpCodes.i32_or);\n }\n\n xor_i32(): any {\n return this.emit(OpCodes.i32_xor);\n }\n\n shl_i32(): any {\n return this.emit(OpCodes.i32_shl);\n }\n\n shr_i32(): any {\n return this.emit(OpCodes.i32_shr_s);\n }\n\n shr_i32_u(): any {\n return this.emit(OpCodes.i32_shr_u);\n }\n\n rotl_i32(): any {\n return this.emit(OpCodes.i32_rotl);\n }\n\n rotr_i32(): any {\n return this.emit(OpCodes.i32_rotr);\n }\n\n clz_i64(): any {\n return this.emit(OpCodes.i64_clz);\n }\n\n ctz_i64(): any {\n return this.emit(OpCodes.i64_ctz);\n }\n\n popcnt_i64(): any {\n return this.emit(OpCodes.i64_popcnt);\n }\n\n add_i64(): any {\n return this.emit(OpCodes.i64_add);\n }\n\n sub_i64(): any {\n return this.emit(OpCodes.i64_sub);\n }\n\n mul_i64(): any {\n return this.emit(OpCodes.i64_mul);\n }\n\n div_i64(): any {\n return this.emit(OpCodes.i64_div_s);\n }\n\n div_i64_u(): any {\n return this.emit(OpCodes.i64_div_u);\n }\n\n rem_i64(): any {\n return this.emit(OpCodes.i64_rem_s);\n }\n\n rem_i64_u(): any {\n return this.emit(OpCodes.i64_rem_u);\n }\n\n and_i64(): any {\n return this.emit(OpCodes.i64_and);\n }\n\n or_i64(): any {\n return this.emit(OpCodes.i64_or);\n }\n\n xor_i64(): any {\n return this.emit(OpCodes.i64_xor);\n }\n\n shl_i64(): any {\n return this.emit(OpCodes.i64_shl);\n }\n\n shr_i64(): any {\n return this.emit(OpCodes.i64_shr_s);\n }\n\n shr_i64_u(): any {\n return this.emit(OpCodes.i64_shr_u);\n }\n\n rotl_i64(): any {\n return this.emit(OpCodes.i64_rotl);\n }\n\n rotr_i64(): any {\n return this.emit(OpCodes.i64_rotr);\n }\n\n abs_f32(): any {\n return this.emit(OpCodes.f32_abs);\n }\n\n neg_f32(): any {\n return this.emit(OpCodes.f32_neg);\n }\n\n ceil_f32(): any {\n return this.emit(OpCodes.f32_ceil);\n }\n\n floor_f32(): any {\n return this.emit(OpCodes.f32_floor);\n }\n\n trunc_f32(): any {\n return this.emit(OpCodes.f32_trunc);\n }\n\n nearest_f32(): any {\n return this.emit(OpCodes.f32_nearest);\n }\n\n sqrt_f32(): any {\n return this.emit(OpCodes.f32_sqrt);\n }\n\n add_f32(): any {\n return this.emit(OpCodes.f32_add);\n }\n\n sub_f32(): any {\n return this.emit(OpCodes.f32_sub);\n }\n\n mul_f32(): any {\n return this.emit(OpCodes.f32_mul);\n }\n\n div_f32(): any {\n return this.emit(OpCodes.f32_div);\n }\n\n min_f32(): any {\n return this.emit(OpCodes.f32_min);\n }\n\n max_f32(): any {\n return this.emit(OpCodes.f32_max);\n }\n\n copysign_f32(): any {\n return this.emit(OpCodes.f32_copysign);\n }\n\n abs_f64(): any {\n return this.emit(OpCodes.f64_abs);\n }\n\n neg_f64(): any {\n return this.emit(OpCodes.f64_neg);\n }\n\n ceil_f64(): any {\n return this.emit(OpCodes.f64_ceil);\n }\n\n floor_f64(): any {\n return this.emit(OpCodes.f64_floor);\n }\n\n trunc_f64(): any {\n return this.emit(OpCodes.f64_trunc);\n }\n\n nearest_f64(): any {\n return this.emit(OpCodes.f64_nearest);\n }\n\n sqrt_f64(): any {\n return this.emit(OpCodes.f64_sqrt);\n }\n\n add_f64(): any {\n return this.emit(OpCodes.f64_add);\n }\n\n sub_f64(): any {\n return this.emit(OpCodes.f64_sub);\n }\n\n mul_f64(): any {\n return this.emit(OpCodes.f64_mul);\n }\n\n div_f64(): any {\n return this.emit(OpCodes.f64_div);\n }\n\n min_f64(): any {\n return this.emit(OpCodes.f64_min);\n }\n\n max_f64(): any {\n return this.emit(OpCodes.f64_max);\n }\n\n copysign_f64(): any {\n return this.emit(OpCodes.f64_copysign);\n }\n\n wrap_i64_i32(): any {\n return this.emit(OpCodes.i32_wrap_i64);\n }\n\n trunc_f32_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_f32_s);\n }\n\n trunc_f32_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_f32_u);\n }\n\n trunc_f64_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_f64_s);\n }\n\n trunc_f64_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_f64_u);\n }\n\n extend_i32_s_i64(): any {\n return this.emit(OpCodes.i64_extend_i32_s);\n }\n\n extend_i32_u_i64(): any {\n return this.emit(OpCodes.i64_extend_i32_u);\n }\n\n trunc_f32_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_f32_s);\n }\n\n trunc_f32_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_f32_u);\n }\n\n trunc_f64_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_f64_s);\n }\n\n trunc_f64_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_f64_u);\n }\n\n convert_i32_s_f32(): any {\n return this.emit(OpCodes.f32_convert_i32_s);\n }\n\n convert_i32_u_f32(): any {\n return this.emit(OpCodes.f32_convert_i32_u);\n }\n\n convert_i64_s_f32(): any {\n return this.emit(OpCodes.f32_convert_i64_s);\n }\n\n convert_i64_u_f32(): any {\n return this.emit(OpCodes.f32_convert_i64_u);\n }\n\n demote_f64_f32(): any {\n return this.emit(OpCodes.f32_demote_f64);\n }\n\n convert_i32_s_f64(): any {\n return this.emit(OpCodes.f64_convert_i32_s);\n }\n\n convert_i32_u_f64(): any {\n return this.emit(OpCodes.f64_convert_i32_u);\n }\n\n convert_i64_s_f64(): any {\n return this.emit(OpCodes.f64_convert_i64_s);\n }\n\n convert_i64_u_f64(): any {\n return this.emit(OpCodes.f64_convert_i64_u);\n }\n\n promote_f32_f64(): any {\n return this.emit(OpCodes.f64_promote_f32);\n }\n\n reinterpret_f32_i32(): any {\n return this.emit(OpCodes.i32_reinterpret_f32);\n }\n\n reinterpret_f64_i64(): any {\n return this.emit(OpCodes.i64_reinterpret_f64);\n }\n\n reinterpret_i32_f32(): any {\n return this.emit(OpCodes.f32_reinterpret_i32);\n }\n\n reinterpret_i64_f64(): any {\n return this.emit(OpCodes.f64_reinterpret_i64);\n }\n\n extend8_s_i32(): any {\n return this.emit(OpCodes.i32_extend8_s);\n }\n\n extend16_s_i32(): any {\n return this.emit(OpCodes.i32_extend16_s);\n }\n\n extend8_s_i64(): any {\n return this.emit(OpCodes.i64_extend8_s);\n }\n\n extend16_s_i64(): any {\n return this.emit(OpCodes.i64_extend16_s);\n }\n\n extend32_s_i64(): any {\n return this.emit(OpCodes.i64_extend32_s);\n }\n\n trunc_sat_f32_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f32_s);\n }\n\n trunc_sat_f32_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f32_u);\n }\n\n trunc_sat_f64_s_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f64_s);\n }\n\n trunc_sat_f64_u_i32(): any {\n return this.emit(OpCodes.i32_trunc_sat_f64_u);\n }\n\n trunc_sat_f32_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f32_s);\n }\n\n trunc_sat_f32_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f32_u);\n }\n\n trunc_sat_f64_s_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f64_s);\n }\n\n trunc_sat_f64_u_i64(): any {\n return this.emit(OpCodes.i64_trunc_sat_f64_u);\n }\n\n memory_init(alignment: number, offset: number): any {\n return this.emit(OpCodes.memory_init, alignment, offset);\n }\n\n data_drop(varUInt32: number): any {\n return this.emit(OpCodes.data_drop, varUInt32);\n }\n\n memory_copy(alignment: number, offset: number): any {\n return this.emit(OpCodes.memory_copy, alignment, offset);\n }\n\n memory_fill(varUInt1: number): any {\n return this.emit(OpCodes.memory_fill, varUInt1);\n }\n\n table_init(alignment: number, offset: number): any {\n return this.emit(OpCodes.table_init, alignment, offset);\n }\n\n elem_drop(varUInt32: number): any {\n return this.emit(OpCodes.elem_drop, varUInt32);\n }\n\n table_copy(alignment: number, offset: number): any {\n return this.emit(OpCodes.table_copy, alignment, offset);\n }\n\n table_grow(varUInt32: number): any {\n return this.emit(OpCodes.table_grow, varUInt32);\n }\n\n table_size(varUInt32: number): any {\n return this.emit(OpCodes.table_size, varUInt32);\n }\n\n table_fill(varUInt32: number): any {\n return this.emit(OpCodes.table_fill, varUInt32);\n }\n\n ref_null(varUInt32: number): any {\n return this.emit(OpCodes.ref_null, varUInt32);\n }\n\n ref_is_null(): any {\n return this.emit(OpCodes.ref_is_null);\n }\n\n ref_func(functionBuilder: any): any {\n return this.emit(OpCodes.ref_func, functionBuilder);\n }\n\n table_get(varUInt32: number): any {\n return this.emit(OpCodes.table_get, varUInt32);\n }\n\n table_set(varUInt32: number): any {\n return this.emit(OpCodes.table_set, varUInt32);\n }\n\n load_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load, alignment, offset);\n }\n\n load8x8_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8x8_s, alignment, offset);\n }\n\n load8x8_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8x8_u, alignment, offset);\n }\n\n load16x4_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16x4_s, alignment, offset);\n }\n\n load16x4_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16x4_u, alignment, offset);\n }\n\n load32x2_s_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32x2_s, alignment, offset);\n }\n\n load32x2_u_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32x2_u, alignment, offset);\n }\n\n load8_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8_splat, alignment, offset);\n }\n\n load16_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16_splat, alignment, offset);\n }\n\n load32_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_splat, alignment, offset);\n }\n\n load64_splat_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_splat, alignment, offset);\n }\n\n store_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store, alignment, offset);\n }\n\n const_v128(bytes: Uint8Array): any {\n return this.emit(OpCodes.v128_const, bytes);\n }\n\n shuffle_i8x16(mask: Uint8Array): any {\n return this.emit(OpCodes.i8x16_shuffle, mask);\n }\n\n swizzle_i8x16(): any {\n return this.emit(OpCodes.i8x16_swizzle);\n }\n\n splat_i8x16(): any {\n return this.emit(OpCodes.i8x16_splat);\n }\n\n splat_i16x8(): any {\n return this.emit(OpCodes.i16x8_splat);\n }\n\n splat_i32x4(): any {\n return this.emit(OpCodes.i32x4_splat);\n }\n\n splat_i64x2(): any {\n return this.emit(OpCodes.i64x2_splat);\n }\n\n splat_f32x4(): any {\n return this.emit(OpCodes.f32x4_splat);\n }\n\n splat_f64x2(): any {\n return this.emit(OpCodes.f64x2_splat);\n }\n\n extract_lane_s_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_extract_lane_s, laneIndex);\n }\n\n extract_lane_u_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_extract_lane_u, laneIndex);\n }\n\n replace_lane_i8x16(laneIndex: number): any {\n return this.emit(OpCodes.i8x16_replace_lane, laneIndex);\n }\n\n extract_lane_s_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_extract_lane_s, laneIndex);\n }\n\n extract_lane_u_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_extract_lane_u, laneIndex);\n }\n\n replace_lane_i16x8(laneIndex: number): any {\n return this.emit(OpCodes.i16x8_replace_lane, laneIndex);\n }\n\n extract_lane_i32x4(laneIndex: number): any {\n return this.emit(OpCodes.i32x4_extract_lane, laneIndex);\n }\n\n replace_lane_i32x4(laneIndex: number): any {\n return this.emit(OpCodes.i32x4_replace_lane, laneIndex);\n }\n\n extract_lane_i64x2(laneIndex: number): any {\n return this.emit(OpCodes.i64x2_extract_lane, laneIndex);\n }\n\n replace_lane_i64x2(laneIndex: number): any {\n return this.emit(OpCodes.i64x2_replace_lane, laneIndex);\n }\n\n extract_lane_f32x4(laneIndex: number): any {\n return this.emit(OpCodes.f32x4_extract_lane, laneIndex);\n }\n\n replace_lane_f32x4(laneIndex: number): any {\n return this.emit(OpCodes.f32x4_replace_lane, laneIndex);\n }\n\n extract_lane_f64x2(laneIndex: number): any {\n return this.emit(OpCodes.f64x2_extract_lane, laneIndex);\n }\n\n replace_lane_f64x2(laneIndex: number): any {\n return this.emit(OpCodes.f64x2_replace_lane, laneIndex);\n }\n\n eq_i8x16(): any {\n return this.emit(OpCodes.i8x16_eq);\n }\n\n ne_i8x16(): any {\n return this.emit(OpCodes.i8x16_ne);\n }\n\n lt_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_lt_s);\n }\n\n lt_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_lt_u);\n }\n\n gt_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_gt_s);\n }\n\n gt_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_gt_u);\n }\n\n le_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_le_s);\n }\n\n le_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_le_u);\n }\n\n ge_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_ge_s);\n }\n\n ge_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_ge_u);\n }\n\n eq_i16x8(): any {\n return this.emit(OpCodes.i16x8_eq);\n }\n\n ne_i16x8(): any {\n return this.emit(OpCodes.i16x8_ne);\n }\n\n lt_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_lt_s);\n }\n\n lt_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_lt_u);\n }\n\n gt_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_gt_s);\n }\n\n gt_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_gt_u);\n }\n\n le_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_le_s);\n }\n\n le_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_le_u);\n }\n\n ge_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_ge_s);\n }\n\n ge_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_ge_u);\n }\n\n eq_i32x4(): any {\n return this.emit(OpCodes.i32x4_eq);\n }\n\n ne_i32x4(): any {\n return this.emit(OpCodes.i32x4_ne);\n }\n\n lt_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_lt_s);\n }\n\n lt_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_lt_u);\n }\n\n gt_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_gt_s);\n }\n\n gt_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_gt_u);\n }\n\n le_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_le_s);\n }\n\n le_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_le_u);\n }\n\n ge_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_ge_s);\n }\n\n ge_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_ge_u);\n }\n\n eq_f32x4(): any {\n return this.emit(OpCodes.f32x4_eq);\n }\n\n ne_f32x4(): any {\n return this.emit(OpCodes.f32x4_ne);\n }\n\n lt_f32x4(): any {\n return this.emit(OpCodes.f32x4_lt);\n }\n\n gt_f32x4(): any {\n return this.emit(OpCodes.f32x4_gt);\n }\n\n le_f32x4(): any {\n return this.emit(OpCodes.f32x4_le);\n }\n\n ge_f32x4(): any {\n return this.emit(OpCodes.f32x4_ge);\n }\n\n eq_f64x2(): any {\n return this.emit(OpCodes.f64x2_eq);\n }\n\n ne_f64x2(): any {\n return this.emit(OpCodes.f64x2_ne);\n }\n\n lt_f64x2(): any {\n return this.emit(OpCodes.f64x2_lt);\n }\n\n gt_f64x2(): any {\n return this.emit(OpCodes.f64x2_gt);\n }\n\n le_f64x2(): any {\n return this.emit(OpCodes.f64x2_le);\n }\n\n ge_f64x2(): any {\n return this.emit(OpCodes.f64x2_ge);\n }\n\n not_v128(): any {\n return this.emit(OpCodes.v128_not);\n }\n\n and_v128(): any {\n return this.emit(OpCodes.v128_and);\n }\n\n andnot_v128(): any {\n return this.emit(OpCodes.v128_andnot);\n }\n\n or_v128(): any {\n return this.emit(OpCodes.v128_or);\n }\n\n xor_v128(): any {\n return this.emit(OpCodes.v128_xor);\n }\n\n bitselect_v128(): any {\n return this.emit(OpCodes.v128_bitselect);\n }\n\n any_true_v128(): any {\n return this.emit(OpCodes.v128_any_true);\n }\n\n load8_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load8_lane, alignment, offset);\n }\n\n load16_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load16_lane, alignment, offset);\n }\n\n load32_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_lane, alignment, offset);\n }\n\n load64_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_lane, alignment, offset);\n }\n\n store8_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store8_lane, alignment, offset);\n }\n\n store16_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store16_lane, alignment, offset);\n }\n\n store32_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store32_lane, alignment, offset);\n }\n\n store64_lane_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_store64_lane, alignment, offset);\n }\n\n load32_zero_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load32_zero, alignment, offset);\n }\n\n load64_zero_v128(alignment: number, offset: number): any {\n return this.emit(OpCodes.v128_load64_zero, alignment, offset);\n }\n\n trunc_sat_f32x4_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f32x4_s);\n }\n\n trunc_sat_f32x4_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f32x4_u);\n }\n\n abs_i8x16(): any {\n return this.emit(OpCodes.i8x16_abs);\n }\n\n neg_i8x16(): any {\n return this.emit(OpCodes.i8x16_neg);\n }\n\n popcnt_i8x16(): any {\n return this.emit(OpCodes.i8x16_popcnt);\n }\n\n all_true_i8x16(): any {\n return this.emit(OpCodes.i8x16_all_true);\n }\n\n bitmask_i8x16(): any {\n return this.emit(OpCodes.i8x16_bitmask);\n }\n\n narrow_i16x8_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_narrow_i16x8_s);\n }\n\n narrow_i16x8_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_narrow_i16x8_u);\n }\n\n ceil_f32x4(): any {\n return this.emit(OpCodes.f32x4_ceil);\n }\n\n floor_f32x4(): any {\n return this.emit(OpCodes.f32x4_floor);\n }\n\n trunc_f32x4(): any {\n return this.emit(OpCodes.f32x4_trunc);\n }\n\n nearest_f32x4(): any {\n return this.emit(OpCodes.f32x4_nearest);\n }\n\n shl_i8x16(): any {\n return this.emit(OpCodes.i8x16_shl);\n }\n\n shr_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_shr_s);\n }\n\n shr_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_shr_u);\n }\n\n add_i8x16(): any {\n return this.emit(OpCodes.i8x16_add);\n }\n\n add_sat_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_add_sat_s);\n }\n\n add_sat_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_add_sat_u);\n }\n\n sub_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub);\n }\n\n sub_sat_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub_sat_s);\n }\n\n sub_sat_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_sub_sat_u);\n }\n\n ceil_f64x2(): any {\n return this.emit(OpCodes.f64x2_ceil);\n }\n\n floor_f64x2(): any {\n return this.emit(OpCodes.f64x2_floor);\n }\n\n min_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_min_s);\n }\n\n min_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_min_u);\n }\n\n max_s_i8x16(): any {\n return this.emit(OpCodes.i8x16_max_s);\n }\n\n max_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_max_u);\n }\n\n trunc_f64x2(): any {\n return this.emit(OpCodes.f64x2_trunc);\n }\n\n avgr_u_i8x16(): any {\n return this.emit(OpCodes.i8x16_avgr_u);\n }\n\n extadd_pairwise_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extadd_pairwise_i8x16_s);\n }\n\n extadd_pairwise_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extadd_pairwise_i8x16_u);\n }\n\n extadd_pairwise_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extadd_pairwise_i16x8_s);\n }\n\n extadd_pairwise_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extadd_pairwise_i16x8_u);\n }\n\n abs_i16x8(): any {\n return this.emit(OpCodes.i16x8_abs);\n }\n\n neg_i16x8(): any {\n return this.emit(OpCodes.i16x8_neg);\n }\n\n q15mulr_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_q15mulr_sat_s);\n }\n\n all_true_i16x8(): any {\n return this.emit(OpCodes.i16x8_all_true);\n }\n\n bitmask_i16x8(): any {\n return this.emit(OpCodes.i16x8_bitmask);\n }\n\n narrow_i32x4_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_narrow_i32x4_s);\n }\n\n narrow_i32x4_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_narrow_i32x4_u);\n }\n\n extend_low_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_low_i8x16_s);\n }\n\n extend_high_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_high_i8x16_s);\n }\n\n extend_low_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_low_i8x16_u);\n }\n\n extend_high_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extend_high_i8x16_u);\n }\n\n shl_i16x8(): any {\n return this.emit(OpCodes.i16x8_shl);\n }\n\n shr_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_shr_s);\n }\n\n shr_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_shr_u);\n }\n\n add_i16x8(): any {\n return this.emit(OpCodes.i16x8_add);\n }\n\n add_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_add_sat_s);\n }\n\n add_sat_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_add_sat_u);\n }\n\n sub_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub);\n }\n\n sub_sat_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub_sat_s);\n }\n\n sub_sat_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_sub_sat_u);\n }\n\n nearest_f64x2(): any {\n return this.emit(OpCodes.f64x2_nearest);\n }\n\n mul_i16x8(): any {\n return this.emit(OpCodes.i16x8_mul);\n }\n\n min_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_min_s);\n }\n\n min_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_min_u);\n }\n\n max_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_max_s);\n }\n\n max_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_max_u);\n }\n\n avgr_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_avgr_u);\n }\n\n extmul_low_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_low_i8x16_s);\n }\n\n extmul_high_i8x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_high_i8x16_s);\n }\n\n extmul_low_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_low_i8x16_u);\n }\n\n extmul_high_i8x16_u_i16x8(): any {\n return this.emit(OpCodes.i16x8_extmul_high_i8x16_u);\n }\n\n abs_i32x4(): any {\n return this.emit(OpCodes.i32x4_abs);\n }\n\n neg_i32x4(): any {\n return this.emit(OpCodes.i32x4_neg);\n }\n\n all_true_i32x4(): any {\n return this.emit(OpCodes.i32x4_all_true);\n }\n\n bitmask_i32x4(): any {\n return this.emit(OpCodes.i32x4_bitmask);\n }\n\n extend_low_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_low_i16x8_s);\n }\n\n extend_high_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_high_i16x8_s);\n }\n\n extend_low_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_low_i16x8_u);\n }\n\n extend_high_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extend_high_i16x8_u);\n }\n\n shl_i32x4(): any {\n return this.emit(OpCodes.i32x4_shl);\n }\n\n shr_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_shr_s);\n }\n\n shr_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_shr_u);\n }\n\n add_i32x4(): any {\n return this.emit(OpCodes.i32x4_add);\n }\n\n convert_i32x4_s_f32x4(): any {\n return this.emit(OpCodes.f32x4_convert_i32x4_s);\n }\n\n convert_i32x4_u_f32x4(): any {\n return this.emit(OpCodes.f32x4_convert_i32x4_u);\n }\n\n sub_i32x4(): any {\n return this.emit(OpCodes.i32x4_sub);\n }\n\n mul_i32x4(): any {\n return this.emit(OpCodes.i32x4_mul);\n }\n\n min_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_min_s);\n }\n\n min_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_min_u);\n }\n\n max_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_max_s);\n }\n\n max_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_max_u);\n }\n\n dot_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_dot_i16x8_s);\n }\n\n extmul_low_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_low_i16x8_s);\n }\n\n extmul_high_i16x8_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_high_i16x8_s);\n }\n\n extmul_low_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_low_i16x8_u);\n }\n\n extmul_high_i16x8_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_extmul_high_i16x8_u);\n }\n\n abs_i64x2(): any {\n return this.emit(OpCodes.i64x2_abs);\n }\n\n neg_i64x2(): any {\n return this.emit(OpCodes.i64x2_neg);\n }\n\n all_true_i64x2(): any {\n return this.emit(OpCodes.i64x2_all_true);\n }\n\n bitmask_i64x2(): any {\n return this.emit(OpCodes.i64x2_bitmask);\n }\n\n extend_low_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_low_i32x4_s);\n }\n\n extend_high_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_high_i32x4_s);\n }\n\n extend_low_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_low_i32x4_u);\n }\n\n extend_high_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extend_high_i32x4_u);\n }\n\n shl_i64x2(): any {\n return this.emit(OpCodes.i64x2_shl);\n }\n\n shr_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_shr_s);\n }\n\n shr_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_shr_u);\n }\n\n add_i64x2(): any {\n return this.emit(OpCodes.i64x2_add);\n }\n\n sub_i64x2(): any {\n return this.emit(OpCodes.i64x2_sub);\n }\n\n mul_i64x2(): any {\n return this.emit(OpCodes.i64x2_mul);\n }\n\n eq_i64x2(): any {\n return this.emit(OpCodes.i64x2_eq);\n }\n\n ne_i64x2(): any {\n return this.emit(OpCodes.i64x2_ne);\n }\n\n lt_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_lt_s);\n }\n\n gt_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_gt_s);\n }\n\n le_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_le_s);\n }\n\n ge_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_ge_s);\n }\n\n extmul_low_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_low_i32x4_s);\n }\n\n extmul_high_i32x4_s_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_high_i32x4_s);\n }\n\n extmul_low_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_low_i32x4_u);\n }\n\n extmul_high_i32x4_u_i64x2(): any {\n return this.emit(OpCodes.i64x2_extmul_high_i32x4_u);\n }\n\n abs_f32x4(): any {\n return this.emit(OpCodes.f32x4_abs);\n }\n\n neg_f32x4(): any {\n return this.emit(OpCodes.f32x4_neg);\n }\n\n sqrt_f32x4(): any {\n return this.emit(OpCodes.f32x4_sqrt);\n }\n\n add_f32x4(): any {\n return this.emit(OpCodes.f32x4_add);\n }\n\n sub_f32x4(): any {\n return this.emit(OpCodes.f32x4_sub);\n }\n\n mul_f32x4(): any {\n return this.emit(OpCodes.f32x4_mul);\n }\n\n div_f32x4(): any {\n return this.emit(OpCodes.f32x4_div);\n }\n\n min_f32x4(): any {\n return this.emit(OpCodes.f32x4_min);\n }\n\n max_f32x4(): any {\n return this.emit(OpCodes.f32x4_max);\n }\n\n pmin_f32x4(): any {\n return this.emit(OpCodes.f32x4_pmin);\n }\n\n pmax_f32x4(): any {\n return this.emit(OpCodes.f32x4_pmax);\n }\n\n abs_f64x2(): any {\n return this.emit(OpCodes.f64x2_abs);\n }\n\n neg_f64x2(): any {\n return this.emit(OpCodes.f64x2_neg);\n }\n\n sqrt_f64x2(): any {\n return this.emit(OpCodes.f64x2_sqrt);\n }\n\n add_f64x2(): any {\n return this.emit(OpCodes.f64x2_add);\n }\n\n sub_f64x2(): any {\n return this.emit(OpCodes.f64x2_sub);\n }\n\n mul_f64x2(): any {\n return this.emit(OpCodes.f64x2_mul);\n }\n\n div_f64x2(): any {\n return this.emit(OpCodes.f64x2_div);\n }\n\n min_f64x2(): any {\n return this.emit(OpCodes.f64x2_min);\n }\n\n max_f64x2(): any {\n return this.emit(OpCodes.f64x2_max);\n }\n\n pmin_f64x2(): any {\n return this.emit(OpCodes.f64x2_pmin);\n }\n\n pmax_f64x2(): any {\n return this.emit(OpCodes.f64x2_pmax);\n }\n\n trunc_sat_f64x2_s_zero_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f64x2_s_zero);\n }\n\n trunc_sat_f64x2_u_zero_i32x4(): any {\n return this.emit(OpCodes.i32x4_trunc_sat_f64x2_u_zero);\n }\n\n convert_low_i32x4_s_f64x2(): any {\n return this.emit(OpCodes.f64x2_convert_low_i32x4_s);\n }\n\n convert_low_i32x4_u_f64x2(): any {\n return this.emit(OpCodes.f64x2_convert_low_i32x4_u);\n }\n\n demote_f64x2_zero_f32x4(): any {\n return this.emit(OpCodes.f32x4_demote_f64x2_zero);\n }\n\n promote_low_f32x4_f64x2(): any {\n return this.emit(OpCodes.f64x2_promote_low_f32x4);\n }\n\n atomic_notify(alignment: number, offset: number): any {\n return this.emit(OpCodes.memory_atomic_notify, alignment, offset);\n }\n\n atomic_wait32(alignment: number, offset: number): any {\n return this.emit(OpCodes.memory_atomic_wait32, alignment, offset);\n }\n\n atomic_wait64(alignment: number, offset: number): any {\n return this.emit(OpCodes.memory_atomic_wait64, alignment, offset);\n }\n\n atomic_fence(varUInt1: number): any {\n return this.emit(OpCodes.atomic_fence, varUInt1);\n }\n\n atomic_load_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_load, alignment, offset);\n }\n\n atomic_load_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_load, alignment, offset);\n }\n\n atomic_load8_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_load8_u, alignment, offset);\n }\n\n atomic_load16_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_load16_u, alignment, offset);\n }\n\n atomic_load8_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_load8_u, alignment, offset);\n }\n\n atomic_load16_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_load16_u, alignment, offset);\n }\n\n atomic_load32_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_load32_u, alignment, offset);\n }\n\n atomic_store_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_store, alignment, offset);\n }\n\n atomic_store_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_store, alignment, offset);\n }\n\n atomic_store8_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_store8, alignment, offset);\n }\n\n atomic_store16_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_store16, alignment, offset);\n }\n\n atomic_store8_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_store8, alignment, offset);\n }\n\n atomic_store16_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_store16, alignment, offset);\n }\n\n atomic_store32_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_store32, alignment, offset);\n }\n\n atomic_rmw_add_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw_add, alignment, offset);\n }\n\n atomic_rmw_add_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw_add, alignment, offset);\n }\n\n atomic_rmw8_add_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw8_add_u, alignment, offset);\n }\n\n atomic_rmw16_add_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw16_add_u, alignment, offset);\n }\n\n atomic_rmw8_add_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw8_add_u, alignment, offset);\n }\n\n atomic_rmw16_add_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw16_add_u, alignment, offset);\n }\n\n atomic_rmw32_add_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw32_add_u, alignment, offset);\n }\n\n atomic_rmw_sub_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw_sub, alignment, offset);\n }\n\n atomic_rmw_sub_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw_sub, alignment, offset);\n }\n\n atomic_rmw8_sub_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw8_sub_u, alignment, offset);\n }\n\n atomic_rmw16_sub_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw16_sub_u, alignment, offset);\n }\n\n atomic_rmw8_sub_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw8_sub_u, alignment, offset);\n }\n\n atomic_rmw16_sub_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw16_sub_u, alignment, offset);\n }\n\n atomic_rmw32_sub_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw32_sub_u, alignment, offset);\n }\n\n atomic_rmw_and_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw_and, alignment, offset);\n }\n\n atomic_rmw_and_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw_and, alignment, offset);\n }\n\n atomic_rmw8_and_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw8_and_u, alignment, offset);\n }\n\n atomic_rmw16_and_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw16_and_u, alignment, offset);\n }\n\n atomic_rmw8_and_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw8_and_u, alignment, offset);\n }\n\n atomic_rmw16_and_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw16_and_u, alignment, offset);\n }\n\n atomic_rmw32_and_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw32_and_u, alignment, offset);\n }\n\n atomic_rmw_or_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw_or, alignment, offset);\n }\n\n atomic_rmw_or_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw_or, alignment, offset);\n }\n\n atomic_rmw8_or_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw8_or_u, alignment, offset);\n }\n\n atomic_rmw16_or_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw16_or_u, alignment, offset);\n }\n\n atomic_rmw8_or_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw8_or_u, alignment, offset);\n }\n\n atomic_rmw16_or_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw16_or_u, alignment, offset);\n }\n\n atomic_rmw32_or_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw32_or_u, alignment, offset);\n }\n\n atomic_rmw_xor_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw_xor, alignment, offset);\n }\n\n atomic_rmw_xor_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw_xor, alignment, offset);\n }\n\n atomic_rmw8_xor_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw8_xor_u, alignment, offset);\n }\n\n atomic_rmw16_xor_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw16_xor_u, alignment, offset);\n }\n\n atomic_rmw8_xor_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw8_xor_u, alignment, offset);\n }\n\n atomic_rmw16_xor_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw16_xor_u, alignment, offset);\n }\n\n atomic_rmw32_xor_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw32_xor_u, alignment, offset);\n }\n\n atomic_rmw_xchg_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw_xchg, alignment, offset);\n }\n\n atomic_rmw_xchg_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw_xchg, alignment, offset);\n }\n\n atomic_rmw8_xchg_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw8_xchg_u, alignment, offset);\n }\n\n atomic_rmw16_xchg_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw16_xchg_u, alignment, offset);\n }\n\n atomic_rmw8_xchg_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw8_xchg_u, alignment, offset);\n }\n\n atomic_rmw16_xchg_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw16_xchg_u, alignment, offset);\n }\n\n atomic_rmw32_xchg_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw32_xchg_u, alignment, offset);\n }\n\n atomic_rmw_cmpxchg_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw_cmpxchg, alignment, offset);\n }\n\n atomic_rmw_cmpxchg_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw_cmpxchg, alignment, offset);\n }\n\n atomic_rmw8_cmpxchg_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw8_cmpxchg_u, alignment, offset);\n }\n\n atomic_rmw16_cmpxchg_u_i32(alignment: number, offset: number): any {\n return this.emit(OpCodes.i32_atomic_rmw16_cmpxchg_u, alignment, offset);\n }\n\n atomic_rmw8_cmpxchg_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw8_cmpxchg_u, alignment, offset);\n }\n\n atomic_rmw16_cmpxchg_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw16_cmpxchg_u, alignment, offset);\n }\n\n atomic_rmw32_cmpxchg_u_i64(alignment: number, offset: number): any {\n return this.emit(OpCodes.i64_atomic_rmw32_cmpxchg_u, alignment, offset);\n }\n\n relaxed_swizzle_i8x16(): any {\n return this.emit(OpCodes.i8x16_relaxed_swizzle);\n }\n\n relaxed_trunc_f32x4_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_relaxed_trunc_f32x4_s);\n }\n\n relaxed_trunc_f32x4_u_i32x4(): any {\n return this.emit(OpCodes.i32x4_relaxed_trunc_f32x4_u);\n }\n\n relaxed_trunc_f64x2_s_zero_i32x4(): any {\n return this.emit(OpCodes.i32x4_relaxed_trunc_f64x2_s_zero);\n }\n\n relaxed_trunc_f64x2_u_zero_i32x4(): any {\n return this.emit(OpCodes.i32x4_relaxed_trunc_f64x2_u_zero);\n }\n\n relaxed_madd_f32x4(): any {\n return this.emit(OpCodes.f32x4_relaxed_madd);\n }\n\n relaxed_nmadd_f32x4(): any {\n return this.emit(OpCodes.f32x4_relaxed_nmadd);\n }\n\n relaxed_madd_f64x2(): any {\n return this.emit(OpCodes.f64x2_relaxed_madd);\n }\n\n relaxed_nmadd_f64x2(): any {\n return this.emit(OpCodes.f64x2_relaxed_nmadd);\n }\n\n relaxed_laneselect_i8x16(): any {\n return this.emit(OpCodes.i8x16_relaxed_laneselect);\n }\n\n relaxed_laneselect_i16x8(): any {\n return this.emit(OpCodes.i16x8_relaxed_laneselect);\n }\n\n relaxed_laneselect_i32x4(): any {\n return this.emit(OpCodes.i32x4_relaxed_laneselect);\n }\n\n relaxed_laneselect_i64x2(): any {\n return this.emit(OpCodes.i64x2_relaxed_laneselect);\n }\n\n relaxed_min_f32x4(): any {\n return this.emit(OpCodes.f32x4_relaxed_min);\n }\n\n relaxed_max_f32x4(): any {\n return this.emit(OpCodes.f32x4_relaxed_max);\n }\n\n relaxed_min_f64x2(): any {\n return this.emit(OpCodes.f64x2_relaxed_min);\n }\n\n relaxed_max_f64x2(): any {\n return this.emit(OpCodes.f64x2_relaxed_max);\n }\n\n relaxed_q15mulr_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_relaxed_q15mulr_s);\n }\n\n relaxed_dot_i8x16_i7x16_s_i16x8(): any {\n return this.emit(OpCodes.i16x8_relaxed_dot_i8x16_i7x16_s);\n }\n\n relaxed_dot_i8x16_i7x16_add_s_i32x4(): any {\n return this.emit(OpCodes.i32x4_relaxed_dot_i8x16_i7x16_add_s);\n }\n\n abstract emit(opCode: any, ...args: any[]): any;\n}\n", "import { BlockTypeDescriptor } from '../types';\r\nimport OperandStack from './OperandStack';\r\n\r\nexport default class ControlFlowBlock {\r\n stack: OperandStack;\r\n blockType: BlockTypeDescriptor;\r\n parent: ControlFlowBlock | null;\r\n index: number;\r\n depth: number;\r\n childrenCount: number;\r\n isLoop: boolean;\r\n\r\n constructor(\r\n stack: OperandStack,\r\n blockType: BlockTypeDescriptor,\r\n parent: ControlFlowBlock | null,\r\n index: number,\r\n depth: number,\r\n childrenCount: number,\r\n isLoop: boolean = false\r\n ) {\r\n this.stack = stack;\r\n this.blockType = blockType;\r\n this.parent = parent;\r\n this.index = index;\r\n this.depth = depth;\r\n this.childrenCount = childrenCount;\r\n this.isLoop = isLoop;\r\n }\r\n\r\n canReference(block: ControlFlowBlock): boolean {\r\n if (this.depth > block.depth) {\r\n return false;\r\n }\r\n\r\n let potentialMatch: ControlFlowBlock = block;\r\n for (let index = 0; index < block.depth - this.depth; index++) {\r\n potentialMatch = potentialMatch.parent!;\r\n }\r\n\r\n return potentialMatch === this;\r\n }\r\n\r\n findParent(other: ControlFlowBlock): ControlFlowBlock | null {\r\n let potentialParent: ControlFlowBlock;\r\n let potentialMatch: ControlFlowBlock;\r\n\r\n if (other.depth > this.depth) {\r\n potentialParent = this;\r\n potentialMatch = other;\r\n } else {\r\n potentialParent = other;\r\n potentialMatch = this;\r\n }\r\n\r\n for (let index = 0; index < Math.abs(potentialParent.depth - potentialMatch.depth); index++) {\r\n potentialMatch = potentialMatch.parent!;\r\n }\r\n\r\n return potentialParent === potentialMatch ? potentialParent : null;\r\n }\r\n}\r\n", "export default class VerificationError extends Error {\r\n constructor(message?: string) {\r\n super(message);\r\n this.name = 'VerificationError';\r\n }\r\n}\r\n", "import { BlockType, BlockTypeDescriptor } from '../types';\r\nimport ControlFlowBlock from './ControlFlowBlock';\r\nimport LabelBuilder from '../LabelBuilder';\r\nimport OperandStack from './OperandStack';\r\nimport VerificationError from './VerificationError';\r\n\r\nexport default class ControlFlowVerifier {\r\n _stack: LabelBuilder[] = [];\r\n _unresolvedLabels: LabelBuilder[] = [];\r\n _disableVerification: boolean;\r\n\r\n constructor(disableVerification: boolean) {\r\n this._disableVerification = disableVerification;\r\n }\r\n\r\n get size(): number {\r\n return this._stack.length;\r\n }\r\n\r\n push(\r\n operandStack: OperandStack,\r\n blockType: BlockTypeDescriptor,\r\n label: LabelBuilder | null = null,\r\n isLoop: boolean = false\r\n ): LabelBuilder {\r\n const current = this.peek();\r\n if (label) {\r\n if (!this._disableVerification && label.isResolved) {\r\n throw new VerificationError(\r\n 'Cannot use a label that has already been associated with another block.'\r\n );\r\n }\r\n\r\n const labelIndex = this._unresolvedLabels.findIndex((x) => x === label);\r\n if (labelIndex === -1) {\r\n throw new VerificationError('The label was not created for this function.');\r\n }\r\n\r\n if (\r\n !this._disableVerification &&\r\n label.block &&\r\n current &&\r\n !current.block!.canReference(label.block)\r\n ) {\r\n throw new VerificationError(\r\n 'Label has been referenced by an instruction in an enclosing block that ' +\r\n 'cannot branch to the current enclosing block.'\r\n );\r\n }\r\n\r\n this._unresolvedLabels.splice(labelIndex, 1);\r\n } else {\r\n label = new LabelBuilder();\r\n }\r\n\r\n const block = !current\r\n ? new ControlFlowBlock(operandStack, BlockType.Void, null, 0, 0, 0)\r\n : new ControlFlowBlock(\r\n operandStack,\r\n blockType,\r\n current.block!,\r\n current.block!.childrenCount++,\r\n current.block!.depth + 1,\r\n 0,\r\n isLoop\r\n );\r\n\r\n label.resolve(block);\r\n this._stack.push(label);\r\n return label;\r\n }\r\n\r\n pop(): void {\r\n if (this._stack.length === 0) {\r\n throw new VerificationError('Cannot end the block, the stack is empty.');\r\n }\r\n this._stack.pop();\r\n }\r\n\r\n peek(): LabelBuilder | null {\r\n return this._stack.length === 0 ? null : this._stack[this._stack.length - 1];\r\n }\r\n\r\n defineLabel(): LabelBuilder {\r\n const label = new LabelBuilder();\r\n this._unresolvedLabels.push(label);\r\n return label;\r\n }\r\n\r\n reference(label: LabelBuilder): void {\r\n if (this._disableVerification) {\r\n return;\r\n }\r\n\r\n const current = this.peek();\r\n if (label.isResolved) {\r\n if (!current || !label.block!.canReference(current.block!)) {\r\n throw new VerificationError(\r\n 'The label cannot be referenced by the current enclosing block.'\r\n );\r\n }\r\n } else {\r\n if (!this._unresolvedLabels.find((x) => x === label)) {\r\n throw new VerificationError('The label was not created for this function.');\r\n }\r\n\r\n if (!label.block) {\r\n throw new VerificationError('Label has not been associated with any block.');\r\n }\r\n\r\n const potentialParent = label.block.findParent(current!.block!);\r\n if (!potentialParent) {\r\n throw new VerificationError('The reference to this label is invalid.');\r\n }\r\n\r\n label.reference(potentialParent);\r\n }\r\n }\r\n\r\n verify(): void {\r\n if (this._disableVerification) {\r\n return;\r\n }\r\n\r\n if (this._unresolvedLabels.some((x) => x.block)) {\r\n throw new VerificationError('The function contains unresolved labels.');\r\n }\r\n\r\n if (this._stack.length === 1) {\r\n throw new VerificationError('Function is missing closing end instruction.');\r\n } else if (this._stack.length !== 0) {\r\n throw new VerificationError(\r\n `Function has ${this._stack.length} control structures ` +\r\n 'that are not closed. Every block, if, and loop must have a corresponding end instruction.'\r\n );\r\n }\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from '../types';\r\n\r\nexport default class OperandStack {\r\n static Empty: OperandStack = (() => {\r\n const operandStack = Object.create(OperandStack.prototype) as OperandStack;\r\n operandStack._valueType = null!;\r\n operandStack._previous = null;\r\n operandStack._length = 0;\r\n return operandStack;\r\n })();\r\n\r\n _previous: OperandStack | null;\r\n _length: number;\r\n _valueType: ValueTypeDescriptor;\r\n\r\n constructor(valueType: ValueTypeDescriptor, previous: OperandStack | null = null) {\r\n this._valueType = valueType;\r\n this._previous = previous;\r\n this._length = this._previous ? this._previous._length + 1 : 1;\r\n }\r\n\r\n get length(): number {\r\n return this._length;\r\n }\r\n\r\n get valueType(): ValueTypeDescriptor {\r\n if (this.isEmpty) {\r\n throw new Error('The stack is empty.');\r\n }\r\n return this._valueType;\r\n }\r\n\r\n get isEmpty(): boolean {\r\n return this._length === 0;\r\n }\r\n\r\n push(valueType: ValueTypeDescriptor): OperandStack {\r\n return new OperandStack(valueType, this);\r\n }\r\n\r\n pop(): OperandStack {\r\n if (this.isEmpty) {\r\n throw new Error('The stack is empty.');\r\n }\r\n return this._previous!;\r\n }\r\n\r\n peek(): OperandStack | null {\r\n return this._previous;\r\n }\r\n}\r\n", "import { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FuncTypeSignature {\r\n static empty = new FuncTypeSignature([], []);\r\n\r\n returnTypes: ValueTypeDescriptor[];\r\n parameterTypes: ValueTypeDescriptor[];\r\n\r\n constructor(returnTypes: ValueTypeDescriptor[], parameterTypes: ValueTypeDescriptor[]) {\r\n this.returnTypes = returnTypes;\r\n this.parameterTypes = parameterTypes;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { TypeForm, ValueTypeDescriptor } from './types';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\n\r\nexport default class FuncTypeBuilder {\r\n key: string;\r\n index: number;\r\n returnTypes: ValueTypeDescriptor[];\r\n parameterTypes: ValueTypeDescriptor[];\r\n\r\n constructor(\r\n key: string,\r\n returnTypes: ValueTypeDescriptor[],\r\n parameterTypes: ValueTypeDescriptor[],\r\n index: number\r\n ) {\r\n this.key = key;\r\n this.returnTypes = returnTypes;\r\n this.parameterTypes = parameterTypes;\r\n this.index = index;\r\n }\r\n\r\n get typeForm() {\r\n return TypeForm.Func;\r\n }\r\n\r\n static createKey(returnTypes: ValueTypeDescriptor[], parameterTypes: ValueTypeDescriptor[]): string {\r\n let key = '(';\r\n returnTypes.forEach((x, i) => {\r\n key += x.short;\r\n if (i !== returnTypes.length - 1) {\r\n key += ', ';\r\n }\r\n });\r\n\r\n key += ')(';\r\n parameterTypes.forEach((x, i) => {\r\n key += x.short;\r\n if (i !== parameterTypes.length - 1) {\r\n key += ', ';\r\n }\r\n });\r\n\r\n key += ')';\r\n return key;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarInt7(TypeForm.Func.value);\r\n writer.writeVarUInt32(this.parameterTypes.length);\r\n this.parameterTypes.forEach((x) => {\r\n writer.writeVarInt7(x.value);\r\n });\r\n\r\n writer.writeVarUInt32(this.returnTypes.length);\r\n this.returnTypes.forEach((x) => {\r\n writer.writeVarInt7(x.value);\r\n });\r\n }\r\n\r\n toSignature(): FuncTypeSignature {\r\n return new FuncTypeSignature(this.returnTypes, this.parameterTypes);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import OperandStack from './OperandStack';\r\nimport OpCodes from '../OpCodes';\r\nimport { ValueType, BlockType, ImmediateType, ValueTypeDescriptor, BlockTypeDescriptor, OpCodeDef } from '../types';\r\nimport { OperandStackBehavior, OperandStackType, ControlFlowType } from './types';\r\nimport Immediate from '../Immediate';\r\nimport ControlFlowBlock from './ControlFlowBlock';\r\nimport type FunctionBuilder from '../FunctionBuilder';\r\nimport ImportBuilder from '../ImportBuilder';\r\nimport FuncTypeBuilder from '../FuncTypeBuilder';\r\nimport LocalBuilder from '../LocalBuilder';\r\nimport GlobalBuilder from '../GlobalBuilder';\r\nimport FunctionParameterBuilder from '../FunctionParameterBuilder';\r\nimport FuncTypeSignature from '../FuncTypeSignature';\r\nimport VerificationError from './VerificationError';\r\n\r\nexport default class OperandStackVerifier {\r\n _operandStack: OperandStack;\r\n _instructionCount: number;\r\n _funcType: FuncTypeSignature;\r\n\r\n constructor(funcType: FuncTypeSignature) {\r\n this._operandStack = OperandStack.Empty;\r\n this._instructionCount = 0;\r\n this._funcType = funcType;\r\n }\r\n\r\n get stack(): OperandStack {\r\n return this._operandStack;\r\n }\r\n\r\n verifyInstruction(\r\n controlBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null\r\n ): void {\r\n let modifiedStack = this._operandStack;\r\n if (opCode.stackBehavior !== OperandStackBehavior.None) {\r\n modifiedStack = this._verifyStack(controlBlock, opCode, immediate);\r\n }\r\n\r\n if (opCode.controlFlow === ControlFlowType.Pop) {\r\n this._verifyControlFlowPop(controlBlock, modifiedStack);\r\n } else if (opCode === (OpCodes as any).return) {\r\n modifiedStack = this._verifyReturnValues(modifiedStack, true);\r\n }\r\n\r\n if (immediate && immediate.type === ImmediateType.RelativeDepth) {\r\n this._verifyBranch(modifiedStack, immediate);\r\n }\r\n\r\n this._operandStack = modifiedStack;\r\n this._instructionCount++;\r\n }\r\n\r\n verifyElse(controlBlock: ControlFlowBlock): void {\r\n if (controlBlock.blockType !== BlockType.Void) {\r\n // Non-void if block: the true branch must have the result on stack\r\n if (this._operandStack.isEmpty) {\r\n throw new VerificationError(\r\n `else: expected ${(controlBlock.blockType as BlockTypeDescriptor).name} on the stack from the if-branch but the stack is empty.`\r\n );\r\n }\r\n const expectedType = controlBlock.blockType as ValueTypeDescriptor;\r\n if (this._operandStack.valueType !== expectedType) {\r\n throw new VerificationError(\r\n `else: expected ${expectedType.name} on the stack but found ${this._operandStack.valueType.name}.`\r\n );\r\n }\r\n const stackAfterPop = this._operandStack.pop();\r\n if (stackAfterPop !== controlBlock.stack) {\r\n throw new VerificationError(\r\n 'else: stack (minus result value) does not match the if-block entry stack.'\r\n );\r\n }\r\n } else {\r\n // Void if block: stack must match entry\r\n if (this._operandStack !== controlBlock.stack) {\r\n throw new VerificationError(\r\n 'else: stack does not match the if-block entry stack.'\r\n );\r\n }\r\n }\r\n // Reset stack for else branch\r\n this._operandStack = controlBlock.stack;\r\n }\r\n\r\n _verifyBranch(stack: OperandStack, immediate: Immediate): void {\r\n const targetBlock = immediate.values[0].block as ControlFlowBlock;\r\n const targetEntryStack = targetBlock.stack;\r\n\r\n if (targetBlock.isLoop) {\r\n // Branch to loop header: no result values needed, stack must match entry\r\n if (targetEntryStack !== stack) {\r\n throw new VerificationError(\r\n 'Branch to loop: stack does not match the loop entry stack.'\r\n );\r\n }\r\n return;\r\n }\r\n\r\n if (targetBlock.blockType !== BlockType.Void) {\r\n // Non-void block: branch must carry the result value\r\n if (stack.isEmpty) {\r\n throw new VerificationError(\r\n `Branch expects ${(targetBlock.blockType as BlockTypeDescriptor).name} on the stack but the stack is empty.`\r\n );\r\n }\r\n const expectedType = targetBlock.blockType as ValueTypeDescriptor;\r\n if (stack.valueType !== expectedType) {\r\n throw new VerificationError(\r\n `Branch expects ${expectedType.name} but found ${stack.valueType.name} on the stack.`\r\n );\r\n }\r\n stack = stack.pop();\r\n }\r\n\r\n if (targetEntryStack !== stack) {\r\n throw new VerificationError(\r\n 'Branch: stack does not match the target block entry stack.'\r\n );\r\n }\r\n }\r\n\r\n _verifyReturnValues(stack: OperandStack, pop: boolean = false): OperandStack {\r\n const remaining = this._getStackValueTypes(stack, stack.length);\r\n if (remaining.length !== this._funcType.returnTypes.length) {\r\n if (remaining.length === 0) {\r\n throw new VerificationError(\r\n `Function expected to return ${this._formatAndList(this._funcType.returnTypes, (x) => x.name)} ` +\r\n 'but stack is empty.'\r\n );\r\n } else if (this._funcType.returnTypes.length === 0) {\r\n throw new VerificationError(\r\n `Function does not have any return values but ${this._formatAndList(remaining, (x) => x.name)} ` +\r\n `was found on the stack.`\r\n );\r\n }\r\n\r\n throw new VerificationError(\r\n `Function return values do not match the items on the stack. ` +\r\n `Expected: ${this._formatAndList(this._funcType.returnTypes, (x) => x.name)} ` +\r\n `Found on stack: ${this._formatAndList(remaining, (x) => x.name)}.`\r\n );\r\n }\r\n\r\n let errorMessage = '';\r\n for (let index = 0; index < remaining.length; index++) {\r\n if (remaining[index] !== this._funcType.returnTypes[index]) {\r\n errorMessage =\r\n `A ${this._funcType.returnTypes[index].name} was expected at ${remaining.length - index} ` +\r\n `but a ${remaining[index].name} was found. `;\r\n }\r\n }\r\n\r\n if (errorMessage !== '') {\r\n throw new VerificationError('Error returning from function: ' + errorMessage);\r\n }\r\n\r\n if (pop) {\r\n for (let index = 0; index < remaining.length; index++) {\r\n stack = stack.pop();\r\n }\r\n }\r\n\r\n return stack;\r\n }\r\n\r\n _verifyControlFlowPop(controlBlock: ControlFlowBlock, stack: OperandStack): void {\r\n if (controlBlock.depth === 0) {\r\n this._verifyReturnValues(stack);\r\n } else {\r\n const expectedStack =\r\n controlBlock.blockType !== BlockType.Void ? stack.pop() : stack;\r\n if (controlBlock.stack !== expectedStack) {\r\n throw new VerificationError();\r\n }\r\n }\r\n }\r\n\r\n _verifyStack(\r\n controlFlowBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null\r\n ): OperandStack {\r\n let modifiedStack = this._operandStack;\r\n const funcType = this._getFuncType(opCode, immediate);\r\n\r\n if (\r\n opCode.stackBehavior === OperandStackBehavior.Pop ||\r\n opCode.stackBehavior === OperandStackBehavior.PopPush\r\n ) {\r\n modifiedStack = this._verifyStackPop(modifiedStack, opCode, funcType);\r\n }\r\n\r\n if (\r\n opCode.stackBehavior === OperandStackBehavior.Push ||\r\n opCode.stackBehavior === OperandStackBehavior.PopPush\r\n ) {\r\n modifiedStack = this._stackPush(\r\n modifiedStack,\r\n controlFlowBlock,\r\n opCode,\r\n immediate,\r\n funcType\r\n );\r\n }\r\n\r\n return modifiedStack;\r\n }\r\n\r\n _verifyStackPop(\r\n stack: OperandStack,\r\n opCode: OpCodeDef,\r\n funcType: FuncTypeBuilder | null\r\n ): OperandStack {\r\n // Pop popOperands first (e.g. call_indirect's table index sits on top of params).\r\n // Iterate in reverse because the array is in push order (bottom-to-top)\r\n // but we pop from the top of the stack.\r\n const pops = opCode.popOperands || [];\r\n for (let idx = pops.length - 1; idx >= 0; idx--) {\r\n const x = pops[idx];\r\n if (x === OperandStackType.Any) {\r\n stack = stack.pop();\r\n continue;\r\n }\r\n\r\n const valueType = (ValueType as any)[x] as ValueTypeDescriptor;\r\n if (valueType !== stack.valueType) {\r\n throw new VerificationError(\r\n `Unexpected type found on stack at offset ${this._instructionCount + 1}. ` +\r\n `A ${valueType.name} was expected but a ${stack.valueType.name} was found.`\r\n );\r\n }\r\n stack = stack.pop();\r\n }\r\n\r\n // Then pop function parameter types (for call / call_indirect).\r\n // Iterate in reverse because parameters are pushed in declaration order\r\n // (param 0 at bottom, last param on top).\r\n if (funcType) {\r\n const params = funcType.parameterTypes;\r\n for (let idx = params.length - 1; idx >= 0; idx--) {\r\n const x = params[idx];\r\n if (x !== stack.valueType) {\r\n throw new VerificationError(\r\n `Unexpected type found on stack at offset ${this._instructionCount + 1}. ` +\r\n `A ${x.name} was expected but a ${stack.valueType.name} was found.`\r\n );\r\n }\r\n stack = stack.pop();\r\n }\r\n }\r\n\r\n return stack;\r\n }\r\n\r\n _stackPush(\r\n stack: OperandStack,\r\n controlBlock: ControlFlowBlock,\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n funcType: FuncTypeBuilder | null\r\n ): OperandStack {\r\n const stackStart = stack;\r\n if (funcType) {\r\n stack = funcType.returnTypes.reduce((i, x) => {\r\n return i.push(x);\r\n }, stack);\r\n }\r\n\r\n stack = (opCode.pushOperands || []).reduce((i, x) => {\r\n let valueType: ValueTypeDescriptor;\r\n if (x !== OperandStackType.Any) {\r\n valueType = (ValueType as any)[x] as ValueTypeDescriptor;\r\n } else {\r\n const popCount = this._operandStack.length - stackStart.length;\r\n valueType = this._getStackObjectValueType(opCode, immediate, popCount);\r\n }\r\n return i.push(valueType);\r\n }, stack);\r\n\r\n return stack;\r\n }\r\n\r\n _getFuncType(opCode: OpCodeDef, immediate: Immediate | null): FuncTypeBuilder | null {\r\n let funcType: FuncTypeBuilder | null = null;\r\n\r\n if (opCode === (OpCodes as any).call || opCode === (OpCodes as any).return_call) {\r\n if (immediate!.values[0] instanceof ImportBuilder) {\r\n funcType = immediate!.values[0].data as FuncTypeBuilder;\r\n } else if (immediate!.values[0] && 'funcTypeBuilder' in immediate!.values[0]) {\r\n funcType = (immediate!.values[0] as FunctionBuilder).funcTypeBuilder;\r\n } else {\r\n throw new VerificationError('Error getting funcType for call, invalid immediate.');\r\n }\r\n } else if (opCode === (OpCodes as any).call_indirect || opCode === (OpCodes as any).return_call_indirect) {\r\n if (immediate!.values[0] instanceof FuncTypeBuilder) {\r\n funcType = immediate!.values[0];\r\n } else {\r\n throw new VerificationError(\r\n 'Error getting funcType for call_indirect, invalid immediate.'\r\n );\r\n }\r\n }\r\n\r\n return funcType;\r\n }\r\n\r\n _getStackObjectValueType(\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n argCount: number\r\n ): ValueTypeDescriptor {\r\n if (\r\n opCode === (OpCodes as any).get_global ||\r\n opCode === (OpCodes as any).set_global\r\n ) {\r\n if (immediate!.values[0] instanceof GlobalBuilder) {\r\n return immediate!.values[0].valueType;\r\n } else if (immediate!.values[0] instanceof ImportBuilder) {\r\n return (immediate!.values[0].data as GlobalType).valueType;\r\n }\r\n throw new VerificationError('Invalid operand for global instruction.');\r\n } else if (\r\n opCode === (OpCodes as any).get_local ||\r\n opCode === (OpCodes as any).set_local ||\r\n opCode === (OpCodes as any).tee_local\r\n ) {\r\n if (\r\n !(immediate!.values[0] instanceof LocalBuilder) &&\r\n !(immediate!.values[0] instanceof FunctionParameterBuilder)\r\n ) {\r\n throw new VerificationError('Invalid operand for local instruction.');\r\n }\r\n return immediate!.values[0].valueType;\r\n }\r\n\r\n const stackArgTypes = this._getStackValueTypes(this._operandStack, argCount);\r\n return stackArgTypes[0];\r\n }\r\n\r\n _getStackValueTypes(stack: OperandStack, count: number): ValueTypeDescriptor[] {\r\n const results: ValueTypeDescriptor[] = [];\r\n let current = stack;\r\n\r\n for (let index = 0; index < count; index++) {\r\n results.push(current.valueType);\r\n current = current.pop();\r\n }\r\n\r\n return results.reverse();\r\n }\r\n\r\n _formatAndList(values: T[], getText?: (item: T) => string): string {\r\n if (values.length === 1) {\r\n return getText ? getText(values[0]) : String(values[0]);\r\n }\r\n\r\n let text = '';\r\n for (let index = 0; index < values.length; index++) {\r\n text += getText ? getText(values[index]) : String(values[index]);\r\n if (index === values.length - 2) {\r\n text += ' and ';\r\n } else if (index !== values.length - 1) {\r\n text += ', ';\r\n }\r\n }\r\n\r\n return text;\r\n }\r\n}\r\n\r\n// Import at the end to avoid circular dependency issues at type level\r\nimport type GlobalType from '../GlobalType';\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport { BlockTypeDescriptor, ImmediateType, OpCodeDef, WasmFeature } from './types';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport Immediate from './Immediate';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport Instruction from './Instruction';\r\nimport LabelBuilder from './LabelBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport OpCodeEmitter from './OpCodeEmitter';\r\nimport OpCodes from './OpCodes';\r\nimport ControlFlowVerifier from './verification/ControlFlowVerifier';\r\nimport { ControlFlowType } from './verification/types';\r\nimport OperandStackVerifier from './verification/OperandStackVerifier';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\nimport { BlockType } from './types';\r\n\r\nconst validateParameters = (immediateType: string, values: any[] | undefined, length: number): void => {\r\n if (!values || values.length !== length) {\r\n throw new Error(`Unexpected number of values for ${immediateType}.`);\r\n }\r\n};\r\n\r\nexport interface AssemblyEmitterOptions {\r\n disableVerification: boolean;\r\n features?: Set;\r\n}\r\n\r\nexport default class AssemblyEmitter extends OpCodeEmitter {\r\n _instructions: Instruction[];\r\n _locals: LocalBuilder[];\r\n _entryLabel: LabelBuilder;\r\n _controlFlowVerifier: ControlFlowVerifier;\r\n _operandStackVerifier: OperandStackVerifier;\r\n _options: AssemblyEmitterOptions;\r\n\r\n constructor(\r\n funcSignature: FuncTypeSignature,\r\n options: AssemblyEmitterOptions = { disableVerification: false }\r\n ) {\r\n super();\r\n\r\n Arg.instanceOf('funcSignature', funcSignature, FuncTypeSignature);\r\n this._instructions = [];\r\n this._locals = [];\r\n this._controlFlowVerifier = new ControlFlowVerifier(options.disableVerification);\r\n this._operandStackVerifier = new OperandStackVerifier(funcSignature);\r\n this._entryLabel = this._controlFlowVerifier.push(\r\n this._operandStackVerifier.stack,\r\n BlockType.Void\r\n );\r\n this._options = options;\r\n }\r\n\r\n get returnValues(): any {\r\n return this;\r\n }\r\n\r\n get parameters(): FunctionParameterBuilder[] {\r\n return [];\r\n }\r\n\r\n get entryLabel(): LabelBuilder {\r\n return this._entryLabel;\r\n }\r\n\r\n get disableVerification(): boolean {\r\n return this._options.disableVerification;\r\n }\r\n\r\n getParameter(_index: number): FunctionParameterBuilder | LocalBuilder {\r\n throw new Error('Not supported.');\r\n }\r\n\r\n declareLocal(\r\n type: any,\r\n name: string | null = null,\r\n count: number = 1\r\n ): LocalBuilder {\r\n const localBuilder = new LocalBuilder(\r\n type,\r\n name,\r\n this._locals.length + this.parameters.length,\r\n count\r\n );\r\n this._locals.push(localBuilder);\r\n return localBuilder;\r\n }\r\n\r\n defineLabel(): LabelBuilder {\r\n return this._controlFlowVerifier.defineLabel();\r\n }\r\n\r\n emit(opCode: OpCodeDef, ...args: any[]): any {\r\n Arg.notNull('opCode', opCode);\r\n const depth = this._controlFlowVerifier.size - 1;\r\n let result: any = null;\r\n let immediate: Immediate | null = null;\r\n let pushLabel: LabelBuilder | null = null;\r\n let labelCallback: ((label: any) => void) | null = null;\r\n\r\n if (depth < 0) {\r\n throw new Error(\r\n 'Cannot add any instructions after the main control enclosure has been closed.'\r\n );\r\n }\r\n\r\n if (opCode.controlFlow === ControlFlowType.Push && args.length > 1) {\r\n if (args.length > 2) {\r\n throw new Error(`Unexpected number of values for ${ImmediateType.BlockSignature}.`);\r\n }\r\n\r\n if (args[1]) {\r\n if (args[1] instanceof LabelBuilder) {\r\n pushLabel = args[1];\r\n } else if (typeof args[1] === 'function') {\r\n const userFunction = args[1];\r\n labelCallback = (x: any) => {\r\n userFunction(x);\r\n };\r\n } else {\r\n throw new Error('Error');\r\n }\r\n }\r\n\r\n args = [args[0]];\r\n }\r\n\r\n if (opCode.feature && this._options.features && !this._options.features.has(opCode.feature as WasmFeature)) {\r\n throw new Error(\r\n `Opcode ${opCode.mnemonic} requires the '${opCode.feature}' feature. ` +\r\n `Enable it via the 'features' or 'target' option in ModuleBuilder.`\r\n );\r\n }\r\n\r\n if (opCode.immediate) {\r\n immediate = this._createImmediate(\r\n opCode.immediate as ImmediateType,\r\n args,\r\n depth\r\n );\r\n\r\n if (immediate.type === ImmediateType.RelativeDepth) {\r\n this._controlFlowVerifier.reference(args[0]);\r\n }\r\n }\r\n\r\n if (!this.disableVerification) {\r\n this._operandStackVerifier.verifyInstruction(\r\n this._controlFlowVerifier.peek()!.block!,\r\n opCode,\r\n immediate\r\n );\r\n\r\n if (opCode === (OpCodes as any).else) {\r\n this._operandStackVerifier.verifyElse(\r\n this._controlFlowVerifier.peek()!.block!\r\n );\r\n }\r\n }\r\n\r\n if (opCode.controlFlow) {\r\n result = this._updateControlFlow(opCode, immediate, pushLabel);\r\n }\r\n\r\n this._instructions.push(new Instruction(opCode, immediate));\r\n if (labelCallback) {\r\n labelCallback(result);\r\n this.end();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n _updateControlFlow(\r\n opCode: OpCodeDef,\r\n immediate: Immediate | null,\r\n label: LabelBuilder | null\r\n ): any {\r\n let result: any = null;\r\n if (opCode.controlFlow === ControlFlowType.Push) {\r\n const blockType = immediate!.values[0] as BlockTypeDescriptor;\r\n const isLoop = opCode === (OpCodes as any).loop;\r\n result = this._controlFlowVerifier.push(\r\n this._operandStackVerifier.stack,\r\n blockType,\r\n label,\r\n isLoop\r\n );\r\n } else if (opCode.controlFlow === ControlFlowType.Pop) {\r\n this._controlFlowVerifier.pop();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._controlFlowVerifier.verify();\r\n\r\n const bodyWriter = new BinaryWriter();\r\n this._writeLocals(bodyWriter);\r\n\r\n for (let index = 0; index < this._instructions.length; index++) {\r\n this._instructions[index].write(bodyWriter);\r\n }\r\n\r\n writer.writeVarUInt32(bodyWriter.length);\r\n writer.writeBytes(bodyWriter);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n\r\n _writeLocals(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this._locals.length);\r\n for (let index = 0; index < this._locals.length; index++) {\r\n this._locals[index].write(writer);\r\n }\r\n }\r\n\r\n _createImmediate(immediateType: ImmediateType, values: any[], depth: number): Immediate {\r\n switch (immediateType) {\r\n case ImmediateType.BlockSignature:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createBlockSignature(values[0]);\r\n\r\n case ImmediateType.BranchTable:\r\n validateParameters(immediateType, values, 2);\r\n return Immediate.createBranchTable(values[0], values[1], depth);\r\n\r\n case ImmediateType.Float32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createFloat32(values[0]);\r\n\r\n case ImmediateType.Float64:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createFloat64(values[0]);\r\n\r\n case ImmediateType.Function:\r\n validateParameters(immediateType, values, 1);\r\n if (!(values[0] instanceof ImportBuilder) && !(values[0] && '_index' in values[0] && 'funcTypeBuilder' in values[0])) {\r\n throw new Error('functionBuilder must be a FunctionBuilder or ImportBuilder.');\r\n }\r\n return Immediate.createFunction(values[0]);\r\n\r\n case ImmediateType.Global:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createGlobal(values[0]);\r\n\r\n case ImmediateType.IndirectFunction:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createIndirectFunction(values[0]);\r\n\r\n case ImmediateType.Local:\r\n validateParameters(immediateType, values, 1);\r\n let local = values[0];\r\n if (typeof local === 'number') {\r\n local = this.getParameter(local);\r\n }\r\n Arg.instanceOf('local', local, LocalBuilder, FunctionParameterBuilder);\r\n return Immediate.createLocal(local);\r\n\r\n case ImmediateType.MemoryImmediate:\r\n validateParameters(immediateType, values, 2);\r\n return Immediate.createMemoryImmediate(values[0], values[1]);\r\n\r\n case ImmediateType.RelativeDepth:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createRelativeDepth(values[0], depth);\r\n\r\n case ImmediateType.VarInt32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarInt32(values[0]);\r\n\r\n case ImmediateType.VarInt64:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarInt64(values[0]);\r\n\r\n case ImmediateType.VarUInt1:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarUInt1(values[0]);\r\n\r\n case ImmediateType.VarUInt32:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createVarUInt32(values[0]);\r\n\r\n case ImmediateType.V128Const:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createV128Const(values[0]);\r\n\r\n case ImmediateType.LaneIndex:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createLaneIndex(values[0]);\r\n\r\n case ImmediateType.ShuffleMask:\r\n validateParameters(immediateType, values, 1);\r\n return Immediate.createShuffleMask(values[0]);\r\n\r\n default:\r\n throw new Error('Unknown operand type.');\r\n }\r\n }\r\n}\r\n", "import AssemblyEmitter from './AssemblyEmitter';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { InitExpressionType, ValueTypeDescriptor, OpCodeDef, WasmFeature } from './types';\r\nimport OpCodes from './OpCodes';\r\nimport FuncTypeSignature from './FuncTypeSignature';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class InitExpressionEmitter extends AssemblyEmitter {\r\n _initExpressionType: InitExpressionType;\r\n _features: Set;\r\n\r\n constructor(initExpressionType: InitExpressionType, valueType: ValueTypeDescriptor, features?: Set) {\r\n super(new FuncTypeSignature([valueType], []));\r\n this._initExpressionType = initExpressionType;\r\n this._features = features || new Set();\r\n }\r\n\r\n getParameter(_index: number): never {\r\n throw new Error('An initialization expression does not have any parameters.');\r\n }\r\n\r\n declareLocal(): never {\r\n throw new Error('An initialization expression cannot have locals.');\r\n }\r\n\r\n emit(opCode: OpCodeDef, ...args: any[]): any {\r\n this._isValidateOp(opCode, args);\r\n return super.emit(opCode, ...args);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n for (let index = 0; index < this._instructions.length; index++) {\r\n this._instructions[index].write(writer);\r\n }\r\n }\r\n\r\n _isValidateOp(opCode: OpCodeDef, args?: any[]): void {\r\n // Extended-const allows multiple instructions in init expressions\r\n const hasExtendedConst = this._features.has('extended-const');\r\n const maxInstructions = hasExtendedConst ? Infinity : 2;\r\n\r\n if (this._instructions.length >= maxInstructions) {\r\n return;\r\n }\r\n\r\n if (!hasExtendedConst && this._instructions.length === 1) {\r\n if (opCode !== OpCodes.end) {\r\n throw new Error(`Opcode ${opCode.mnemonic} is not valid after init expression value.`);\r\n }\r\n return;\r\n }\r\n\r\n // With extended-const, end is always valid\r\n if (opCode === OpCodes.end) {\r\n return;\r\n }\r\n\r\n switch (opCode) {\r\n case OpCodes.f32_const:\r\n case OpCodes.f64_const:\r\n case OpCodes.i32_const:\r\n case OpCodes.i64_const:\r\n break;\r\n\r\n case OpCodes.get_global: {\r\n const globalBuilder = args?.[0];\r\n if (this._initExpressionType === InitExpressionType.Element && !hasExtendedConst) {\r\n throw new Error(\r\n 'The only valid instruction for an element initializer expression is a constant i32, ' +\r\n 'global not supported.'\r\n );\r\n }\r\n\r\n if (!(globalBuilder instanceof GlobalBuilder)) {\r\n throw new Error('A global builder was expected.');\r\n }\r\n\r\n if (globalBuilder.globalType.mutable && !hasExtendedConst) {\r\n throw new Error(\r\n 'An initializer expression cannot reference a mutable global.'\r\n );\r\n }\r\n\r\n break;\r\n }\r\n\r\n // Extended-const: allow arithmetic in init expressions\r\n case OpCodes.i32_add:\r\n case OpCodes.i32_sub:\r\n case OpCodes.i32_mul:\r\n case OpCodes.i64_add:\r\n case OpCodes.i64_sub:\r\n case OpCodes.i64_mul: {\r\n if (!hasExtendedConst) {\r\n throw new Error(\r\n `Opcode ${opCode.mnemonic} is not supported in an initializer expression. Enable the extended-const feature to allow arithmetic in init expressions.`\r\n );\r\n }\r\n break;\r\n }\r\n\r\n default:\r\n throw new Error(\r\n `Opcode ${opCode.mnemonic} is not supported in an initializer expression.`\r\n );\r\n }\r\n }\r\n}\r\n", "import InitExpressionEmitter from './InitExpressionEmitter';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { InitExpressionType, ValueType, WasmFeature } from './types';\r\n\r\nexport default class DataSegmentBuilder {\r\n _data: Uint8Array;\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n _passive: boolean = false;\r\n _memoryIndex: number = 0;\r\n _features: Set;\r\n\r\n constructor(data: Uint8Array, features?: Set) {\r\n this._data = data;\r\n this._features = features || new Set();\r\n }\r\n\r\n passive(): this {\r\n this._passive = true;\r\n return this;\r\n }\r\n\r\n memoryIndex(index: number): this {\r\n this._memoryIndex = index;\r\n return this;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Data,\r\n ValueType.Int32,\r\n this._features\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n offset(value: number | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number') {\r\n this.createInitEmitter((asm) => {\r\n asm.const_i32(value);\r\n });\r\n } else {\r\n throw new Error('Unsupported offset');\r\n }\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (this._passive) {\r\n // Passive segment: kind=1, no memory index, no offset expression\r\n writer.writeVarUInt32(1);\r\n writer.writeVarUInt32(this._data.length);\r\n writer.writeBytes(this._data);\r\n return;\r\n }\r\n\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n if (this._memoryIndex !== 0) {\r\n // Active segment with explicit memory index: kind=2\r\n writer.writeVarUInt32(2);\r\n writer.writeVarUInt32(this._memoryIndex);\r\n } else {\r\n // Active segment with default memory 0: kind=0\r\n writer.writeVarUInt32(0);\r\n }\r\n this._initExpressionEmitter.write(writer);\r\n writer.writeVarUInt32(this._data.length);\r\n writer.writeBytes(this._data);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import AssemblyEmitter, { AssemblyEmitterOptions } from './AssemblyEmitter';\r\nimport LocalBuilder from './LocalBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport { ValueTypeDescriptor } from './types';\r\n\r\nexport default class FunctionEmitter extends AssemblyEmitter {\r\n _functionBuilder: FunctionBuilder;\r\n\r\n constructor(functionBuilder: FunctionBuilder, options?: AssemblyEmitterOptions) {\r\n super(functionBuilder.funcTypeBuilder.toSignature(), options);\r\n this._functionBuilder = functionBuilder;\r\n this._locals = [];\r\n }\r\n\r\n get returnValues(): ValueTypeDescriptor[] {\r\n return this._functionBuilder.funcTypeBuilder.returnTypes;\r\n }\r\n\r\n get parameters(): FunctionParameterBuilder[] {\r\n return this._functionBuilder.parameters;\r\n }\r\n\r\n getParameter(index: number): FunctionParameterBuilder | LocalBuilder {\r\n if (index >= 0) {\r\n if (index < this.parameters.length) {\r\n return this._functionBuilder.getParameter(index);\r\n }\r\n\r\n const localIndex = index - this.parameters.length;\r\n if (localIndex < this._locals.length) {\r\n return this._locals[localIndex];\r\n }\r\n }\r\n\r\n throw new Error('Invalid parameter index.');\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport { ValueTypeDescriptor } from './types';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class FunctionBuilder {\r\n name: string;\r\n funcTypeBuilder: FuncTypeBuilder;\r\n parameters: FunctionParameterBuilder[];\r\n _index: number;\r\n functionEmitter: FunctionEmitter | null = null;\r\n _moduleBuilder: ModuleBuilder;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n name: string,\r\n funcTypeBuilder: FuncTypeBuilder,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this.name = name;\r\n this.funcTypeBuilder = funcTypeBuilder;\r\n this._index = index;\r\n this.parameters = funcTypeBuilder.parameterTypes.map(\r\n (x, i) => new FunctionParameterBuilder(x, i)\r\n );\r\n }\r\n\r\n get returnType(): ValueTypeDescriptor[] {\r\n return this.funcTypeBuilder.returnTypes;\r\n }\r\n\r\n get parameterTypes(): ValueTypeDescriptor[] {\r\n return this.funcTypeBuilder.parameterTypes;\r\n }\r\n\r\n getParameter(index: number): FunctionParameterBuilder {\r\n return this.parameters[index];\r\n }\r\n\r\n createEmitter(callback?: (asm: FunctionEmitter) => void): FunctionEmitter {\r\n if (this.functionEmitter) {\r\n throw new Error('Function emitter has already been created.');\r\n }\r\n\r\n this.functionEmitter = new FunctionEmitter(this, {\r\n disableVerification: this._moduleBuilder.disableVerification,\r\n features: this._moduleBuilder.features,\r\n });\r\n if (callback) {\r\n callback(this.functionEmitter);\r\n this.functionEmitter.end();\r\n }\r\n\r\n return this.functionEmitter;\r\n }\r\n\r\n withExport(name?: string): this {\r\n this._moduleBuilder.exportFunction(this, name || null);\r\n return this;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (!this.functionEmitter) {\r\n throw new Error('Function body has not been defined.');\r\n }\r\n\r\n this.functionEmitter.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport InitExpressionEmitter from './InitExpressionEmitter';\r\nimport TableBuilder from './TableBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport { InitExpressionType, ValueType, WasmFeature } from './types';\r\nimport BinaryWriter from './BinaryWriter';\r\n\r\nexport default class ElementSegmentBuilder {\r\n _table: TableBuilder | null;\r\n _functions: (FunctionBuilder | ImportBuilder)[] = [];\r\n _initExpressionEmitter: InitExpressionEmitter | null = null;\r\n _passive: boolean = false;\r\n _features: Set;\r\n\r\n constructor(table: TableBuilder | null, functions: (FunctionBuilder | ImportBuilder)[], features?: Set) {\r\n this._table = table;\r\n this._functions = functions;\r\n this._features = features || new Set();\r\n }\r\n\r\n passive(): this {\r\n this._passive = true;\r\n return this;\r\n }\r\n\r\n createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter {\r\n if (this._initExpressionEmitter) {\r\n throw new Error('Initialization expression emitter has already been created.');\r\n }\r\n\r\n this._initExpressionEmitter = new InitExpressionEmitter(\r\n InitExpressionType.Element,\r\n ValueType.Int32,\r\n this._features\r\n );\r\n if (callback) {\r\n callback(this._initExpressionEmitter);\r\n this._initExpressionEmitter.end();\r\n }\r\n\r\n return this._initExpressionEmitter;\r\n }\r\n\r\n offset(value: number | GlobalBuilder | ((asm: InitExpressionEmitter) => void)): void {\r\n if (typeof value === 'function') {\r\n this.createInitEmitter(value);\r\n } else if (value instanceof GlobalBuilder) {\r\n this.createInitEmitter((asm) => {\r\n asm.get_global(value);\r\n });\r\n } else if (typeof value === 'number') {\r\n this.createInitEmitter((asm) => {\r\n asm.const_i32(value);\r\n });\r\n } else {\r\n throw new Error('Unsupported offset');\r\n }\r\n }\r\n\r\n private _writeFuncIndex(writer: BinaryWriter, func: FunctionBuilder | ImportBuilder): void {\r\n if (func instanceof FunctionBuilder) {\r\n writer.writeVarUInt32(func._index);\r\n } else if (func instanceof ImportBuilder) {\r\n writer.writeVarUInt32(func.index);\r\n }\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (this._passive) {\r\n // Passive segment: kind=1, elemkind=0x00 (funcref), vec of func indices\r\n writer.writeVarUInt32(1);\r\n writer.writeUInt8(0x00); // elemkind: funcref\r\n writer.writeVarUInt32(this._functions.length);\r\n this._functions.forEach((x) => this._writeFuncIndex(writer, x));\r\n return;\r\n }\r\n\r\n if (!this._initExpressionEmitter) {\r\n throw new Error('The initialization expression was not defined.');\r\n }\r\n\r\n const tableIndex = this._table ? this._table._index : 0;\r\n\r\n if (tableIndex !== 0) {\r\n // Active segment with explicit table index: kind=2\r\n writer.writeVarUInt32(2);\r\n writer.writeVarUInt32(tableIndex);\r\n this._initExpressionEmitter.write(writer);\r\n writer.writeUInt8(0x00); // elemkind: funcref\r\n writer.writeVarUInt32(this._functions.length);\r\n this._functions.forEach((x) => this._writeFuncIndex(writer, x));\r\n } else {\r\n // Active segment with default table 0: kind=0\r\n writer.writeVarUInt32(0);\r\n this._initExpressionEmitter.write(writer);\r\n writer.writeVarUInt32(this._functions.length);\r\n this._functions.forEach((x) => this._writeFuncIndex(writer, x));\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport { ExternalKind, ExternalKindType } from './types';\r\n\r\nexport default class ExportBuilder {\r\n name: string;\r\n externalKind: ExternalKindType;\r\n data: { _index: number };\r\n\r\n constructor(name: string, externalKind: ExternalKindType, data: { _index: number }) {\r\n this.name = name;\r\n this.externalKind = externalKind;\r\n this.data = data;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this.name.length);\r\n writer.writeString(this.name);\r\n writer.writeUInt8(this.externalKind.value);\r\n switch (this.externalKind) {\r\n case ExternalKind.Function:\r\n case ExternalKind.Global:\r\n case ExternalKind.Memory:\r\n case ExternalKind.Table:\r\n writer.writeVarUInt32(this.data._index);\r\n break;\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\n\r\nexport default class ResizableLimits {\r\n initial: number;\r\n maximum: number | null;\r\n\r\n constructor(initial: number, maximum: number | null = null) {\r\n this.initial = initial;\r\n this.maximum = maximum;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt1(this.maximum !== null ? 1 : 0);\r\n writer.writeVarUInt32(this.initial);\r\n if (this.maximum !== null) {\r\n writer.writeVarUInt32(this.maximum);\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\n\r\nexport default class MemoryType {\r\n resizableLimits: ResizableLimits;\r\n shared: boolean;\r\n memory64: boolean;\r\n\r\n constructor(resizableLimits: ResizableLimits, shared: boolean = false, memory64: boolean = false) {\r\n Arg.instanceOf('resizableLimits', resizableLimits, ResizableLimits);\r\n if (shared && resizableLimits.maximum === null) {\r\n throw new Error('Shared memory requires a maximum size.');\r\n }\r\n this.resizableLimits = resizableLimits;\r\n this.shared = shared;\r\n this.memory64 = memory64;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n if (this.shared || this.memory64) {\r\n // Extended flags byte:\r\n // bit 0: has maximum\r\n // bit 1: shared\r\n // bit 2: memory64\r\n let flags = this.resizableLimits.maximum !== null ? 0b001 : 0;\r\n if (this.shared) flags |= 0b010;\r\n if (this.memory64) flags |= 0b100;\r\n writer.writeVarUInt7(flags);\r\n writer.writeVarUInt32(this.resizableLimits.initial);\r\n if (this.resizableLimits.maximum !== null) {\r\n writer.writeVarUInt32(this.resizableLimits.maximum);\r\n }\r\n } else {\r\n this.resizableLimits.write(writer);\r\n }\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport MemoryType from './MemoryType';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\nexport default class MemoryBuilder {\r\n _moduleBuilder: ModuleBuilder;\r\n _memoryType: MemoryType;\r\n _index: number;\r\n\r\n constructor(moduleBuilder: ModuleBuilder, resizableLimits: ResizableLimits, index: number, shared: boolean = false, memory64: boolean = false) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._memoryType = new MemoryType(resizableLimits, shared, memory64);\r\n this._index = index;\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportMemory(this, name);\r\n return this;\r\n }\r\n\r\n get isShared(): boolean {\r\n return this._memoryType.shared;\r\n }\r\n\r\n get isMemory64(): boolean {\r\n return this._memoryType.memory64;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._memoryType.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport { ElementTypeDescriptor } from './types';\r\n\r\nexport default class TableType {\r\n private _elementType: ElementTypeDescriptor;\r\n private _resizableLimits: ResizableLimits;\r\n\r\n constructor(elementType: ElementTypeDescriptor, resizableLimits: ResizableLimits) {\r\n this._elementType = elementType;\r\n this._resizableLimits = resizableLimits;\r\n }\r\n\r\n get elementType(): ElementTypeDescriptor {\r\n return this._elementType;\r\n }\r\n\r\n get resizableLimits(): ResizableLimits {\r\n return this._resizableLimits;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n writer.writeVarUInt32(this._elementType.value);\r\n this._resizableLimits.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport TableType from './TableType';\r\nimport { ElementTypeDescriptor } from './types';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\nimport type FunctionBuilder from './FunctionBuilder';\r\nimport type ImportBuilder from './ImportBuilder';\r\n\r\nexport default class TableBuilder {\r\n _moduleBuilder: ModuleBuilder;\r\n _tableType: TableType;\r\n _index: number;\r\n\r\n constructor(\r\n moduleBuilder: ModuleBuilder,\r\n elementType: ElementTypeDescriptor,\r\n resizableLimits: ResizableLimits,\r\n index: number\r\n ) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._tableType = new TableType(elementType, resizableLimits);\r\n this._index = index;\r\n }\r\n\r\n get elementType(): ElementTypeDescriptor {\r\n return this._tableType.elementType;\r\n }\r\n\r\n get resizableLimits(): ResizableLimits {\r\n return this._tableType.resizableLimits;\r\n }\r\n\r\n withExport(name: string): this {\r\n this._moduleBuilder.exportTable(this, name);\r\n return this;\r\n }\r\n\r\n defineTableSegment(\r\n elements: (FunctionBuilder | ImportBuilder)[],\r\n offset?: number | ((asm: any) => void)\r\n ): void {\r\n this._moduleBuilder.defineTableSegment(this, elements, offset);\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n this._tableType.write(writer);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import ModuleBuilder from './ModuleBuilder';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport { ExternalKind, ImmediateType, ValueTypeDescriptor } from './types';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalType from './GlobalType';\r\nimport MemoryType from './MemoryType';\r\nimport TableType from './TableType';\r\nimport Instruction from './Instruction';\r\nimport LabelBuilder from './LabelBuilder';\r\nimport FunctionParameterBuilder from './FunctionParameterBuilder';\r\nimport LocalBuilder from './LocalBuilder';\r\n\r\nexport default class TextModuleWriter {\r\n moduleBuilder: ModuleBuilder;\r\n\r\n constructor(moduleBuilder: ModuleBuilder) {\r\n this.moduleBuilder = moduleBuilder;\r\n }\r\n\r\n toString(): string {\r\n const lines: string[] = [];\r\n const mod = this.moduleBuilder;\r\n\r\n lines.push(`(module $${mod._name}`);\r\n\r\n this.writeTypes(lines, mod);\r\n this.writeImports(lines, mod);\r\n this.writeFunctions(lines, mod);\r\n this.writeTables(lines, mod);\r\n this.writeMemories(lines, mod);\r\n this.writeGlobals(lines, mod);\r\n this.writeTags(lines, mod);\r\n this.writeExports(lines, mod);\r\n this.writeStart(lines, mod);\r\n this.writeElements(lines, mod);\r\n this.writeData(lines, mod);\r\n\r\n lines.push(')');\r\n return lines.join('\\n');\r\n }\r\n\r\n private writeTypes(lines: string[], mod: ModuleBuilder): void {\r\n mod._types.forEach((type, i) => {\r\n const params = type.parameterTypes.map((p) => p.name).join(' ');\r\n const results = type.returnTypes.map((r) => r.name).join(' ');\r\n let sig = `(func`;\r\n if (params.length > 0) sig += ` (param ${params})`;\r\n if (results.length > 0) sig += ` (result ${results})`;\r\n sig += ')';\r\n lines.push(` (type (;${i};) ${sig})`);\r\n });\r\n }\r\n\r\n private writeImports(lines: string[], mod: ModuleBuilder): void {\r\n mod._imports.forEach((imp, i) => {\r\n let desc = '';\r\n switch (imp.externalKind) {\r\n case ExternalKind.Function: {\r\n const funcType = imp.data as FuncTypeBuilder;\r\n desc = `(func (;${imp.index};) (type ${funcType.index}))`;\r\n break;\r\n }\r\n case ExternalKind.Table: {\r\n const tableType = imp.data as TableType;\r\n const limits = tableType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n desc = `(table (;${imp.index};) ${limits.initial}${max} ${tableType.elementType.name})`;\r\n break;\r\n }\r\n case ExternalKind.Memory: {\r\n const memType = imp.data as MemoryType;\r\n const limits = memType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n desc = `(memory (;${imp.index};) ${limits.initial}${max})`;\r\n break;\r\n }\r\n case ExternalKind.Global: {\r\n const globalType = imp.data as GlobalType;\r\n const valType = globalType.valueType.name;\r\n desc = globalType.mutable\r\n ? `(global (;${imp.index};) (mut ${valType}))`\r\n : `(global (;${imp.index};) ${valType})`;\r\n break;\r\n }\r\n }\r\n lines.push(` (import \"${imp.moduleName}\" \"${imp.fieldName}\" ${desc})`);\r\n });\r\n }\r\n\r\n private writeFunctions(lines: string[], mod: ModuleBuilder): void {\r\n mod._functions.forEach((func) => {\r\n const typeIdx = func.funcTypeBuilder.index;\r\n let header = ` (func $${func.name} (;${func._index};) (type ${typeIdx})`;\r\n\r\n if (func.funcTypeBuilder.parameterTypes.length > 0) {\r\n const params = func.funcTypeBuilder.parameterTypes\r\n .map((p, i) => {\r\n const param = func.parameters[i];\r\n return p.name;\r\n })\r\n .join(' ');\r\n header += ` (param ${params})`;\r\n }\r\n\r\n if (func.funcTypeBuilder.returnTypes.length > 0) {\r\n const results = func.funcTypeBuilder.returnTypes.map((r) => r.name).join(' ');\r\n header += ` (result ${results})`;\r\n }\r\n\r\n if (!func.functionEmitter) {\r\n lines.push(header + ')');\r\n return;\r\n }\r\n\r\n const emitter = func.functionEmitter;\r\n\r\n // Locals\r\n if (emitter._locals.length > 0) {\r\n const locals = emitter._locals.map((l) => {\r\n if (l.count === 1) return `(local ${l.valueType.name})`;\r\n return `(local ${l.valueType.name})`.repeat(l.count);\r\n });\r\n header += ' ' + locals.join(' ');\r\n }\r\n\r\n lines.push(header);\r\n\r\n // Instructions\r\n this.writeInstructions(lines, emitter._instructions, 2);\r\n lines.push(' )');\r\n });\r\n }\r\n\r\n private writeInstructions(lines: string[], instructions: Instruction[], baseIndent: number): void {\r\n let indent = baseIndent;\r\n\r\n for (const instr of instructions) {\r\n const mnemonic = instr.opCode.mnemonic;\r\n\r\n // Decrease indent before end/else\r\n if (mnemonic === 'end' || mnemonic === 'else') {\r\n indent = Math.max(baseIndent, indent - 1);\r\n }\r\n\r\n const prefix = ' '.repeat(indent);\r\n let line = `${prefix}${mnemonic}`;\r\n\r\n // Add immediate operand text\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) {\r\n line += ` ${immText}`;\r\n }\r\n }\r\n\r\n lines.push(line);\r\n\r\n // Increase indent after block/loop/if/else\r\n if (mnemonic === 'block' || mnemonic === 'loop' || mnemonic === 'if' || mnemonic === 'else') {\r\n indent++;\r\n }\r\n }\r\n }\r\n\r\n private immediateToText(type: ImmediateType, values: any[]): string {\r\n switch (type) {\r\n case ImmediateType.BlockSignature: {\r\n const blockType = values[0];\r\n if (blockType && blockType.name !== 'void') {\r\n return `(result ${blockType.name})`;\r\n }\r\n return '';\r\n }\r\n case ImmediateType.VarInt32:\r\n case ImmediateType.VarInt64:\r\n case ImmediateType.Float32:\r\n case ImmediateType.Float64:\r\n case ImmediateType.VarUInt1:\r\n return String(values[0]);\r\n\r\n case ImmediateType.Local: {\r\n const local = values[0];\r\n return String(local.index);\r\n }\r\n case ImmediateType.Global: {\r\n const global = values[0];\r\n if (global instanceof GlobalBuilder) {\r\n return String(global._index);\r\n }\r\n if (global && typeof global.index === 'number') {\r\n return String(global.index);\r\n }\r\n return '';\r\n }\r\n case ImmediateType.Function: {\r\n const func = values[0];\r\n if (func instanceof FunctionBuilder) {\r\n return String(func._index);\r\n }\r\n if (func instanceof ImportBuilder) {\r\n return String(func.index);\r\n }\r\n return '';\r\n }\r\n case ImmediateType.IndirectFunction: {\r\n const funcType = values[0];\r\n return `(type ${funcType.index})`;\r\n }\r\n case ImmediateType.RelativeDepth: {\r\n const label = values[0];\r\n const depth = values[1];\r\n if (label instanceof LabelBuilder && label.block) {\r\n return String(depth - label.block.depth);\r\n }\r\n return String(label);\r\n }\r\n case ImmediateType.BranchTable: {\r\n const defaultDepth = values[0];\r\n const depths = values[1] as number[];\r\n return depths.join(' ') + ' ' + defaultDepth;\r\n }\r\n case ImmediateType.MemoryImmediate: {\r\n const alignment = values[0];\r\n const offset = values[1];\r\n let text = '';\r\n if (offset !== 0) text += `offset=${offset}`;\r\n if (alignment !== 0) {\r\n if (text) text += ' ';\r\n text += `align=${1 << alignment}`;\r\n }\r\n return text;\r\n }\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n private writeTables(lines: string[], mod: ModuleBuilder): void {\r\n mod._tables.forEach((table, i) => {\r\n const limits = table.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n lines.push(` (table (;${table._index};) ${limits.initial}${max} ${table.elementType.name})`);\r\n });\r\n }\r\n\r\n private writeMemories(lines: string[], mod: ModuleBuilder): void {\r\n mod._memories.forEach((mem) => {\r\n const limits = mem._memoryType.resizableLimits;\r\n const max = limits.maximum !== null ? ` ${limits.maximum}` : '';\r\n const shared = mem._memoryType.shared ? ' shared' : '';\r\n const m64 = mem._memoryType.memory64 ? ' i64' : '';\r\n lines.push(` (memory (;${mem._index};)${m64} ${limits.initial}${max}${shared})`);\r\n });\r\n }\r\n\r\n private writeGlobals(lines: string[], mod: ModuleBuilder): void {\r\n mod._globals.forEach((g) => {\r\n const valType = g.globalType.valueType.name;\r\n const typeStr = g.globalType.mutable ? `(mut ${valType})` : valType;\r\n\r\n let initExpr = '';\r\n if (g._initExpressionEmitter) {\r\n const instrs = g._initExpressionEmitter._instructions;\r\n // Init expression is typically one const instruction + end\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n initExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) initExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n lines.push(` (global (;${g._index};) ${typeStr} (${initExpr}))`);\r\n });\r\n }\r\n\r\n private writeTags(lines: string[], mod: ModuleBuilder): void {\r\n mod._tags.forEach((tag, i) => {\r\n const params = tag._funcType.parameterTypes.map((p) => p.name).join(' ');\r\n let sig = '';\r\n if (params.length > 0) sig = ` (param ${params})`;\r\n lines.push(` (tag (;${i};) (type ${tag._funcType.index})${sig})`);\r\n });\r\n }\r\n\r\n private writeExports(lines: string[], mod: ModuleBuilder): void {\r\n mod._exports.forEach((exp) => {\r\n let kindName = '';\r\n let index = exp.data._index;\r\n switch (exp.externalKind) {\r\n case ExternalKind.Function:\r\n kindName = 'func';\r\n break;\r\n case ExternalKind.Table:\r\n kindName = 'table';\r\n break;\r\n case ExternalKind.Memory:\r\n kindName = 'memory';\r\n break;\r\n case ExternalKind.Global:\r\n kindName = 'global';\r\n break;\r\n }\r\n lines.push(` (export \"${exp.name}\" (${kindName} ${index}))`);\r\n });\r\n }\r\n\r\n private writeStart(lines: string[], mod: ModuleBuilder): void {\r\n if (mod._startFunction) {\r\n lines.push(` (start ${mod._startFunction._index})`);\r\n }\r\n }\r\n\r\n private writeElements(lines: string[], mod: ModuleBuilder): void {\r\n mod._elements.forEach((elem, i) => {\r\n const funcIndices = elem._functions\r\n .map((f) => {\r\n if (f instanceof FunctionBuilder) return f._index;\r\n if (f instanceof ImportBuilder) return f.index;\r\n return 0;\r\n })\r\n .join(' ');\r\n\r\n if (elem._passive) {\r\n lines.push(` (elem (;${i};) func ${funcIndices})`);\r\n return;\r\n }\r\n\r\n let offsetExpr = '';\r\n if (elem._initExpressionEmitter) {\r\n const instrs = elem._initExpressionEmitter._instructions;\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n offsetExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) offsetExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n const tableIndex = elem._table ? elem._table._index : 0;\r\n if (tableIndex !== 0) {\r\n lines.push(` (elem (;${i};) (table ${tableIndex}) (${offsetExpr}) func ${funcIndices})`);\r\n } else {\r\n lines.push(` (elem (;${i};) (${offsetExpr}) func ${funcIndices})`);\r\n }\r\n });\r\n }\r\n\r\n private writeData(lines: string[], mod: ModuleBuilder): void {\r\n mod._data.forEach((seg, i) => {\r\n const dataStr = this.bytesToWatString(seg._data);\r\n\r\n if (seg._passive) {\r\n lines.push(` (data (;${i};) \"${dataStr}\")`);\r\n return;\r\n }\r\n\r\n let offsetExpr = '';\r\n if (seg._initExpressionEmitter) {\r\n const instrs = seg._initExpressionEmitter._instructions;\r\n for (const instr of instrs) {\r\n if (instr.opCode.mnemonic === 'end') continue;\r\n offsetExpr = instr.opCode.mnemonic;\r\n if (instr.immediate) {\r\n const immText = this.immediateToText(instr.immediate.type, instr.immediate.values);\r\n if (immText) offsetExpr += ` ${immText}`;\r\n }\r\n }\r\n }\r\n\r\n if (seg._memoryIndex !== 0) {\r\n lines.push(` (data (;${i};) (memory ${seg._memoryIndex}) (${offsetExpr}) \"${dataStr}\")`);\r\n } else {\r\n lines.push(` (data (;${i};) (${offsetExpr}) \"${dataStr}\")`);\r\n }\r\n });\r\n }\r\n\r\n private bytesToWatString(data: Uint8Array): string {\r\n let result = '';\r\n for (let i = 0; i < data.length; i++) {\r\n const byte = data[i];\r\n if (byte >= 0x20 && byte < 0x7f && byte !== 0x22 && byte !== 0x5c) {\r\n result += String.fromCharCode(byte);\r\n } else {\r\n result += '\\\\' + byte.toString(16).padStart(2, '0');\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n", "import BinaryWriter from './BinaryWriter';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport type ModuleBuilder from './ModuleBuilder';\r\n\r\n/**\r\n * Represents a WebAssembly exception tag (used with exception-handling proposal).\r\n * A tag is essentially a typed label for exceptions \u2014 it has a function type\r\n * describing the parameters it carries.\r\n */\r\nexport default class TagBuilder {\r\n _moduleBuilder: ModuleBuilder;\r\n _funcType: FuncTypeBuilder;\r\n _index: number;\r\n\r\n constructor(moduleBuilder: ModuleBuilder, funcType: FuncTypeBuilder, index: number) {\r\n this._moduleBuilder = moduleBuilder;\r\n this._funcType = funcType;\r\n this._index = index;\r\n }\r\n\r\n get funcType(): FuncTypeBuilder {\r\n return this._funcType;\r\n }\r\n\r\n write(writer: BinaryWriter): void {\r\n // Tag attribute: 0 = exception (only supported kind)\r\n writer.writeVarUInt32(0);\r\n // Type index\r\n writer.writeVarUInt32(this._funcType.index);\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const buffer = new BinaryWriter();\r\n this.write(buffer);\r\n return buffer.toArray();\r\n }\r\n}\r\n", "import Arg from './Arg';\r\nimport BinaryModuleWriter from './BinaryModuleWriter';\r\nimport DataSegmentBuilder from './DataSegmentBuilder';\r\nimport ElementSegmentBuilder from './ElementSegmentBuilder';\r\nimport ExportBuilder from './ExportBuilder';\r\nimport {\r\n ExternalKind,\r\n ElementTypeDescriptor,\r\n ValueTypeDescriptor,\r\n ModuleBuilderOptions,\r\n WasmFeature,\r\n WasmTarget,\r\n} from './types';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FuncTypeBuilder from './FuncTypeBuilder';\r\nimport GlobalBuilder from './GlobalBuilder';\r\nimport GlobalType from './GlobalType';\r\nimport ImportBuilder from './ImportBuilder';\r\nimport MemoryBuilder from './MemoryBuilder';\r\nimport MemoryType from './MemoryType';\r\nimport ResizableLimits from './ResizableLimits';\r\nimport TableBuilder from './TableBuilder';\r\nimport TableType from './TableType';\r\nimport TextModuleWriter from './TextModuleWriter';\r\nimport TagBuilder from './TagBuilder';\r\nimport CustomSectionBuilder from './CustomSectionBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport VerificationError from './verification/VerificationError';\r\n\r\nexport default class ModuleBuilder {\r\n static defaultOptions: ModuleBuilderOptions = {\r\n generateNameSection: true,\r\n disableVerification: false,\r\n };\r\n\r\n static readonly targetFeatures: Record = {\r\n 'mvp': [],\r\n '2.0': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'multi-value', 'mutable-globals'],\r\n '3.0': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'multi-value', 'mutable-globals',\r\n 'simd', 'tail-call', 'exception-handling', 'threads', 'multi-memory', 'multi-table', 'memory64', 'extended-const'],\r\n 'latest': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'multi-value', 'mutable-globals',\r\n 'simd', 'tail-call', 'exception-handling', 'threads', 'multi-memory', 'multi-table', 'memory64', 'extended-const',\r\n 'relaxed-simd', 'gc'],\r\n };\r\n\r\n _name: string;\r\n _types: FuncTypeBuilder[] = [];\r\n _imports: ImportBuilder[] = [];\r\n _functions: FunctionBuilder[] = [];\r\n _tables: TableBuilder[] = [];\r\n _memories: MemoryBuilder[] = [];\r\n _globals: GlobalBuilder[] = [];\r\n _exports: ExportBuilder[] = [];\r\n _elements: ElementSegmentBuilder[] = [];\r\n _data: DataSegmentBuilder[] = [];\r\n _tags: TagBuilder[] = [];\r\n _customSections: CustomSectionBuilder[] = [];\r\n _startFunction: FunctionBuilder | null = null;\r\n _importsIndexSpace = {\r\n function: 0,\r\n table: 0,\r\n memory: 0,\r\n global: 0,\r\n };\r\n _options: ModuleBuilderOptions;\r\n _resolvedFeatures: Set;\r\n\r\n constructor(\r\n name: string,\r\n options: ModuleBuilderOptions = { generateNameSection: true, disableVerification: false }\r\n ) {\r\n Arg.notNull('name', name);\r\n this._name = name;\r\n this._options = options || ModuleBuilder.defaultOptions;\r\n this._resolvedFeatures = ModuleBuilder._resolveFeatures(this._options);\r\n }\r\n\r\n static _resolveFeatures(options: ModuleBuilderOptions): Set {\r\n const target = options.target || 'latest';\r\n const baseFeatures = ModuleBuilder.targetFeatures[target];\r\n const extra = options.features || [];\r\n return new Set([...baseFeatures, ...extra]);\r\n }\r\n\r\n get features(): Set {\r\n return this._resolvedFeatures;\r\n }\r\n\r\n hasFeature(feature: WasmFeature): boolean {\r\n return this._resolvedFeatures.has(feature);\r\n }\r\n\r\n get disableVerification(): boolean {\r\n return this._options && this._options.disableVerification === true;\r\n }\r\n\r\n defineFuncType(\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[]\r\n ): FuncTypeBuilder {\r\n let normalizedReturnTypes: ValueTypeDescriptor[];\r\n if (!returnTypes) {\r\n normalizedReturnTypes = [];\r\n } else if (!Array.isArray(returnTypes)) {\r\n normalizedReturnTypes = [returnTypes];\r\n } else {\r\n normalizedReturnTypes = returnTypes;\r\n }\r\n\r\n if (normalizedReturnTypes.length > 1 && !this._resolvedFeatures.has('multi-value')) {\r\n throw new Error('A method can only return zero to one values. Enable the multi-value feature to allow multiple return values.');\r\n }\r\n\r\n const funcTypeKey = FuncTypeBuilder.createKey(normalizedReturnTypes, parameters);\r\n let funcType = this._types.find((x) => x.key === funcTypeKey);\r\n if (!funcType) {\r\n funcType = new FuncTypeBuilder(\r\n funcTypeKey,\r\n normalizedReturnTypes,\r\n parameters,\r\n this._types.length\r\n );\r\n this._types.push(funcType);\r\n }\r\n\r\n return funcType;\r\n }\r\n\r\n importFunction(\r\n moduleName: string,\r\n name: string,\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[]\r\n ): ImportBuilder {\r\n const funcType = this.defineFuncType(returnTypes, parameters);\r\n if (\r\n this._imports.some(\r\n (x) =>\r\n x.externalKind === ExternalKind.Function &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Function,\r\n funcType,\r\n this._importsIndexSpace.function++\r\n );\r\n this._imports.push(importBuilder);\r\n this._functions.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n importTable(\r\n moduleName: string,\r\n name: string,\r\n elementType: ElementTypeDescriptor,\r\n initialSize: number,\r\n maximumSize: number | null = null\r\n ): ImportBuilder {\r\n if (\r\n this._imports.find(\r\n (x) =>\r\n x.externalKind === ExternalKind.Table &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const tableType = new TableType(\r\n elementType,\r\n new ResizableLimits(initialSize, maximumSize)\r\n );\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Table,\r\n tableType,\r\n this._importsIndexSpace.table++\r\n );\r\n this._imports.push(importBuilder);\r\n this._tables.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n importMemory(\r\n moduleName: string,\r\n name: string,\r\n initialSize: number,\r\n maximumSize: number | null = null,\r\n shared: boolean = false\r\n ): ImportBuilder {\r\n Arg.string('moduleName', moduleName);\r\n Arg.string('name', name);\r\n Arg.number('initialSize', initialSize);\r\n\r\n if (\r\n this._imports.find(\r\n (x) =>\r\n x.externalKind === ExternalKind.Memory &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n if ((this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) && !this._resolvedFeatures.has('multi-memory')) {\r\n throw new VerificationError('Only one memory is allowed per module. Enable the multi-memory feature to allow multiple memories.');\r\n }\r\n\r\n const memoryType = new MemoryType(new ResizableLimits(initialSize, maximumSize), shared);\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Memory,\r\n memoryType,\r\n this._importsIndexSpace.memory++\r\n );\r\n this._imports.push(importBuilder);\r\n\r\n return importBuilder;\r\n }\r\n\r\n importGlobal(\r\n moduleName: string,\r\n name: string,\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean\r\n ): ImportBuilder {\r\n if (\r\n this._imports.some(\r\n (x) =>\r\n x.externalKind === ExternalKind.Global &&\r\n x.moduleName === moduleName &&\r\n x.fieldName === name\r\n )\r\n ) {\r\n throw new Error(`An import already existing for ${moduleName}.${name}`);\r\n }\r\n\r\n const globalType = new GlobalType(valueType, mutable);\r\n const importBuilder = new ImportBuilder(\r\n moduleName,\r\n name,\r\n ExternalKind.Global,\r\n globalType,\r\n this._importsIndexSpace.global++\r\n );\r\n this._imports.push(importBuilder);\r\n this._globals.forEach((x) => {\r\n x._index++;\r\n });\r\n\r\n return importBuilder;\r\n }\r\n\r\n defineFunction(\r\n name: string,\r\n returnTypes: ValueTypeDescriptor[] | ValueTypeDescriptor | null,\r\n parameters: ValueTypeDescriptor[],\r\n createCallback?: (func: FunctionBuilder, asm: FunctionEmitter) => void\r\n ): FunctionBuilder {\r\n const existing = this._functions.find((x) => x.name === name);\r\n if (existing) {\r\n throw new Error(`Function has already been defined with the name ${name}`);\r\n }\r\n\r\n const funcType = this.defineFuncType(returnTypes, parameters);\r\n const functionBuilder = new FunctionBuilder(\r\n this,\r\n name,\r\n funcType,\r\n this._functions.length + this._importsIndexSpace.function\r\n );\r\n this._functions.push(functionBuilder);\r\n\r\n if (createCallback) {\r\n functionBuilder.createEmitter((x) => {\r\n createCallback(functionBuilder, x);\r\n });\r\n }\r\n\r\n return functionBuilder;\r\n }\r\n\r\n defineTable(\r\n elementType: ElementTypeDescriptor,\r\n initialSize: number,\r\n maximumSize: number | null = null\r\n ): TableBuilder {\r\n if (this._tables.length >= 1 && !this._resolvedFeatures.has('multi-table')) {\r\n throw new Error('Only one table can be created per module. Enable the multi-table feature to allow multiple tables.');\r\n }\r\n\r\n const table = new TableBuilder(\r\n this,\r\n elementType,\r\n new ResizableLimits(initialSize, maximumSize),\r\n this._tables.length + this._importsIndexSpace.table\r\n );\r\n this._tables.push(table);\r\n return table;\r\n }\r\n\r\n defineMemory(initialSize: number, maximumSize: number | null = null, shared: boolean = false, memory64: boolean = false): MemoryBuilder {\r\n if ((this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) && !this._resolvedFeatures.has('multi-memory')) {\r\n throw new VerificationError('Only one memory is allowed per module. Enable the multi-memory feature to allow multiple memories.');\r\n }\r\n\r\n const memory = new MemoryBuilder(\r\n this,\r\n new ResizableLimits(initialSize, maximumSize),\r\n this._memories.length + this._importsIndexSpace.memory,\r\n shared,\r\n memory64\r\n );\r\n this._memories.push(memory);\r\n return memory;\r\n }\r\n\r\n defineGlobal(\r\n valueType: ValueTypeDescriptor,\r\n mutable: boolean,\r\n value?: number | GlobalBuilder | ((asm: any) => void)\r\n ): GlobalBuilder {\r\n const globalBuilder = new GlobalBuilder(\r\n this,\r\n valueType,\r\n mutable,\r\n this._globals.length + this._importsIndexSpace.global\r\n );\r\n if (value !== undefined) {\r\n globalBuilder.value(value);\r\n }\r\n\r\n this._globals.push(globalBuilder);\r\n return globalBuilder;\r\n }\r\n\r\n defineTag(\r\n parameters: ValueTypeDescriptor[]\r\n ): TagBuilder {\r\n // Tags have no return types \u2014 they describe the exception payload\r\n const funcType = this.defineFuncType(null, parameters);\r\n const tagBuilder = new TagBuilder(\r\n this,\r\n funcType,\r\n this._tags.length\r\n );\r\n this._tags.push(tagBuilder);\r\n return tagBuilder;\r\n }\r\n\r\n setStartFunction(functionBuilder: FunctionBuilder): void {\r\n Arg.instanceOf('functionBuilder', functionBuilder, FunctionBuilder);\r\n this._startFunction = functionBuilder;\r\n }\r\n\r\n exportFunction(functionBuilder: FunctionBuilder, name: string | null = null): ExportBuilder {\r\n Arg.instanceOf('functionBuilder', functionBuilder, FunctionBuilder);\r\n\r\n const functionName = name || functionBuilder.name;\r\n Arg.notEmptyString('name', functionName);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Function && x.name === functionName\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a function named ${functionName}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(\r\n functionName,\r\n ExternalKind.Function,\r\n functionBuilder\r\n );\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportMemory(memoryBuilder: MemoryBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('memoryBuilder', memoryBuilder, MemoryBuilder);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Memory && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for memory named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Memory, memoryBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportTable(tableBuilder: TableBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('tableBuilder', tableBuilder, TableBuilder);\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Table && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a table named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Table, tableBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n exportGlobal(globalBuilder: GlobalBuilder, name: string): ExportBuilder {\r\n Arg.notEmptyString('name', name);\r\n Arg.instanceOf('globalBuilder', globalBuilder, GlobalBuilder);\r\n if (globalBuilder.globalType.mutable && !this.disableVerification && !this._resolvedFeatures.has('mutable-globals')) {\r\n throw new VerificationError('Cannot export a mutable global. Enable the mutable-globals feature to allow this.');\r\n }\r\n\r\n if (\r\n this._exports.find(\r\n (x) => x.externalKind === ExternalKind.Global && x.name === name\r\n )\r\n ) {\r\n throw new Error(`An export already existing for a global named ${name}.`);\r\n }\r\n\r\n const exportBuilder = new ExportBuilder(name, ExternalKind.Global, globalBuilder);\r\n this._exports.push(exportBuilder);\r\n return exportBuilder;\r\n }\r\n\r\n defineTableSegment(\r\n table: TableBuilder,\r\n elements: (FunctionBuilder | ImportBuilder)[],\r\n offset?: number | GlobalBuilder | ((asm: any) => void)\r\n ): ElementSegmentBuilder {\r\n const segment = new ElementSegmentBuilder(table, elements, this._resolvedFeatures);\r\n if (offset !== undefined) {\r\n segment.offset(offset as any);\r\n }\r\n\r\n this._elements.push(segment);\r\n return segment;\r\n }\r\n\r\n definePassiveElementSegment(\r\n elements: (FunctionBuilder | ImportBuilder)[]\r\n ): ElementSegmentBuilder {\r\n const segment = new ElementSegmentBuilder(null, elements, this._resolvedFeatures);\r\n segment.passive();\r\n this._elements.push(segment);\r\n return segment;\r\n }\r\n\r\n defineData(\r\n data: Uint8Array,\r\n offset?: number | GlobalBuilder | ((asm: any) => void)\r\n ): DataSegmentBuilder {\r\n Arg.instanceOf('data', data, Uint8Array);\r\n\r\n const dataSegmentBuilder = new DataSegmentBuilder(data, this._resolvedFeatures);\r\n if (offset !== undefined) {\r\n dataSegmentBuilder.offset(offset as any);\r\n }\r\n\r\n this._data.push(dataSegmentBuilder);\r\n return dataSegmentBuilder;\r\n }\r\n\r\n defineCustomSection(name: string, data?: Uint8Array): CustomSectionBuilder {\r\n Arg.notEmptyString('name', name);\r\n\r\n if (this._customSections.find((x) => x.name === name)) {\r\n throw new Error(`A custom section already exists with the name ${name}.`);\r\n }\r\n\r\n if (name === 'name') {\r\n throw new Error(\"The 'name' custom section is reserved.\");\r\n }\r\n\r\n const customSectionBuilder = new CustomSectionBuilder(name, data);\r\n this._customSections.push(customSectionBuilder);\r\n return customSectionBuilder;\r\n }\r\n\r\n async instantiate(imports?: WebAssembly.Imports): Promise {\r\n const moduleBytes = this.toBytes();\r\n return WebAssembly.instantiate(moduleBytes.buffer as ArrayBuffer, imports);\r\n }\r\n\r\n async compile(): Promise {\r\n const moduleBytes = this.toBytes();\r\n return WebAssembly.compile(moduleBytes.buffer as ArrayBuffer);\r\n }\r\n\r\n toString(): string {\r\n const writer = new TextModuleWriter(this);\r\n return writer.toString();\r\n }\r\n\r\n toBytes(): Uint8Array {\r\n const writer = new BinaryModuleWriter(this);\r\n return writer.write();\r\n }\r\n}\r\n", "import ModuleBuilder from './ModuleBuilder';\r\nimport { ModuleBuilderOptions } from './types';\r\n\r\nexport interface CompiledPackage {\r\n [moduleName: string]: WebAssembly.Module;\r\n}\r\n\r\nexport interface InstantiatedPackage {\r\n [moduleName: string]: WebAssembly.Instance;\r\n}\r\n\r\ninterface ModuleEntry {\r\n name: string;\r\n moduleBuilder: ModuleBuilder;\r\n dependencies: string[];\r\n}\r\n\r\nexport default class PackageBuilder {\r\n _modules: ModuleEntry[] = [];\r\n\r\n defineModule(\r\n name: string,\r\n options?: ModuleBuilderOptions\r\n ): ModuleBuilder {\r\n if (this._modules.find((m) => m.name === name)) {\r\n throw new Error(`A module with the name \"${name}\" already exists.`);\r\n }\r\n\r\n const moduleBuilder = new ModuleBuilder(name, options);\r\n this._modules.push({ name, moduleBuilder, dependencies: [] });\r\n return moduleBuilder;\r\n }\r\n\r\n addDependency(moduleName: string, dependsOn: string): void {\r\n const entry = this._modules.find((m) => m.name === moduleName);\r\n if (!entry) {\r\n throw new Error(`Module \"${moduleName}\" not found.`);\r\n }\r\n if (!this._modules.find((m) => m.name === dependsOn)) {\r\n throw new Error(`Dependency module \"${dependsOn}\" not found.`);\r\n }\r\n if (!entry.dependencies.includes(dependsOn)) {\r\n entry.dependencies.push(dependsOn);\r\n }\r\n }\r\n\r\n getModule(name: string): ModuleBuilder | undefined {\r\n return this._modules.find((m) => m.name === name)?.moduleBuilder;\r\n }\r\n\r\n private topologicalSort(): ModuleEntry[] {\r\n const visited = new Set();\r\n const sorted: ModuleEntry[] = [];\r\n const visiting = new Set();\r\n\r\n const visit = (name: string): void => {\r\n if (visited.has(name)) return;\r\n if (visiting.has(name)) {\r\n throw new Error(`Circular dependency detected involving module \"${name}\".`);\r\n }\r\n\r\n visiting.add(name);\r\n const entry = this._modules.find((m) => m.name === name)!;\r\n\r\n for (const dep of entry.dependencies) {\r\n visit(dep);\r\n }\r\n\r\n visiting.delete(name);\r\n visited.add(name);\r\n sorted.push(entry);\r\n };\r\n\r\n for (const entry of this._modules) {\r\n visit(entry.name);\r\n }\r\n\r\n return sorted;\r\n }\r\n\r\n async compile(): Promise {\r\n const sorted = this.topologicalSort();\r\n const result: CompiledPackage = {};\r\n\r\n for (const entry of sorted) {\r\n const bytes = entry.moduleBuilder.toBytes();\r\n result[entry.name] = await WebAssembly.compile(bytes.buffer as ArrayBuffer);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n async instantiate(\r\n imports: { [moduleName: string]: WebAssembly.Imports } = {}\r\n ): Promise {\r\n const sorted = this.topologicalSort();\r\n const result: InstantiatedPackage = {};\r\n\r\n for (const entry of sorted) {\r\n const bytes = entry.moduleBuilder.toBytes();\r\n const moduleImports: WebAssembly.Imports = {};\r\n\r\n // Merge user-provided imports\r\n if (imports[entry.name]) {\r\n Object.assign(moduleImports, imports[entry.name]);\r\n }\r\n\r\n // Wire up exports from dependency modules as imports\r\n for (const depName of entry.dependencies) {\r\n const depInstance = result[depName];\r\n if (depInstance) {\r\n moduleImports[depName] = depInstance.exports as WebAssembly.ModuleImports;\r\n }\r\n }\r\n\r\n const instantiated = await WebAssembly.instantiate(bytes.buffer as ArrayBuffer, moduleImports);\r\n const instance = instantiated.instance;\r\n result[entry.name] = instance;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n", "import ModuleBuilder from './ModuleBuilder';\r\nimport OpCodes from './OpCodes';\r\nimport {\r\n ValueType,\r\n ValueTypeDescriptor,\r\n BlockType,\r\n BlockTypeDescriptor,\r\n ElementType,\r\n ExternalKind,\r\n OpCodeDef,\r\n ModuleBuilderOptions,\r\n} from './types';\r\nimport FunctionBuilder from './FunctionBuilder';\r\nimport FunctionEmitter from './FunctionEmitter';\r\nimport ImportBuilder from './ImportBuilder';\r\n\r\n// --- Tokenizer ---\r\n\r\nenum TokenType {\r\n LeftParen = 'LeftParen',\r\n RightParen = 'RightParen',\r\n String = 'String',\r\n Number = 'Number',\r\n Keyword = 'Keyword',\r\n Id = 'Id',\r\n EOF = 'EOF',\r\n}\r\n\r\ninterface Token {\r\n type: TokenType;\r\n value: string;\r\n line: number;\r\n col: number;\r\n}\r\n\r\nfunction tokenize(source: string): Token[] {\r\n const tokens: Token[] = [];\r\n let pos = 0;\r\n let line = 1;\r\n let col = 1;\r\n\r\n function advance(n: number = 1): void {\r\n for (let i = 0; i < n; i++) {\r\n if (source[pos] === '\\n') {\r\n line++;\r\n col = 1;\r\n } else {\r\n col++;\r\n }\r\n pos++;\r\n }\r\n }\r\n\r\n while (pos < source.length) {\r\n const ch = source[pos];\r\n\r\n // Whitespace\r\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') {\r\n advance();\r\n continue;\r\n }\r\n\r\n // Line comment\r\n if (ch === ';' && source[pos + 1] === ';') {\r\n while (pos < source.length && source[pos] !== '\\n') advance();\r\n continue;\r\n }\r\n\r\n // Block comment (;...;) - skip entirely\r\n if (ch === '(' && source[pos + 1] === ';') {\r\n advance(2);\r\n let depth = 1;\r\n while (pos < source.length && depth > 0) {\r\n if (source[pos] === '(' && source[pos + 1] === ';') {\r\n depth++;\r\n advance(2);\r\n } else if (source[pos] === ';' && source[pos + 1] === ')') {\r\n depth--;\r\n advance(2);\r\n } else {\r\n advance();\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n const startLine = line;\r\n const startCol = col;\r\n\r\n if (ch === '(') {\r\n tokens.push({ type: TokenType.LeftParen, value: '(', line: startLine, col: startCol });\r\n advance();\r\n continue;\r\n }\r\n\r\n if (ch === ')') {\r\n tokens.push({ type: TokenType.RightParen, value: ')', line: startLine, col: startCol });\r\n advance();\r\n continue;\r\n }\r\n\r\n // String literal\r\n if (ch === '\"') {\r\n advance();\r\n let str = '';\r\n while (pos < source.length && source[pos] !== '\"') {\r\n if (source[pos] === '\\\\') {\r\n advance();\r\n const esc = source[pos];\r\n if (esc === 'n') str += '\\n';\r\n else if (esc === 't') str += '\\t';\r\n else if (esc === '\\\\') str += '\\\\';\r\n else if (esc === '\"') str += '\"';\r\n else if (esc === '\\'') str += '\\'';\r\n else {\r\n // Hex escape \\XX\r\n const hex = source.substring(pos, pos + 2);\r\n str += String.fromCharCode(parseInt(hex, 16));\r\n advance();\r\n }\r\n advance();\r\n } else {\r\n str += source[pos];\r\n advance();\r\n }\r\n }\r\n advance(); // closing \"\r\n tokens.push({ type: TokenType.String, value: str, line: startLine, col: startCol });\r\n continue;\r\n }\r\n\r\n // Id ($name)\r\n if (ch === '$') {\r\n let id = '';\r\n advance();\r\n while (pos < source.length && !isDelimiter(source[pos])) {\r\n id += source[pos];\r\n advance();\r\n }\r\n tokens.push({ type: TokenType.Id, value: '$' + id, line: startLine, col: startCol });\r\n continue;\r\n }\r\n\r\n // Number or keyword\r\n let word = '';\r\n while (pos < source.length && !isDelimiter(source[pos])) {\r\n word += source[pos];\r\n advance();\r\n }\r\n\r\n if (isNumericToken(word)) {\r\n tokens.push({ type: TokenType.Number, value: word, line: startLine, col: startCol });\r\n } else {\r\n tokens.push({ type: TokenType.Keyword, value: word, line: startLine, col: startCol });\r\n }\r\n }\r\n\r\n tokens.push({ type: TokenType.EOF, value: '', line, col });\r\n return tokens;\r\n}\r\n\r\nfunction isDelimiter(ch: string): boolean {\r\n return ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r' ||\r\n ch === '(' || ch === ')' || ch === ';' || ch === '\"';\r\n}\r\n\r\nfunction isNumericToken(word: string): boolean {\r\n if (/^[+-]?\\d/.test(word)) return true;\r\n if (/^[+-]?0x[0-9a-fA-F]/.test(word)) return true;\r\n if (/^[+-]?inf$/.test(word)) return true;\r\n if (/^[+-]?nan/.test(word)) return true;\r\n return false;\r\n}\r\n\r\n// --- Parser ---\r\n\r\nconst valueTypeMap: Record = {\r\n 'i32': ValueType.Int32,\r\n 'i64': ValueType.Int64,\r\n 'f32': ValueType.Float32,\r\n 'f64': ValueType.Float64,\r\n 'v128': ValueType.V128,\r\n};\r\n\r\nconst blockTypeMap: Record = {\r\n 'i32': BlockType.Int32,\r\n 'i64': BlockType.Int64,\r\n 'f32': BlockType.Float32,\r\n 'f64': BlockType.Float64,\r\n 'v128': BlockType.V128,\r\n};\r\n\r\n// Build mnemonic \u2192 opcode lookup\r\nconst mnemonicToOpCode: Map = new Map();\r\nfor (const [, opCode] of Object.entries(OpCodes)) {\r\n const op = opCode as OpCodeDef;\r\n mnemonicToOpCode.set(op.mnemonic, op);\r\n}\r\n\r\nclass WatParserImpl {\r\n tokens: Token[];\r\n pos: number;\r\n moduleBuilder!: ModuleBuilder;\r\n funcNames: Map = new Map();\r\n globalNames: Map = new Map();\r\n typeNames: Map = new Map();\r\n funcList: (FunctionBuilder | ImportBuilder)[] = [];\r\n labelStack: { name: string; label: any }[] = [];\r\n\r\n constructor(tokens: Token[]) {\r\n this.tokens = tokens;\r\n this.pos = 0;\r\n }\r\n\r\n // --- Token navigation ---\r\n\r\n peek(): Token {\r\n return this.tokens[this.pos];\r\n }\r\n\r\n advance(): Token {\r\n return this.tokens[this.pos++];\r\n }\r\n\r\n expect(type: TokenType, value?: string): Token {\r\n const tok = this.advance();\r\n if (tok.type !== type) {\r\n throw this.error(`Expected ${type}${value ? ` '${value}'` : ''} but got ${tok.type} '${tok.value}'`, tok);\r\n }\r\n if (value !== undefined && tok.value !== value) {\r\n throw this.error(`Expected '${value}' but got '${tok.value}'`, tok);\r\n }\r\n return tok;\r\n }\r\n\r\n expectKeyword(value: string): Token {\r\n return this.expect(TokenType.Keyword, value);\r\n }\r\n\r\n isKeyword(value: string): boolean {\r\n const tok = this.peek();\r\n return tok.type === TokenType.Keyword && tok.value === value;\r\n }\r\n\r\n isLeftParen(): boolean {\r\n return this.peek().type === TokenType.LeftParen;\r\n }\r\n\r\n isRightParen(): boolean {\r\n return this.peek().type === TokenType.RightParen;\r\n }\r\n\r\n // Skip optional inline comment like (;0;)\r\n skipInlineComment(): void {\r\n while (this.isLeftParen() && this.tokens[this.pos + 1]?.type === TokenType.Keyword &&\r\n this.tokens[this.pos + 1]?.value.startsWith(';')) {\r\n // This is a (;N;) comment \u2014 tokenizer should have removed it, but skip manually\r\n this.advance(); // (\r\n while (!this.isRightParen()) this.advance();\r\n this.advance(); // )\r\n }\r\n }\r\n\r\n error(message: string, tok?: Token): Error {\r\n const t = tok || this.peek();\r\n return new Error(`WAT parse error at ${t.line}:${t.col}: ${message}`);\r\n }\r\n\r\n // --- Parsing ---\r\n\r\n parse(options?: ModuleBuilderOptions): ModuleBuilder {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('module');\r\n\r\n let name = 'module';\r\n if (this.peek().type === TokenType.Id) {\r\n name = this.advance().value.substring(1); // strip $\r\n }\r\n\r\n this.moduleBuilder = new ModuleBuilder(name, options);\r\n\r\n // First pass: parse all sections\r\n while (!this.isRightParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const section = this.advance();\r\n\r\n switch (section.value) {\r\n case 'type':\r\n this.parseType();\r\n break;\r\n case 'import':\r\n this.parseImport();\r\n break;\r\n case 'func':\r\n this.parseFunc();\r\n break;\r\n case 'table':\r\n this.parseTable();\r\n break;\r\n case 'memory':\r\n this.parseMemory();\r\n break;\r\n case 'global':\r\n this.parseGlobal();\r\n break;\r\n case 'export':\r\n this.parseExport();\r\n break;\r\n case 'start':\r\n this.parseStart();\r\n break;\r\n case 'elem':\r\n this.parseElem();\r\n break;\r\n case 'data':\r\n this.parseData();\r\n break;\r\n default:\r\n // Skip unknown section\r\n this.skipSExpr();\r\n break;\r\n }\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing module paren\r\n return this.moduleBuilder;\r\n }\r\n\r\n // Skip remainder of current S-expression (we've already consumed opening keyword)\r\n skipSExpr(): void {\r\n let depth = 0;\r\n while (true) {\r\n const tok = this.peek();\r\n if (tok.type === TokenType.EOF) break;\r\n if (tok.type === TokenType.LeftParen) {\r\n depth++;\r\n this.advance();\r\n } else if (tok.type === TokenType.RightParen) {\r\n if (depth === 0) {\r\n this.advance();\r\n return;\r\n }\r\n depth--;\r\n this.advance();\r\n } else {\r\n this.advance();\r\n }\r\n }\r\n }\r\n\r\n // --- Type section ---\r\n\r\n parseType(): void {\r\n // (type $name (func (param i32 i32) (result i32)))\r\n // (type (;0;) (func (param i32 i32) (result i32)))\r\n // We already consumed: ( type\r\n let typeName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n typeName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('func');\r\n\r\n const params: ValueTypeDescriptor[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n\r\n while (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.advance().value;\r\n if (kw === 'param') {\r\n while (!this.isRightParen()) {\r\n // skip $name in param\r\n if (this.peek().type === TokenType.Id) this.advance();\r\n else params.push(this.parseValueType());\r\n }\r\n } else if (kw === 'result') {\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n this.expect(TokenType.RightParen); // closing type\r\n\r\n const funcType = this.moduleBuilder.defineFuncType(results.length > 0 ? results : null, params);\r\n if (typeName) {\r\n this.typeNames.set(typeName, funcType.index);\r\n }\r\n }\r\n\r\n // --- Import section ---\r\n\r\n parseImport(): void {\r\n // (import \"module\" \"name\" (func (;0;) (type 0)))\r\n const moduleName = this.expect(TokenType.String).value;\r\n const fieldName = this.expect(TokenType.String).value;\r\n\r\n this.expect(TokenType.LeftParen);\r\n const kind = this.advance().value;\r\n\r\n if (kind === 'func') {\r\n this.parseImportFunc(moduleName, fieldName);\r\n } else if (kind === 'table') {\r\n this.parseImportTable(moduleName, fieldName);\r\n } else if (kind === 'memory') {\r\n this.parseImportMemory(moduleName, fieldName);\r\n } else if (kind === 'global') {\r\n this.parseImportGlobal(moduleName, fieldName);\r\n } else {\r\n throw this.error(`Unknown import kind: ${kind}`);\r\n }\r\n }\r\n\r\n parseImportFunc(moduleName: string, fieldName: string): void {\r\n // (func $name (type 0))\r\n // OR: (func $name (param i32) (result i32))\r\n let importFuncName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n importFuncName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n\r\n let funcReturnTypes: ValueTypeDescriptor[] | null = null;\r\n let funcParamTypes: ValueTypeDescriptor[] = [];\r\n\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'type') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n const typeIndex = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n const funcType = this.moduleBuilder._types[typeIndex];\r\n funcReturnTypes = funcType.returnTypes.length > 0 ? funcType.returnTypes : null;\r\n funcParamTypes = funcType.parameterTypes;\r\n } else {\r\n // Parse inline (param ...) (result ...)\r\n const params: ValueTypeDescriptor[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n while (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.peek().value;\r\n if (kw === 'param') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) this.advance();\r\n else params.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'result') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n break;\r\n }\r\n }\r\n funcReturnTypes = results.length > 0 ? results : null;\r\n funcParamTypes = params;\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n const imp = this.moduleBuilder.importFunction(moduleName, fieldName,\r\n funcReturnTypes, funcParamTypes\r\n );\r\n if (importFuncName) {\r\n this.funcNames.set(importFuncName, imp.index);\r\n }\r\n this.funcList.push(imp);\r\n }\r\n\r\n parseImportTable(moduleName: string, fieldName: string): void {\r\n // (table (;0;) 1 10 anyfunc)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n let elemType = 'anyfunc';\r\n\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n if (this.peek().type === TokenType.Keyword) {\r\n elemType = this.advance().value;\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing table\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importTable(moduleName, fieldName, ElementType.AnyFunc, initial, maximum);\r\n }\r\n\r\n parseImportMemory(moduleName: string, fieldName: string): void {\r\n // (memory (;0;) 1 2)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen); // closing memory\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importMemory(moduleName, fieldName, initial, maximum);\r\n }\r\n\r\n parseImportGlobal(moduleName: string, fieldName: string): void {\r\n // (global (;0;) i32) or (global (;0;) (mut i32))\r\n let mutable = false;\r\n let valueType: ValueTypeDescriptor;\r\n\r\n if (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('mut');\r\n valueType = this.parseValueType();\r\n mutable = true;\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n valueType = this.parseValueType();\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing global\r\n this.expect(TokenType.RightParen); // closing import\r\n\r\n this.moduleBuilder.importGlobal(moduleName, fieldName, valueType, mutable);\r\n }\r\n\r\n // --- Function section ---\r\n\r\n parseFunc(): void {\r\n // (func $name (;1;) (type 0) (param i32) (result i32) (local i32) ...)\r\n // OR: (func $name (param i32) (param i32) (result i32) ...)\r\n let name: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n name = this.advance().value.substring(1);\r\n }\r\n\r\n this.skipInlineComment();\r\n\r\n // Check if there's an explicit (type N)\r\n let hasExplicitType = false;\r\n let typeIndex = -1;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'type') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n typeIndex = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n hasExplicitType = true;\r\n }\r\n\r\n const params: ValueTypeDescriptor[] = [];\r\n const paramNames: (string | null)[] = [];\r\n const results: ValueTypeDescriptor[] = [];\r\n\r\n // Parse optional (param ...) and (result ...)\r\n while (this.isLeftParen() && !this.isInstruction()) {\r\n const savedPos = this.pos;\r\n this.expect(TokenType.LeftParen);\r\n const kw = this.peek().value;\r\n\r\n if (kw === 'param') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) {\r\n const pName = this.advance().value.substring(1); // strip $\r\n params.push(this.parseValueType());\r\n paramNames.push(pName);\r\n } else {\r\n params.push(this.parseValueType());\r\n paramNames.push(null);\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'result') {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n results.push(this.parseValueType());\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else if (kw === 'local') {\r\n // Will be handled in instruction parsing\r\n this.pos = savedPos;\r\n break;\r\n } else {\r\n this.pos = savedPos;\r\n break;\r\n }\r\n }\r\n\r\n let funcReturnTypes: ValueTypeDescriptor[] | null;\r\n let funcParamTypes: ValueTypeDescriptor[];\r\n\r\n if (hasExplicitType) {\r\n const funcType = this.moduleBuilder._types[typeIndex];\r\n funcReturnTypes = funcType.returnTypes.length > 0 ? funcType.returnTypes : null;\r\n funcParamTypes = funcType.parameterTypes;\r\n } else {\r\n funcReturnTypes = results.length > 0 ? results : null;\r\n funcParamTypes = params;\r\n }\r\n\r\n const funcBuilder = this.moduleBuilder.defineFunction(\r\n name || `func_${this.moduleBuilder._functions.length - 1 + this.moduleBuilder._importsIndexSpace.function}`,\r\n funcReturnTypes,\r\n funcParamTypes\r\n );\r\n\r\n // Apply parameter names\r\n if (!hasExplicitType) {\r\n paramNames.forEach((pName, i) => {\r\n if (pName !== null && i < funcBuilder.parameters.length) {\r\n funcBuilder.parameters[i].withName(pName);\r\n }\r\n });\r\n }\r\n\r\n if (name) {\r\n this.funcNames.set('$' + name, funcBuilder._index);\r\n }\r\n this.funcList.push(funcBuilder);\r\n\r\n // Check if there are locals or instructions\r\n if (this.isRightParen()) {\r\n this.expect(TokenType.RightParen);\r\n return;\r\n }\r\n\r\n // Parse body\r\n this.labelStack = [];\r\n funcBuilder.createEmitter((asm) => {\r\n this.parseFuncBody(asm, funcBuilder);\r\n });\r\n\r\n this.expect(TokenType.RightParen); // closing func\r\n }\r\n\r\n parseFuncBody(asm: FunctionEmitter, func: FunctionBuilder): void {\r\n // Parse locals first\r\n while (this.isLeftParen()) {\r\n const savedPos = this.pos;\r\n this.expect(TokenType.LeftParen);\r\n if (this.isKeyword('local')) {\r\n this.advance();\r\n while (!this.isRightParen()) {\r\n if (this.peek().type === TokenType.Id) {\r\n const localName = this.advance().value.substring(1); // strip $\r\n const vt = this.parseValueType();\r\n asm.declareLocal(vt, localName);\r\n } else {\r\n const vt = this.parseValueType();\r\n asm.declareLocal(vt);\r\n }\r\n }\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n this.pos = savedPos;\r\n break;\r\n }\r\n }\r\n\r\n // Parse instructions until closing )\r\n while (!this.isRightParen()) {\r\n this.parseInstruction(asm, func);\r\n }\r\n }\r\n\r\n parseInstruction(asm: FunctionEmitter, func: FunctionBuilder): void {\r\n const tok = this.advance();\r\n const mnemonic = tok.value;\r\n\r\n // Special handling for block/loop/if which have block signatures\r\n if (mnemonic === 'block' || mnemonic === 'loop' || mnemonic === 'if') {\r\n // Check for optional $label\r\n let labelName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n labelName = this.advance().value;\r\n }\r\n let blockType: BlockTypeDescriptor = BlockType.Void;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'result') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('result');\r\n const vt = this.parseValueType();\r\n blockType = blockTypeMap[vt.name] || BlockType.Void;\r\n this.expect(TokenType.RightParen);\r\n }\r\n const label = asm.emit(mnemonicToOpCode.get(mnemonic)!, blockType);\r\n if (labelName && label) {\r\n this.labelStack.push({ name: labelName, label });\r\n }\r\n return;\r\n }\r\n\r\n // Handle 'end' \u2014 pop label stack\r\n if (mnemonic === 'end') {\r\n asm.emit(mnemonicToOpCode.get(mnemonic)!);\r\n if (this.labelStack.length > 0) {\r\n // Check if the most recent label matches current depth\r\n const cfStack = (asm as any)._controlFlowVerifier._stack;\r\n // After 'end' pops, check if the popped label was named\r\n const top = this.labelStack[this.labelStack.length - 1];\r\n // If the label's block depth matches, pop it\r\n if (top.label.block && !cfStack.includes(top.label)) {\r\n this.labelStack.pop();\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const opCode = mnemonicToOpCode.get(mnemonic);\r\n if (!opCode) {\r\n throw this.error(`Unknown instruction: ${mnemonic}`, tok);\r\n }\r\n\r\n // Parse immediates based on opcode definition\r\n if (!opCode.immediate) {\r\n asm.emit(opCode);\r\n return;\r\n }\r\n\r\n switch (opCode.immediate) {\r\n case 'VarInt32':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'VarInt64':\r\n asm.emit(opCode, this.parseI64Value());\r\n break;\r\n case 'Float32':\r\n asm.emit(opCode, this.parseFloat());\r\n break;\r\n case 'Float64':\r\n asm.emit(opCode, this.parseFloat());\r\n break;\r\n case 'VarUInt1':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'VarUInt32':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'Local':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'Global':\r\n asm.emit(opCode, this.resolveGlobal());\r\n break;\r\n case 'Function':\r\n asm.emit(opCode, this.resolveFunction());\r\n break;\r\n case 'IndirectFunction': {\r\n // (type N) or (type $name)\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('type');\r\n let typeIdx: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n typeIdx = this.typeNames.get(id)!;\r\n if (typeIdx === undefined) throw this.error(`Unknown type: ${id}`);\r\n } else {\r\n typeIdx = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n asm.emit(opCode, this.moduleBuilder._types[typeIdx]);\r\n break;\r\n }\r\n case 'RelativeDepth':\r\n asm.emit(opCode, this.resolveBranchTarget(asm));\r\n break;\r\n case 'BranchTable': {\r\n // default_target target1 target2 ...\r\n // Last one is default\r\n const targets: number[] = [];\r\n while (this.peek().type === TokenType.Number) {\r\n targets.push(this.parseNumber());\r\n }\r\n if (targets.length < 1) throw this.error('br_table requires at least a default target');\r\n const defaultTarget = targets.pop()!;\r\n // This is tricky with our label system; for now use raw depth values\r\n // by looking up labels on the control flow stack\r\n const defaultLabel = this.getLabelAtDepth(asm, defaultTarget);\r\n const labels = targets.map((t) => this.getLabelAtDepth(asm, t));\r\n asm.emit(opCode, defaultLabel, labels);\r\n break;\r\n }\r\n case 'MemoryImmediate': {\r\n let alignment = 0;\r\n let offset = 0;\r\n // Parse offset=N align=N\r\n while (this.peek().type === TokenType.Keyword && (\r\n this.peek().value.startsWith('offset=') || this.peek().value.startsWith('align=')\r\n )) {\r\n const kv = this.advance().value;\r\n const [key, val] = kv.split('=');\r\n if (key === 'offset') offset = parseInt(val, 10);\r\n else if (key === 'align') {\r\n const alignVal = parseInt(val, 10);\r\n alignment = Math.log2(alignVal);\r\n }\r\n }\r\n asm.emit(opCode, alignment, offset);\r\n break;\r\n }\r\n case 'BlockSignature': {\r\n // Already handled above for block/loop/if\r\n let blockType: BlockTypeDescriptor = BlockType.Void;\r\n if (this.isLeftParen() && this.tokens[this.pos + 1]?.value === 'result') {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('result');\r\n const vt = this.parseValueType();\r\n blockType = blockTypeMap[vt.name] || BlockType.Void;\r\n this.expect(TokenType.RightParen);\r\n }\r\n asm.emit(opCode, blockType);\r\n break;\r\n }\r\n case 'V128Const': {\r\n // v128.const i8x16 0 1 2 ... or hex format\r\n // For simplicity, parse 16 bytes\r\n const bytes = new Uint8Array(16);\r\n // Skip the lane type keyword (i8x16, i16x8, etc.)\r\n if (this.peek().type === TokenType.Keyword) this.advance();\r\n for (let i = 0; i < 16; i++) {\r\n bytes[i] = this.parseNumber() & 0xff;\r\n }\r\n asm.emit(opCode, bytes);\r\n break;\r\n }\r\n case 'LaneIndex':\r\n asm.emit(opCode, this.parseNumber());\r\n break;\r\n case 'ShuffleMask': {\r\n const mask = new Uint8Array(16);\r\n for (let i = 0; i < 16; i++) {\r\n mask[i] = this.parseNumber();\r\n }\r\n asm.emit(opCode, mask);\r\n break;\r\n }\r\n default:\r\n asm.emit(opCode);\r\n break;\r\n }\r\n }\r\n\r\n getLabelAtDepth(asm: FunctionEmitter, relativeDepth: number): any {\r\n const stack = (asm as any)._controlFlowVerifier._stack;\r\n const targetIndex = stack.length - 1 - relativeDepth;\r\n if (targetIndex < 0 || targetIndex >= stack.length) {\r\n throw this.error(`Invalid branch depth: ${relativeDepth}`);\r\n }\r\n return stack[targetIndex];\r\n }\r\n\r\n resolveBranchTarget(asm: FunctionEmitter): any {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n // Search label stack for matching name (search from top = most recent)\r\n for (let i = this.labelStack.length - 1; i >= 0; i--) {\r\n if (this.labelStack[i].name === id) {\r\n return this.labelStack[i].label;\r\n }\r\n }\r\n throw this.error(`Unknown label: ${id}`);\r\n }\r\n const depth = this.parseNumber();\r\n return this.getLabelAtDepth(asm, depth);\r\n }\r\n\r\n resolveFunction(): FunctionBuilder | ImportBuilder {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const index = this.funcNames.get(id);\r\n if (index === undefined) throw this.error(`Unknown function: ${id}`);\r\n return this.funcList[index];\r\n }\r\n const index = this.parseNumber();\r\n return this.funcList[index];\r\n }\r\n\r\n resolveGlobal(): any {\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const resolved = this.globalNames.get(id);\r\n if (resolved === undefined) throw this.error(`Unknown global: ${id}`);\r\n index = resolved;\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n const importedGlobals = this.moduleBuilder._imports.filter(\r\n (x) => x.externalKind === ExternalKind.Global\r\n );\r\n if (index < importedGlobals.length) {\r\n return importedGlobals[index];\r\n }\r\n return this.moduleBuilder._globals[index - importedGlobals.length];\r\n }\r\n\r\n // --- Table section ---\r\n\r\n parseTable(): void {\r\n // (table (;0;) 1 10 anyfunc)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n\r\n // element type\r\n if (this.peek().type === TokenType.Keyword) {\r\n this.advance(); // anyfunc or funcref\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.defineTable(ElementType.AnyFunc, initial, maximum);\r\n }\r\n\r\n // --- Memory section ---\r\n\r\n parseMemory(): void {\r\n // (memory (;0;) 1 2)\r\n const initial = this.parseNumber();\r\n let maximum: number | null = null;\r\n if (this.peek().type === TokenType.Number) {\r\n maximum = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.defineMemory(initial, maximum);\r\n }\r\n\r\n // --- Global section ---\r\n\r\n parseGlobal(): void {\r\n // (global $name i32 (i32.const 0))\r\n // (global $name (mut i32) (i32.const 0))\r\n // (global (;0;) i32 (i32.const 0))\r\n let globalName: string | null = null;\r\n if (this.peek().type === TokenType.Id) {\r\n globalName = this.advance().value;\r\n }\r\n this.skipInlineComment();\r\n\r\n let mutable = false;\r\n let valueType: ValueTypeDescriptor;\r\n\r\n if (this.isLeftParen()) {\r\n this.expect(TokenType.LeftParen);\r\n this.expectKeyword('mut');\r\n valueType = this.parseValueType();\r\n mutable = true;\r\n this.expect(TokenType.RightParen);\r\n } else {\r\n valueType = this.parseValueType();\r\n }\r\n\r\n // Parse init expression (instr)\r\n this.expect(TokenType.LeftParen);\r\n const initInstr = this.advance().value;\r\n let initValue: number | bigint = 0;\r\n\r\n if (initInstr === 'i32.const') {\r\n initValue = this.parseNumber();\r\n } else if (initInstr === 'i64.const') {\r\n initValue = this.parseI64Value();\r\n } else if (initInstr === 'f32.const') {\r\n initValue = this.parseFloat();\r\n } else if (initInstr === 'f64.const') {\r\n initValue = this.parseFloat();\r\n }\r\n\r\n this.expect(TokenType.RightParen); // closing init expr\r\n this.expect(TokenType.RightParen); // closing global\r\n\r\n const globalBuilder = this.moduleBuilder.defineGlobal(valueType, mutable, initValue as number);\r\n if (globalName) {\r\n globalBuilder.withName(globalName.substring(1)); // strip $\r\n this.globalNames.set(globalName, globalBuilder._index);\r\n }\r\n }\r\n\r\n // --- Export section ---\r\n\r\n parseExportIndex(): number {\r\n if (this.peek().type === TokenType.Id) {\r\n return -1; // handled by caller\r\n }\r\n return this.parseNumber();\r\n }\r\n\r\n parseExport(): void {\r\n // (export \"name\" (func 0))\r\n // (export \"name\" (func $name))\r\n const name = this.expect(TokenType.String).value;\r\n this.expect(TokenType.LeftParen);\r\n const kind = this.advance().value;\r\n\r\n switch (kind) {\r\n case 'func': {\r\n let funcIndex: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n funcIndex = this.funcNames.get(id)!;\r\n if (funcIndex === undefined) throw this.error(`Unknown function: ${id}`);\r\n } else {\r\n funcIndex = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen); // closing kind\r\n this.expect(TokenType.RightParen); // closing export\r\n const func = this.funcList[funcIndex];\r\n if (func instanceof ImportBuilder) {\r\n throw this.error('Cannot export an imported function directly');\r\n }\r\n this.moduleBuilder.exportFunction(func as FunctionBuilder, name);\r\n break;\r\n }\r\n case 'table': {\r\n const index = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.exportTable(this.moduleBuilder._tables[index], name);\r\n break;\r\n }\r\n case 'memory': {\r\n const index = this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n this.moduleBuilder.exportMemory(this.moduleBuilder._memories[index], name);\r\n break;\r\n }\r\n case 'global': {\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n index = this.globalNames.get(id)!;\r\n if (index === undefined) throw this.error(`Unknown global: ${id}`);\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n const importedGlobals = this.moduleBuilder._imports.filter(\r\n (x) => x.externalKind === ExternalKind.Global\r\n );\r\n if (index < importedGlobals.length) {\r\n throw this.error('Cannot export an imported global directly');\r\n }\r\n this.moduleBuilder.exportGlobal(\r\n this.moduleBuilder._globals[index - importedGlobals.length], name\r\n );\r\n break;\r\n }\r\n default: {\r\n this.parseNumber();\r\n this.expect(TokenType.RightParen);\r\n this.expect(TokenType.RightParen);\r\n }\r\n }\r\n }\r\n\r\n // --- Start section ---\r\n\r\n parseStart(): void {\r\n // (start 0) or (start $name)\r\n let index: number;\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n index = this.funcNames.get(id)!;\r\n if (index === undefined) throw this.error(`Unknown function: ${id}`);\r\n } else {\r\n index = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n const func = this.funcList[index];\r\n if (func instanceof FunctionBuilder) {\r\n this.moduleBuilder.setStartFunction(func);\r\n }\r\n }\r\n\r\n // --- Element section ---\r\n\r\n parseElem(): void {\r\n // (elem (;0;) (i32.const 0) func 0 1 2)\r\n // Parse offset expression\r\n this.expect(TokenType.LeftParen);\r\n const offsetInstr = this.advance().value;\r\n let offset = 0;\r\n if (offsetInstr === 'i32.const') {\r\n offset = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n\r\n // \"func\" keyword\r\n if (this.isKeyword('func')) {\r\n this.advance();\r\n }\r\n\r\n // Parse function indices or $name references\r\n const elements: (FunctionBuilder | ImportBuilder)[] = [];\r\n while (this.peek().type === TokenType.Number || this.peek().type === TokenType.Id) {\r\n if (this.peek().type === TokenType.Id) {\r\n const id = this.advance().value;\r\n const idx = this.funcNames.get(id);\r\n if (idx === undefined) throw this.error(`Unknown function: ${id}`);\r\n elements.push(this.funcList[idx]);\r\n } else {\r\n const idx = this.parseNumber();\r\n elements.push(this.funcList[idx]);\r\n }\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n\r\n const table = this.moduleBuilder._tables[0];\r\n this.moduleBuilder.defineTableSegment(table, elements, offset);\r\n }\r\n\r\n // --- Data section ---\r\n\r\n parseData(): void {\r\n // (data (;0;) (i32.const 0) \"hello\\00world\")\r\n this.expect(TokenType.LeftParen);\r\n const offsetInstr = this.advance().value;\r\n let offset = 0;\r\n if (offsetInstr === 'i32.const') {\r\n offset = this.parseNumber();\r\n }\r\n this.expect(TokenType.RightParen);\r\n\r\n const dataStr = this.expect(TokenType.String).value;\r\n const bytes = new Uint8Array(dataStr.length);\r\n for (let i = 0; i < dataStr.length; i++) {\r\n bytes[i] = dataStr.charCodeAt(i);\r\n }\r\n\r\n this.expect(TokenType.RightParen);\r\n\r\n this.moduleBuilder.defineData(bytes, offset);\r\n }\r\n\r\n // --- Helpers ---\r\n\r\n parseValueType(): ValueTypeDescriptor {\r\n const tok = this.advance();\r\n const vt = valueTypeMap[tok.value];\r\n if (!vt) throw this.error(`Unknown value type: ${tok.value}`, tok);\r\n return vt;\r\n }\r\n\r\n parseNumber(): number {\r\n const tok = this.advance();\r\n if (tok.value.startsWith('0x') || tok.value.startsWith('-0x') || tok.value.startsWith('+0x')) {\r\n return parseInt(tok.value.replace(/_/g, ''), 16);\r\n }\r\n return parseInt(tok.value.replace(/_/g, ''), 10);\r\n }\r\n\r\n parseFloat(): number {\r\n const tok = this.advance();\r\n const val = tok.value.replace(/_/g, '');\r\n if (val === 'inf' || val === '+inf') return Infinity;\r\n if (val === '-inf') return -Infinity;\r\n if (val.includes('nan')) return NaN;\r\n if (val.startsWith('0x') || val.startsWith('-0x') || val.startsWith('+0x')) {\r\n return this.parseHexFloat(val);\r\n }\r\n return parseFloat(val);\r\n }\r\n\r\n parseHexFloat(val: string): number {\r\n // Hex float format: 0xHH.HHpEE\r\n const negative = val.startsWith('-');\r\n const clean = val.replace(/^[+-]?0x/, '');\r\n const parts = clean.split('p');\r\n const mantissa = parts[0];\r\n const exponent = parts.length > 1 ? parseInt(parts[1], 10) : 0;\r\n\r\n let result: number;\r\n if (mantissa.includes('.')) {\r\n const [intPart, fracPart] = mantissa.split('.');\r\n result = parseInt(intPart || '0', 16) +\r\n parseInt(fracPart || '0', 16) / Math.pow(16, (fracPart || '').length);\r\n } else {\r\n result = parseInt(mantissa, 16);\r\n }\r\n\r\n result *= Math.pow(2, exponent);\r\n return negative ? -result : result;\r\n }\r\n\r\n parseI64Value(): number | bigint {\r\n const tok = this.advance();\r\n const val = tok.value.replace(/_/g, '');\r\n try {\r\n return BigInt(val);\r\n } catch {\r\n return parseInt(val, 10);\r\n }\r\n }\r\n\r\n isInstruction(): boolean {\r\n // Check if the next s-expr is an instruction (local or something else)\r\n if (!this.isLeftParen()) return false;\r\n const nextTok = this.tokens[this.pos + 1];\r\n if (!nextTok) return false;\r\n return nextTok.value !== 'param' && nextTok.value !== 'result' && nextTok.value !== 'type';\r\n }\r\n}\r\n\r\n/**\r\n * Parse a WAT (WebAssembly Text Format) string into a ModuleBuilder.\r\n */\r\nexport function parseWat(source: string, options?: ModuleBuilderOptions): ModuleBuilder {\r\n const tokens = tokenize(source);\r\n const parser = new WatParserImpl(tokens);\r\n return parser.parse(options);\r\n}\r\n", "import {\r\n ModuleBuilder,\r\n PackageBuilder,\r\n ValueType,\r\n BlockType,\r\n ElementType,\r\n TextModuleWriter,\r\n BinaryReader,\r\n parseWat,\r\n} from '../src/index';\r\n\r\nimport type { WasmTarget, WasmFeature } from '../src/types';\r\n\r\ninterface ExampleDef {\r\n label: string;\r\n group: string;\r\n description: string;\r\n target: WasmTarget;\r\n features: WasmFeature[];\r\n code: string;\r\n}\r\n\r\nconst EXAMPLES: Record = {\r\n // \u2500\u2500\u2500 Basics \u2500\u2500\u2500\r\n 'hello-wasm': {\r\n label: 'Hello WASM',\r\n group: 'Basics',\r\n description: 'The simplest possible module \u2014 export a function that returns 42.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Hello WASM \u2014 the simplest possible module\r\nconst mod = new webasmjs.ModuleBuilder('hello');\r\n\r\nmod.defineFunction('answer', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.const_i32(42);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst answer = instance.instance.exports.answer;\r\nlog('The answer to everything: ' + answer());`,\r\n },\r\n\r\n factorial: {\r\n label: 'Factorial',\r\n group: 'Basics',\r\n description: 'Iterative factorial using loop and block for control flow.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Factorial \u2014 iterative with loop and block\r\nconst mod = new webasmjs.ModuleBuilder('factorial');\r\n\r\nmod.defineFunction('factorial', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const result = a.declareLocal(webasmjs.ValueType.Int32, 'result');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.const_i32(1);\r\n a.set_local(result);\r\n a.const_i32(1);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(result);\r\n a.get_local(i);\r\n a.mul_i32();\r\n a.set_local(result);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(result);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst factorial = instance.instance.exports.factorial;\r\nfor (let n = 0; n <= 10; n++) {\r\n log(n + '! = ' + factorial(n));\r\n}`,\r\n },\r\n\r\n fibonacci: {\r\n label: 'Fibonacci',\r\n group: 'Basics',\r\n description: 'Iterative Fibonacci with local variables and branching.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Fibonacci sequence \u2014 iterative\r\nconst mod = new webasmjs.ModuleBuilder('fibonacci');\r\n\r\nmod.defineFunction('fib', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const prev = a.declareLocal(webasmjs.ValueType.Int32, 'prev');\r\n const curr = a.declareLocal(webasmjs.ValueType.Int32, 'curr');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.get_local(n);\r\n a.return();\r\n });\r\n\r\n a.const_i32(0);\r\n a.set_local(prev);\r\n a.const_i32(1);\r\n a.set_local(curr);\r\n a.const_i32(2);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(curr);\r\n a.set_local(temp);\r\n a.get_local(curr);\r\n a.get_local(prev);\r\n a.add_i32();\r\n a.set_local(curr);\r\n a.get_local(temp);\r\n a.set_local(prev);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(curr);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst fib = instance.instance.exports.fib;\r\nfor (let n = 0; n <= 15; n++) {\r\n log('fib(' + n + ') = ' + fib(n));\r\n}`,\r\n },\r\n\r\n 'if-else': {\r\n label: 'If/Else',\r\n group: 'Basics',\r\n description: 'Absolute value and sign function using typed if/else blocks.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// If/Else \u2014 absolute value and sign function\r\nconst mod = new webasmjs.ModuleBuilder('ifElse');\r\n\r\n// Absolute value using if/else with typed block\r\nmod.defineFunction('abs', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.lt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(0);\r\n a.get_local(f.getParameter(0));\r\n a.sub_i32();\r\n a.else();\r\n a.get_local(f.getParameter(0));\r\n a.end();\r\n}).withExport();\r\n\r\n// Sign function: returns -1, 0, or 1\r\nmod.defineFunction('sign', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.lt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(-1);\r\n a.else();\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.gt_i32();\r\n a.if(webasmjs.BlockType.Int32);\r\n a.const_i32(1);\r\n a.else();\r\n a.const_i32(0);\r\n a.end();\r\n a.end();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { abs, sign } = instance.instance.exports;\r\n\r\nlog('abs(5) = ' + abs(5));\r\nlog('abs(-5) = ' + abs(-5));\r\nlog('abs(0) = ' + abs(0));\r\nlog('');\r\nlog('sign(42) = ' + sign(42));\r\nlog('sign(-7) = ' + sign(-7));\r\nlog('sign(0) = ' + sign(0));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Memory \u2500\u2500\u2500\r\n memory: {\r\n label: 'Memory Basics',\r\n group: 'Memory',\r\n description: 'Store and load i32 values in linear memory.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Memory: store and load values\r\nconst mod = new webasmjs.ModuleBuilder('memoryExample');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\nmod.defineFunction('store', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('load', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { store, load } = instance.instance.exports;\r\n\r\nstore(0, 42);\r\nstore(4, 100);\r\nlog('Value at address 0: ' + load(0));\r\nlog('Value at address 4: ' + load(4));\r\nstore(0, load(0) + load(4));\r\nlog('Sum stored at 0: ' + load(0));`,\r\n },\r\n\r\n 'byte-array': {\r\n label: 'Byte Array',\r\n group: 'Memory',\r\n description: 'Store and sum individual bytes with load8/store8 instructions.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Byte array \u2014 store and sum individual bytes\r\nconst mod = new webasmjs.ModuleBuilder('byteArray');\r\nmod.defineMemory(1);\r\n\r\n// Store a byte at offset\r\nmod.defineFunction('setByte', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store8_i32(0, 0);\r\n}).withExport();\r\n\r\n// Load a byte from offset\r\nmod.defineFunction('getByte', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load8_i32_u(0, 0);\r\n}).withExport();\r\n\r\n// Sum bytes from offset 0 to length-1\r\nmod.defineFunction('sumBytes', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const len = f.getParameter(0);\r\n const sum = a.declareLocal(webasmjs.ValueType.Int32, 'sum');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.const_i32(0);\r\n a.set_local(sum);\r\n a.const_i32(0);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(len);\r\n a.ge_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(sum);\r\n a.get_local(i);\r\n a.load8_i32_u(0, 0);\r\n a.add_i32();\r\n a.set_local(sum);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(sum);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { setByte, getByte, sumBytes } = instance.instance.exports;\r\n\r\n// Fill bytes 0..9 with values 10, 20, 30, ...\r\nfor (let i = 0; i < 10; i++) {\r\n setByte(i, (i + 1) * 10);\r\n}\r\n\r\nlog('Stored bytes:');\r\nfor (let i = 0; i < 10; i++) {\r\n log(' [' + i + '] = ' + getByte(i));\r\n}\r\nlog('Sum of 10 bytes: ' + sumBytes(10));`,\r\n },\r\n\r\n 'string-memory': {\r\n label: 'Strings in Memory',\r\n group: 'Memory',\r\n description: 'Store a string via data segment and compute its length.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Strings in memory \u2014 store a string, compute its length\r\nconst mod = new webasmjs.ModuleBuilder('stringMem');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// Store a data segment with a string at offset 0\r\nconst greeting = new TextEncoder().encode('Hello, WebAssembly!');\r\nmod.defineData(new Uint8Array([...greeting, 0]), 0); // null-terminated\r\n\r\n// strlen: count bytes until null\r\nmod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const ptr = f.getParameter(0);\r\n const len = a.declareLocal(webasmjs.ValueType.Int32, 'len');\r\n\r\n a.const_i32(0);\r\n a.set_local(len);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n // Load byte at ptr + len\r\n a.get_local(ptr);\r\n a.get_local(len);\r\n a.add_i32();\r\n a.load8_i32_u(0, 0);\r\n a.eqz_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(len);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(len);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { strlen, memory } = instance.instance.exports;\r\n\r\n// Read the string from memory\r\nconst memView = new Uint8Array(memory.buffer);\r\nconst strLen = strlen(0);\r\nconst str = new TextDecoder().decode(memView.slice(0, strLen));\r\n\r\nlog('String in memory: \"' + str + '\"');\r\nlog('Length: ' + strLen);`,\r\n },\r\n\r\n 'data-segments': {\r\n label: 'Data Segments',\r\n group: 'Memory',\r\n description: 'Pre-initialize memory with defineData and read values at runtime.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Data segments \u2014 pre-initialize memory with static data\r\nconst mod = new webasmjs.ModuleBuilder('dataSegments');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// Pre-fill memory with a lookup table at offset 0\r\n// Powers of 2: [1, 2, 4, 8, 16, 32, 64, 128]\r\nconst powers = new Uint8Array(new Int32Array([1, 2, 4, 8, 16, 32, 64, 128]).buffer);\r\nmod.defineData(powers, 0);\r\n\r\n// Pre-fill memory with a message at offset 64\r\nconst msg = new TextEncoder().encode('Hello from data segment!');\r\nmod.defineData(new Uint8Array([...msg, 0]), 64);\r\n\r\n// Read an i32 from the powers table: getPower(index)\r\nmod.defineFunction('getPower', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(4);\r\n a.mul_i32();\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\n// strlen starting at offset\r\nmod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const ptr = f.getParameter(0);\r\n const len = a.declareLocal(webasmjs.ValueType.Int32, 'len');\r\n a.const_i32(0);\r\n a.set_local(len);\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(ptr);\r\n a.get_local(len);\r\n a.add_i32();\r\n a.load8_i32_u(0, 0);\r\n a.eqz_i32();\r\n a.br_if(breakLabel);\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(len);\r\n a.br(loopLabel);\r\n });\r\n });\r\n a.get_local(len);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { getPower, strlen, memory } = instance.instance.exports;\r\n\r\nlog('Powers of 2 from data segment:');\r\nfor (let i = 0; i < 8; i++) {\r\n log(' 2^' + i + ' = ' + getPower(i));\r\n}\r\n\r\nconst view = new Uint8Array(memory.buffer);\r\nconst len = strlen(64);\r\nconst str = new TextDecoder().decode(view.slice(64, 64 + len));\r\nlog('');\r\nlog('Message from data segment: \"' + str + '\"');`,\r\n },\r\n\r\n 'memory-growth': {\r\n label: 'Memory Growth',\r\n group: 'Memory',\r\n description: 'Grow memory at runtime with mem_grow and query size with mem_size.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Memory growth \u2014 dynamically add pages at runtime\r\nconst mod = new webasmjs.ModuleBuilder('memGrowth');\r\nconst mem = mod.defineMemory(1); // start with 1 page (64KB)\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// Return current memory size in pages\r\nmod.defineFunction('pages', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.mem_size(0);\r\n}).withExport();\r\n\r\n// Grow memory by N pages, return previous size (or -1 on failure)\r\nmod.defineFunction('grow', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.mem_grow(0);\r\n}).withExport();\r\n\r\n// Store an i32 at a byte offset\r\nmod.defineFunction('store', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0);\r\n}).withExport();\r\n\r\n// Load an i32 from a byte offset\r\nmod.defineFunction('load', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { pages, grow, store, load } = instance.instance.exports;\r\n\r\nlog('Initial size: ' + pages() + ' page(s) = ' + (pages() * 64) + ' KB');\r\n\r\n// Grow by 2 pages\r\nconst prev = grow(2);\r\nlog('grow(2) returned previous size: ' + prev);\r\nlog('New size: ' + pages() + ' page(s) = ' + (pages() * 64) + ' KB');\r\n\r\n// Write to the new pages (offset > 64KB = beyond original page)\r\nconst offset = 65536 + 100; // byte 100 in second page\r\nstore(offset, 12345);\r\nlog('Stored 12345 at offset ' + offset + ' (in grown memory)');\r\nlog('Loaded: ' + load(offset));\r\n\r\n// Grow again\r\ngrow(1);\r\nlog('After another grow(1): ' + pages() + ' pages');`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Globals & State \u2500\u2500\u2500\r\n globals: {\r\n label: 'Global Counter',\r\n group: 'Globals',\r\n description: 'Mutable global variable used as a persistent counter.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Globals: mutable counter\r\nconst mod = new webasmjs.ModuleBuilder('globals');\r\n\r\nconst counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\nmod.defineFunction('increment', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(counter);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_global(counter);\r\n a.get_global(counter);\r\n}).withExport();\r\n\r\nmod.defineFunction('getCount', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(counter);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { increment, getCount } = instance.instance.exports;\r\n\r\nlog('Initial: ' + getCount());\r\nincrement();\r\nincrement();\r\nincrement();\r\nlog('After 3 increments: ' + getCount());\r\nfor (let i = 0; i < 7; i++) increment();\r\nlog('After 7 more: ' + getCount());`,\r\n },\r\n\r\n 'start-function': {\r\n label: 'Start Function',\r\n group: 'Globals',\r\n description: 'A function that runs automatically on module instantiation.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Start function \u2014 runs automatically on instantiation\r\nconst mod = new webasmjs.ModuleBuilder('startExample');\r\n\r\nconst initialized = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\n// This function runs automatically at instantiation\r\nconst initFn = mod.defineFunction('init', null, [], (f, a) => {\r\n a.const_i32(1);\r\n a.set_global(initialized);\r\n});\r\nmod.setStartFunction(initFn);\r\n\r\n// Exported getter\r\nmod.defineFunction('isInitialized', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(initialized);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isInitialized } = instance.instance.exports;\r\nlog('isInitialized (should be 1): ' + isInitialized());\r\nlog('The start function ran automatically!');`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Functions & Calls \u2500\u2500\u2500\r\n 'multi-func': {\r\n label: 'Function Calls',\r\n group: 'Functions',\r\n description: 'Multiple functions calling each other \u2014 square, double, compose.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Multiple functions calling each other\r\nconst mod = new webasmjs.ModuleBuilder('multiFn');\r\n\r\n// Helper: square\r\nmod.defineFunction('square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(0));\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Helper: double\r\nmod.defineFunction('double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(2);\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Composed: 2 * x^2\r\nconst squareFn = mod._functions[0];\r\nconst doubleFn = mod._functions[1];\r\n\r\nmod.defineFunction('doubleSquare', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.call(squareFn);\r\n a.call(doubleFn);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { square, double: dbl, doubleSquare } = instance.instance.exports;\r\n\r\nfor (let x = 1; x <= 5; x++) {\r\n log('x=' + x + ': square=' + square(x) + ', double=' + dbl(x) + ', 2x\u00B2=' + doubleSquare(x));\r\n}`,\r\n },\r\n\r\n 'imports': {\r\n label: 'Import Functions',\r\n group: 'Functions',\r\n description: 'Import host functions so WASM can call JavaScript.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Importing host functions \u2014 WASM calling JavaScript\r\nconst mod = new webasmjs.ModuleBuilder('imports');\r\n\r\n// Declare an import: env.print takes an i32\r\nconst printImport = mod.importFunction('env', 'print', null, [webasmjs.ValueType.Int32]);\r\n\r\n// Declare another import: env.getTime returns an i32\r\nconst getTimeImport = mod.importFunction('env', 'getTime', [webasmjs.ValueType.Int32], []);\r\n\r\nmod.defineFunction('run', null, [], (f, a) => {\r\n // Call getTime, then print it\r\n a.call(getTimeImport);\r\n a.call(printImport);\r\n\r\n // Print some constants\r\n a.const_i32(100);\r\n a.call(printImport);\r\n a.const_i32(200);\r\n a.call(printImport);\r\n a.const_i32(300);\r\n a.call(printImport);\r\n}).withExport();\r\n\r\nconst logged = [];\r\nconst instance = await mod.instantiate({\r\n env: {\r\n print: (v) => { logged.push(v); },\r\n getTime: () => Date.now() & 0x7FFFFFFF,\r\n },\r\n});\r\n\r\ninstance.instance.exports.run();\r\n\r\nlog('Values printed by WASM:');\r\nlogged.forEach((v, i) => log(' [' + i + '] ' + v));`,\r\n },\r\n\r\n 'indirect-call': {\r\n label: 'Indirect Calls (Table)',\r\n group: 'Functions',\r\n description: 'Dispatch function calls through a table using call_indirect.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Indirect calls via function table\r\nconst mod = new webasmjs.ModuleBuilder('indirectCall');\r\n\r\nconst add = mod.defineFunction('add', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n});\r\n\r\nconst sub = mod.defineFunction('sub', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.sub_i32();\r\n});\r\n\r\nconst mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i32();\r\n});\r\n\r\n// Create a table with 3 entries\r\nconst table = mod.defineTable(webasmjs.ElementType.AnyFunc, 3);\r\nmod.defineTableSegment(table, [add, sub, mul], 0);\r\n\r\n// Dispatcher: call function at table[opIndex](a, b)\r\nmod.defineFunction('dispatch', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(1)); // a\r\n a.get_local(f.getParameter(2)); // b\r\n a.get_local(f.getParameter(0)); // table index\r\n a.call_indirect(add.funcTypeBuilder);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { dispatch } = instance.instance.exports;\r\n\r\nconst ops = ['add', 'sub', 'mul'];\r\nfor (let op = 0; op < 3; op++) {\r\n log(ops[op] + '(10, 3) = ' + dispatch(op, 10, 3));\r\n}`,\r\n },\r\n\r\n 'multi-module': {\r\n label: 'Multi-Module',\r\n group: 'Functions',\r\n description: 'Use PackageBuilder to link two modules with imports.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Multi-module \u2014 PackageBuilder links modules with dependencies\r\nconst pkg = new webasmjs.PackageBuilder();\r\n\r\n// Module \"math\": provides a double function\r\nconst mathMod = pkg.defineModule('math');\r\nmathMod.defineFunction('double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(2);\r\n a.mul_i32();\r\n}).withExport();\r\n\r\nmathMod.defineFunction('square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(0));\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Module \"main\": imports from \"math\" and composes\r\nconst mainMod = pkg.defineModule('main');\r\nconst doubleFn = mainMod.importFunction('math', 'double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32]);\r\nconst squareFn = mainMod.importFunction('math', 'square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32]);\r\n\r\n// quadruple(x) = double(double(x))\r\nmainMod.defineFunction('quadruple', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.call(doubleFn);\r\n a.call(doubleFn);\r\n}).withExport();\r\n\r\n// doubleSquare(x) = double(square(x)) = 2 * x^2\r\nmainMod.defineFunction('doubleSquare', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.call(squareFn);\r\n a.call(doubleFn);\r\n}).withExport();\r\n\r\npkg.addDependency('main', 'math');\r\nconst result = await pkg.instantiate();\r\nconst { quadruple, doubleSquare } = result.main.exports;\r\n\r\nlog('PackageBuilder \u2014 two linked modules:');\r\nfor (let x = 1; x <= 6; x++) {\r\n log(' x=' + x + ': quadruple=' + quadruple(x) + ', 2x\\\\u00B2=' + doubleSquare(x));\r\n}`,\r\n },\r\n\r\n 'recursive': {\r\n label: 'Recursive Function',\r\n group: 'Functions',\r\n description: 'Self-recursive power function using a.call(f).',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Recursive function \u2014 power(base, exp) calls itself\r\nconst mod = new webasmjs.ModuleBuilder('recursion');\r\n\r\nmod.defineFunction('power', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const base = f.getParameter(0);\r\n const exp = f.getParameter(1);\r\n\r\n // if exp == 0 return 1\r\n a.get_local(exp);\r\n a.eqz_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(1);\r\n a.return();\r\n });\r\n\r\n // return base * power(base, exp - 1)\r\n a.get_local(base);\r\n a.get_local(base);\r\n a.get_local(exp);\r\n a.const_i32(1);\r\n a.sub_i32();\r\n a.call(f); // recursive call to self!\r\n a.mul_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { power } = instance.instance.exports;\r\n\r\nlog('Recursive power(base, exp):');\r\nfor (let b = 2; b <= 5; b++) {\r\n const results = [];\r\n for (let e = 0; e <= 5; e++) results.push(b + '^' + e + '=' + power(b, e));\r\n log(' ' + results.join(', '));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Control Flow \u2500\u2500\u2500\r\n 'br-table': {\r\n label: 'Branch Table',\r\n group: 'Control Flow',\r\n description: 'Switch/case dispatch using the br_table instruction.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// br_table \u2014 switch/case dispatch to different blocks\r\nconst mod = new webasmjs.ModuleBuilder('brTable');\r\n\r\n// dayType(day): 0-4 => \"weekday\" (return 1), 5-6 => \"weekend\" (return 2), else => \"invalid\" (return 0)\r\nmod.defineFunction('dayType', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const day = f.getParameter(0);\r\n const result = a.declareLocal(webasmjs.ValueType.Int32, 'result');\r\n\r\n a.block(webasmjs.BlockType.Void, (invalidBlock) => {\r\n a.block(webasmjs.BlockType.Void, (weekendBlock) => {\r\n a.block(webasmjs.BlockType.Void, (weekdayBlock) => {\r\n // br_table: value 0-4 => weekdayBlock, 5-6 => weekendBlock, default => invalidBlock\r\n a.get_local(day);\r\n a.br_table(invalidBlock,\r\n weekdayBlock, weekdayBlock, weekdayBlock, weekdayBlock, weekdayBlock,\r\n weekendBlock, weekendBlock\r\n );\r\n });\r\n // weekday path\r\n a.const_i32(1);\r\n a.set_local(result);\r\n a.br(invalidBlock); // jump to end\r\n });\r\n // weekend path\r\n a.const_i32(2);\r\n a.set_local(result);\r\n a.br(invalidBlock); // jump to end\r\n });\r\n // if we fell through to here via default, result is still 0\r\n\r\n a.get_local(result);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { dayType } = instance.instance.exports;\r\n\r\nconst names = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\r\nconst types = ['invalid', 'weekday', 'weekend'];\r\nfor (let d = 0; d < 7; d++) {\r\n log(names[d] + ' (day ' + d + '): ' + types[dayType(d)]);\r\n}\r\nlog('day 7: ' + types[dayType(7)]);\r\nlog('day 99: ' + types[dayType(99)]);`,\r\n },\r\n\r\n 'select': {\r\n label: 'Select (Ternary)',\r\n group: 'Control Flow',\r\n description: 'Branchless conditional with select \u2014 like a ternary operator.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// select \u2014 branchless conditional (ternary operator)\r\nconst mod = new webasmjs.ModuleBuilder('selectOp');\r\n\r\n// max(a, b) = a > b ? a : b (using select)\r\nmod.defineFunction('max', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const x = f.getParameter(0);\r\n const y = f.getParameter(1);\r\n\r\n a.get_local(x); // value if true\r\n a.get_local(y); // value if false\r\n a.get_local(x);\r\n a.get_local(y);\r\n a.gt_i32(); // condition: x > y\r\n a.select();\r\n}).withExport();\r\n\r\n// min(a, b) = a < b ? a : b\r\nmod.defineFunction('min', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const x = f.getParameter(0);\r\n const y = f.getParameter(1);\r\n\r\n a.get_local(x);\r\n a.get_local(y);\r\n a.get_local(x);\r\n a.get_local(y);\r\n a.lt_i32();\r\n a.select();\r\n}).withExport();\r\n\r\n// clamp(val, lo, hi)\r\nmod.defineFunction('clamp', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const val = f.getParameter(0);\r\n const lo = f.getParameter(1);\r\n const hi = f.getParameter(2);\r\n const tmp = a.declareLocal(webasmjs.ValueType.Int32, 'tmp');\r\n\r\n // tmp = val > hi ? hi : val\r\n a.get_local(hi);\r\n a.get_local(val);\r\n a.get_local(val);\r\n a.get_local(hi);\r\n a.gt_i32();\r\n a.select();\r\n a.set_local(tmp);\r\n\r\n // result = tmp < lo ? lo : tmp\r\n a.get_local(lo);\r\n a.get_local(tmp);\r\n a.get_local(tmp);\r\n a.get_local(lo);\r\n a.lt_i32();\r\n a.select();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { max, min, clamp } = instance.instance.exports;\r\n\r\nlog('max(3, 7) = ' + max(3, 7));\r\nlog('max(10, 2) = ' + max(10, 2));\r\nlog('min(3, 7) = ' + min(3, 7));\r\nlog('min(10, 2) = ' + min(10, 2));\r\nlog('');\r\nlog('clamp(5, 0, 10) = ' + clamp(5, 0, 10));\r\nlog('clamp(-3, 0, 10) = ' + clamp(-3, 0, 10));\r\nlog('clamp(15, 0, 10) = ' + clamp(15, 0, 10));\r\nlog('clamp(0, 0, 10) = ' + clamp(0, 0, 10));\r\nlog('clamp(10, 0, 10) = ' + clamp(10, 0, 10));`,\r\n },\r\n\r\n 'nested-blocks': {\r\n label: 'Nested Blocks',\r\n group: 'Control Flow',\r\n description: 'Multi-level block nesting with early break and continue.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Nested blocks \u2014 multi-level break and continue patterns\r\nconst mod = new webasmjs.ModuleBuilder('nestedBlocks');\r\n\r\n// Find the first number in [start, start+limit) divisible by both 3 and 5\r\n// Returns -1 if not found\r\nmod.defineFunction('findFizzBuzz', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const start = f.getParameter(0);\r\n const limit = f.getParameter(1);\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n const end = a.declareLocal(webasmjs.ValueType.Int32, 'end');\r\n const result = a.declareLocal(webasmjs.ValueType.Int32, 'result');\r\n\r\n a.const_i32(-1);\r\n a.set_local(result);\r\n\r\n // end = start + limit\r\n a.get_local(start);\r\n a.get_local(limit);\r\n a.add_i32();\r\n a.set_local(end);\r\n\r\n a.get_local(start);\r\n a.set_local(i);\r\n\r\n // outer block \u2014 break here when found\r\n a.block(webasmjs.BlockType.Void, (found) => {\r\n a.loop(webasmjs.BlockType.Void, (cont) => {\r\n // if i >= end, exit loop\r\n a.block(webasmjs.BlockType.Void, (skip) => {\r\n a.get_local(i);\r\n a.get_local(end);\r\n a.ge_i32();\r\n a.br_if(found);\r\n\r\n // Check divisible by 3\r\n a.get_local(i);\r\n a.const_i32(3);\r\n a.rem_i32_u();\r\n a.br_if(skip); // not divisible by 3, skip\r\n\r\n // Check divisible by 5\r\n a.get_local(i);\r\n a.const_i32(5);\r\n a.rem_i32_u();\r\n a.br_if(skip); // not divisible by 5, skip\r\n\r\n // Found! Save and break to outer\r\n a.get_local(i);\r\n a.set_local(result);\r\n a.br(found);\r\n });\r\n\r\n // i++\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(cont);\r\n });\r\n });\r\n\r\n a.get_local(result);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { findFizzBuzz } = instance.instance.exports;\r\n\r\nlog('Find first FizzBuzz (divisible by 3 and 5):');\r\nlog(' findFizzBuzz(1, 100) = ' + findFizzBuzz(1, 100));\r\nlog(' findFizzBuzz(16, 10) = ' + findFizzBuzz(16, 10));\r\nlog(' findFizzBuzz(31, 50) = ' + findFizzBuzz(31, 50));\r\nlog(' findFizzBuzz(1, 5) = ' + findFizzBuzz(1, 5) + ' (not found)');\r\nlog(' findFizzBuzz(46, 10) = ' + findFizzBuzz(46, 10));`,\r\n },\r\n\r\n 'drop-and-tee': {\r\n label: 'Drop & Tee Local',\r\n group: 'Control Flow',\r\n description: 'Stack manipulation with drop() and tee_local().',\r\n target: 'mvp',\r\n features: [],\r\n code: `// drop and tee_local \u2014 stack manipulation\r\nconst mod = new webasmjs.ModuleBuilder('stackOps');\r\n\r\n// tee_local: stores to local AND keeps value on stack\r\n// Equivalent to: set_local + get_local, but in one instruction\r\nmod.defineFunction('sumAndCount', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const sum = a.declareLocal(webasmjs.ValueType.Int32, 'sum');\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n a.const_i32(0);\r\n a.set_local(sum);\r\n a.const_i32(1);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (cont) => {\r\n a.block(webasmjs.BlockType.Void, (brk) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(brk);\r\n\r\n // tee_local: store i to sum while keeping it on stack\r\n a.get_local(sum);\r\n a.get_local(i);\r\n a.tee_local(i); // stores i, but also leaves value on stack\r\n a.add_i32();\r\n a.set_local(sum);\r\n\r\n // increment i (which was already tee'd)\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(cont);\r\n });\r\n });\r\n\r\n a.get_local(sum);\r\n}).withExport();\r\n\r\n// drop: discard an unwanted return value\r\nmod.defineFunction('callAndDiscard', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n // Call sumAndCount but ignore its return value\r\n a.const_i32(10);\r\n a.call(mod._functions[0]); // calls sumAndCount(10)\r\n a.drop(); // discard the result\r\n\r\n // Return a fixed value instead\r\n a.const_i32(42);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { sumAndCount, callAndDiscard } = instance.instance.exports;\r\n\r\nlog('sumAndCount (uses tee_local):');\r\nfor (const n of [5, 10, 100]) {\r\n log(' sum(1..' + n + ') = ' + sumAndCount(n));\r\n}\r\nlog('');\r\nlog('callAndDiscard (uses drop):');\r\nlog(' result = ' + callAndDiscard() + ' (dropped sumAndCount result, returned 42)');`,\r\n },\r\n\r\n 'unreachable-trap': {\r\n label: 'Unreachable Trap',\r\n group: 'Control Flow',\r\n description: 'Use unreachable as an assertion \u2014 traps if reached.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// unreachable \u2014 intentional trap for defensive programming\r\nconst mod = new webasmjs.ModuleBuilder('trapDemo');\r\n\r\n// divide(a, b) \u2014 traps if b is zero\r\nmod.defineFunction('divide', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const x = f.getParameter(0);\r\n const y = f.getParameter(1);\r\n\r\n // Guard: trap if divisor is zero\r\n a.get_local(y);\r\n a.eqz_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.unreachable(); // trap!\r\n });\r\n\r\n a.get_local(x);\r\n a.get_local(y);\r\n a.div_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { divide } = instance.instance.exports;\r\n\r\nlog('divide(10, 2) = ' + divide(10, 2));\r\nlog('divide(100, 5) = ' + divide(100, 5));\r\nlog('divide(7, 3) = ' + divide(7, 3));\r\nlog('');\r\n\r\ntry {\r\n divide(10, 0);\r\n log('Should not reach here!');\r\n} catch (e) {\r\n log('divide(10, 0) trapped: ' + e.message);\r\n log('The unreachable instruction prevented division by zero!');\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Numeric Types \u2500\u2500\u2500\r\n 'float-math': {\r\n label: 'Float Math',\r\n group: 'Numeric',\r\n description: 'Floating-point distance, rounding, and sqrt with f64.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Floating-point operations \u2014 f64 math functions\r\nconst mod = new webasmjs.ModuleBuilder('floatMath');\r\n\r\n// Distance: sqrt(dx*dx + dy*dy)\r\nmod.defineFunction('distance', [webasmjs.ValueType.Float64],\r\n [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64,\r\n webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => {\r\n const x1 = f.getParameter(0);\r\n const y1 = f.getParameter(1);\r\n const x2 = f.getParameter(2);\r\n const y2 = f.getParameter(3);\r\n const dx = a.declareLocal(webasmjs.ValueType.Float64, 'dx');\r\n const dy = a.declareLocal(webasmjs.ValueType.Float64, 'dy');\r\n\r\n // dx = x2 - x1\r\n a.get_local(x2);\r\n a.get_local(x1);\r\n a.sub_f64();\r\n a.set_local(dx);\r\n\r\n // dy = y2 - y1\r\n a.get_local(y2);\r\n a.get_local(y1);\r\n a.sub_f64();\r\n a.set_local(dy);\r\n\r\n // sqrt(dx*dx + dy*dy)\r\n a.get_local(dx);\r\n a.get_local(dx);\r\n a.mul_f64();\r\n a.get_local(dy);\r\n a.get_local(dy);\r\n a.mul_f64();\r\n a.add_f64();\r\n a.sqrt_f64();\r\n}).withExport();\r\n\r\n// Rounding functions\r\nmod.defineFunction('roundUp', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.ceil_f64();\r\n}).withExport();\r\n\r\nmod.defineFunction('roundDown', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.floor_f64();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { distance, roundUp, roundDown } = instance.instance.exports;\r\n\r\nlog('distance((0,0), (3,4)) = ' + distance(0, 0, 3, 4));\r\nlog('distance((1,1), (4,5)) = ' + distance(1, 1, 4, 5));\r\nlog('');\r\nlog('roundUp(2.3) = ' + roundUp(2.3));\r\nlog('roundUp(2.7) = ' + roundUp(2.7));\r\nlog('roundDown(2.3) = ' + roundDown(2.3));\r\nlog('roundDown(2.7) = ' + roundDown(2.7));`,\r\n },\r\n\r\n 'i64-bigint': {\r\n label: 'i64 / BigInt',\r\n group: 'Numeric',\r\n description: '64-bit integers with BigInt interop \u2014 large factorial.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// 64-bit integers \u2014 BigInt interop\r\nconst mod = new webasmjs.ModuleBuilder('i64ops');\r\n\r\nmod.defineFunction('add64', [webasmjs.ValueType.Int64],\r\n [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i64();\r\n}).withExport();\r\n\r\nmod.defineFunction('mul64', [webasmjs.ValueType.Int64],\r\n [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i64();\r\n}).withExport();\r\n\r\n// Factorial with i64 \u2014 can handle larger numbers\r\nmod.defineFunction('factorial64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int64], (f, a) => {\r\n const n = f.getParameter(0);\r\n const result = a.declareLocal(webasmjs.ValueType.Int64, 'result');\r\n const i = a.declareLocal(webasmjs.ValueType.Int64, 'i');\r\n\r\n a.const_i64(1n);\r\n a.set_local(result);\r\n a.const_i64(1n);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(i);\r\n a.get_local(n);\r\n a.gt_i64();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(result);\r\n a.get_local(i);\r\n a.mul_i64();\r\n a.set_local(result);\r\n\r\n a.get_local(i);\r\n a.const_i64(1n);\r\n a.add_i64();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(result);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { add64, mul64, factorial64 } = instance.instance.exports;\r\n\r\nlog('add64(1000000000000n, 2000000000000n) = ' + add64(1000000000000n, 2000000000000n));\r\nlog('mul64(123456789n, 987654321n) = ' + mul64(123456789n, 987654321n));\r\nlog('');\r\nlog('Factorial with i64 (no overflow up to 20!):');\r\nfor (let n = 0n; n <= 20n; n++) {\r\n log(' ' + n + '! = ' + factorial64(n));\r\n}`,\r\n },\r\n\r\n 'type-conversions': {\r\n label: 'Type Conversions',\r\n group: 'Numeric',\r\n description: 'Convert between i32, i64, f32, and f64 types.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Type conversions between numeric types\r\nconst mod = new webasmjs.ModuleBuilder('conversions');\r\n\r\n// i32 to f64\r\nmod.defineFunction('i32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.convert_i32_s_f64();\r\n}).withExport();\r\n\r\n// f64 to i32 (truncate)\r\nmod.defineFunction('f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_f64_s_i32();\r\n}).withExport();\r\n\r\n// i32 to i64 (sign extend)\r\nmod.defineFunction('i32_to_i64', [webasmjs.ValueType.Int64], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend_i32_s_i64();\r\n}).withExport();\r\n\r\n// i64 to i32 (wrap)\r\nmod.defineFunction('i64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.wrap_i64_i32();\r\n}).withExport();\r\n\r\n// f32 to f64 (promote)\r\nmod.defineFunction('f32_to_f64', [webasmjs.ValueType.Float64], [webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.promote_f32_f64();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { i32_to_f64, f64_to_i32, i32_to_i64, i64_to_i32, f32_to_f64 } = instance.instance.exports;\r\n\r\nlog('i32(42) \u2192 f64: ' + i32_to_f64(42));\r\nlog('f64(3.14) \u2192 i32: ' + f64_to_i32(3.14));\r\nlog('f64(99.9) \u2192 i32: ' + f64_to_i32(99.9));\r\nlog('i32(42) \u2192 i64: ' + i32_to_i64(42));\r\nlog('i32(-1) \u2192 i64: ' + i32_to_i64(-1));\r\nlog('i64(0x1FFFFFFFFn) \u2192 i32: ' + i64_to_i32(0x1FFFFFFFFn));\r\nlog('f32(3.14) \u2192 f64: ' + f32_to_f64(3.140000104904175));`,\r\n },\r\n\r\n 'bitwise-ops': {\r\n label: 'Bitwise Operations',\r\n group: 'Numeric',\r\n description: 'Rotation, leading/trailing zeros, and popcount on i32.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Bitwise operations \u2014 rotl, rotr, clz, ctz, popcnt\r\nconst mod = new webasmjs.ModuleBuilder('bitwiseOps');\r\n\r\nmod.defineFunction('rotl', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.rotl_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('rotr', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.rotr_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('clz', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.clz_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('ctz', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.ctz_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('popcnt', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.popcnt_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { rotl, rotr, clz, ctz, popcnt } = instance.instance.exports;\r\n\r\nlog('=== Rotation ===');\r\nlog('rotl(0x80000001, 1) = 0x' + (rotl(0x80000001, 1) >>> 0).toString(16));\r\nlog('rotr(0x80000001, 1) = 0x' + (rotr(0x80000001, 1) >>> 0).toString(16));\r\nlog('rotl(1, 10) = ' + rotl(1, 10) + ' (1 << 10 = 1024)');\r\n\r\nlog('');\r\nlog('=== Bit Counting ===');\r\nlog('clz(1) = ' + clz(1) + ' (31 leading zeros)');\r\nlog('clz(256) = ' + clz(256) + ' (23 leading zeros)');\r\nlog('clz(0) = ' + clz(0) + ' (all 32 zeros)');\r\nlog('ctz(256) = ' + ctz(256) + ' (8 trailing zeros)');\r\nlog('ctz(1) = ' + ctz(1) + ' (0 trailing zeros)');\r\nlog('popcnt(0xFF) = ' + popcnt(0xFF) + ' (8 bits set)');\r\nlog('popcnt(0x55555555) = ' + popcnt(0x55555555) + ' (16 bits set)');\r\nlog('popcnt(0) = ' + popcnt(0));`,\r\n },\r\n\r\n 'float-special': {\r\n label: 'Float Special Ops',\r\n group: 'Numeric',\r\n description: 'copysign, nearest, trunc \u2014 standalone float operations.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Special float operations \u2014 copysign, nearest, trunc\r\nconst mod = new webasmjs.ModuleBuilder('floatSpecial');\r\n\r\n// copysign(a, b) \u2014 magnitude of a, sign of b\r\nmod.defineFunction('copysign', [webasmjs.ValueType.Float64],\r\n [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.copysign_f64();\r\n}).withExport();\r\n\r\n// nearest \u2014 round to nearest even (banker's rounding)\r\nmod.defineFunction('nearest', [webasmjs.ValueType.Float64],\r\n [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.nearest_f64();\r\n}).withExport();\r\n\r\n// trunc \u2014 round towards zero (remove fractional part)\r\nmod.defineFunction('trunc', [webasmjs.ValueType.Float64],\r\n [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_f64();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { copysign, nearest, trunc } = instance.instance.exports;\r\n\r\nlog('=== copysign(magnitude, sign) ===');\r\nlog('copysign(5.0, -1.0) = ' + copysign(5.0, -1.0));\r\nlog('copysign(-5.0, 1.0) = ' + copysign(-5.0, 1.0));\r\nlog('copysign(3.14, -0.0) = ' + copysign(3.14, -0.0));\r\n\r\nlog('');\r\nlog('=== nearest (banker\\\\u2019s rounding) ===');\r\nlog('nearest(0.5) = ' + nearest(0.5) + ' (rounds to even: 0)');\r\nlog('nearest(1.5) = ' + nearest(1.5) + ' (rounds to even: 2)');\r\nlog('nearest(2.5) = ' + nearest(2.5) + ' (rounds to even: 2)');\r\nlog('nearest(3.5) = ' + nearest(3.5) + ' (rounds to even: 4)');\r\nlog('nearest(2.3) = ' + nearest(2.3));\r\nlog('nearest(-1.7) = ' + nearest(-1.7));\r\n\r\nlog('');\r\nlog('=== trunc (towards zero) ===');\r\nlog('trunc(2.9) = ' + trunc(2.9));\r\nlog('trunc(-2.9) = ' + trunc(-2.9));\r\nlog('trunc(0.1) = ' + trunc(0.1));`,\r\n },\r\n\r\n 'reinterpret': {\r\n label: 'Reinterpret Casts',\r\n group: 'Numeric',\r\n description: 'Reinterpret bits between float and int without conversion.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Reinterpret \u2014 same bits, different type interpretation\r\nconst mod = new webasmjs.ModuleBuilder('reinterpret');\r\n\r\n// View f32 bits as i32\r\nmod.defineFunction('f32_bits', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.reinterpret_f32_i32();\r\n}).withExport();\r\n\r\n// View i32 bits as f32\r\nmod.defineFunction('i32_as_f32', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.reinterpret_i32_f32();\r\n}).withExport();\r\n\r\n// View f64 bits as i64\r\nmod.defineFunction('f64_bits', [webasmjs.ValueType.Int64],\r\n [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.reinterpret_f64_i64();\r\n}).withExport();\r\n\r\n// View i64 bits as f64\r\nmod.defineFunction('i64_as_f64', [webasmjs.ValueType.Float64],\r\n [webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.reinterpret_i64_f64();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { f32_bits, i32_as_f32, f64_bits, i64_as_f64 } = instance.instance.exports;\r\n\r\nlog('=== f32 \\\\u2194 i32 reinterpret ===');\r\nlog('f32_bits(1.0) = 0x' + (f32_bits(1.0) >>> 0).toString(16).padStart(8, '0') + ' (IEEE 754: 3F800000)');\r\nlog('f32_bits(-1.0) = 0x' + (f32_bits(-1.0) >>> 0).toString(16).padStart(8, '0') + ' (BF800000)');\r\nlog('f32_bits(0.0) = 0x' + (f32_bits(0.0) >>> 0).toString(16).padStart(8, '0'));\r\nlog('i32_as_f32(0x3F800000) = ' + i32_as_f32(0x3F800000) + ' (1.0)');\r\nlog('i32_as_f32(0x40490FDB) = ' + i32_as_f32(0x40490FDB) + ' (~pi)');\r\n\r\nlog('');\r\nlog('=== f64 \\\\u2194 i64 reinterpret ===');\r\nlog('f64_bits(1.0) = 0x' + f64_bits(1.0).toString(16) + ' (3FF0000000000000)');\r\nlog('i64_as_f64(0x4009_21FB_5444_2D18n) = ' + i64_as_f64(0x400921FB54442D18n) + ' (pi)');`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Algorithms \u2500\u2500\u2500\r\n 'bubble-sort': {\r\n label: 'Bubble Sort',\r\n group: 'Algorithms',\r\n description: 'Sort an array in linear memory with nested loops.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Bubble sort in WASM memory\r\nconst mod = new webasmjs.ModuleBuilder('bubbleSort');\r\nmod.defineMemory(1);\r\n\r\n// Store i32 at index (index * 4)\r\nmod.defineFunction('set', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(4);\r\n a.mul_i32();\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0);\r\n}).withExport();\r\n\r\n// Load i32 at index\r\nmod.defineFunction('get', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(4);\r\n a.mul_i32();\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\nconst setFn = mod._functions[0];\r\nconst getFn = mod._functions[1];\r\n\r\n// Bubble sort(length)\r\nmod.defineFunction('sort', null, [webasmjs.ValueType.Int32], (f, a) => {\r\n const len = f.getParameter(0);\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n const j = a.declareLocal(webasmjs.ValueType.Int32, 'j');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n const swapped = a.declareLocal(webasmjs.ValueType.Int32, 'swapped');\r\n\r\n a.const_i32(0);\r\n a.set_local(i);\r\n\r\n // Outer loop\r\n a.loop(webasmjs.BlockType.Void, (outerLoop) => {\r\n a.block(webasmjs.BlockType.Void, (outerBreak) => {\r\n a.get_local(i);\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.sub_i32();\r\n a.ge_i32();\r\n a.br_if(outerBreak);\r\n\r\n a.const_i32(0);\r\n a.set_local(swapped);\r\n a.const_i32(0);\r\n a.set_local(j);\r\n\r\n // Inner loop\r\n a.loop(webasmjs.BlockType.Void, (innerLoop) => {\r\n a.block(webasmjs.BlockType.Void, (innerBreak) => {\r\n a.get_local(j);\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.sub_i32();\r\n a.get_local(i);\r\n a.sub_i32();\r\n a.ge_i32();\r\n a.br_if(innerBreak);\r\n\r\n // if arr[j] > arr[j+1], swap\r\n a.get_local(j);\r\n a.call(getFn);\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.call(getFn);\r\n a.gt_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n // temp = arr[j]\r\n a.get_local(j);\r\n a.call(getFn);\r\n a.set_local(temp);\r\n // arr[j] = arr[j+1]\r\n a.get_local(j);\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.call(getFn);\r\n a.call(setFn);\r\n // arr[j+1] = temp\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.get_local(temp);\r\n a.call(setFn);\r\n a.const_i32(1);\r\n a.set_local(swapped);\r\n });\r\n\r\n a.get_local(j);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(j);\r\n a.br(innerLoop);\r\n });\r\n });\r\n\r\n // Early exit if no swaps\r\n a.get_local(swapped);\r\n a.eqz_i32();\r\n a.br_if(outerBreak);\r\n\r\n a.get_local(i);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(outerLoop);\r\n });\r\n });\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { set, get, sort } = instance.instance.exports;\r\n\r\nconst data = [64, 34, 25, 12, 22, 11, 90, 1, 55, 42];\r\nlog('Before: ' + data.join(', '));\r\n\r\ndata.forEach((v, i) => set(i, v));\r\nsort(data.length);\r\n\r\nconst sorted = [];\r\nfor (let i = 0; i < data.length; i++) sorted.push(get(i));\r\nlog('After: ' + sorted.join(', '));`,\r\n },\r\n\r\n 'gcd': {\r\n label: 'GCD (Euclidean)',\r\n group: 'Algorithms',\r\n description: 'Greatest common divisor using the Euclidean algorithm.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Greatest common divisor \u2014 Euclidean algorithm\r\nconst mod = new webasmjs.ModuleBuilder('gcd');\r\n\r\nmod.defineFunction('gcd', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const x = f.getParameter(0);\r\n const y = f.getParameter(1);\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(y);\r\n a.eqz_i32();\r\n a.br_if(breakLabel);\r\n\r\n // temp = y\r\n a.get_local(y);\r\n a.set_local(temp);\r\n // y = x % y\r\n a.get_local(x);\r\n a.get_local(y);\r\n a.rem_i32_u();\r\n a.set_local(y);\r\n // x = temp\r\n a.get_local(temp);\r\n a.set_local(x);\r\n\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(x);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { gcd } = instance.instance.exports;\r\n\r\nconst pairs = [[12, 8], [100, 75], [17, 13], [48, 18], [0, 5], [7, 0], [1071, 462]];\r\nfor (const [a, b] of pairs) {\r\n log('gcd(' + a + ', ' + b + ') = ' + gcd(a, b));\r\n}`,\r\n },\r\n\r\n 'collatz': {\r\n label: 'Collatz Conjecture',\r\n group: 'Algorithms',\r\n description: 'Count steps to reach 1 using the 3n+1 conjecture.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Collatz conjecture \u2014 count steps to reach 1\r\nconst mod = new webasmjs.ModuleBuilder('collatz');\r\n\r\nmod.defineFunction('collatz', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const steps = a.declareLocal(webasmjs.ValueType.Int32, 'steps');\r\n\r\n a.const_i32(0);\r\n a.set_local(steps);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.br_if(breakLabel);\r\n\r\n a.get_local(steps);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(steps);\r\n\r\n // if n is odd: n = 3n + 1, else: n = n / 2\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.and_i32();\r\n a.if(webasmjs.BlockType.Void);\r\n // odd: n = 3n + 1\r\n a.get_local(n);\r\n a.const_i32(3);\r\n a.mul_i32();\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(n);\r\n a.else();\r\n // even: n = n / 2\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.shr_i32_u();\r\n a.set_local(n);\r\n a.end();\r\n\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.get_local(steps);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { collatz } = instance.instance.exports;\r\n\r\nfor (const n of [1, 2, 3, 6, 7, 9, 27, 97, 871]) {\r\n log('collatz(' + n + ') = ' + collatz(n) + ' steps');\r\n}`,\r\n },\r\n\r\n 'is-prime': {\r\n label: 'Primality Test',\r\n group: 'Algorithms',\r\n description: 'Trial division to test and list prime numbers.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Primality test \u2014 trial division\r\nconst mod = new webasmjs.ModuleBuilder('prime');\r\n\r\nmod.defineFunction('isPrime', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const n = f.getParameter(0);\r\n const i = a.declareLocal(webasmjs.ValueType.Int32, 'i');\r\n\r\n // n <= 1 \u2192 not prime\r\n a.get_local(n);\r\n a.const_i32(1);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n // n <= 3 \u2192 prime\r\n a.get_local(n);\r\n a.const_i32(3);\r\n a.le_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(1);\r\n a.return();\r\n });\r\n\r\n // divisible by 2 \u2192 not prime\r\n a.get_local(n);\r\n a.const_i32(2);\r\n a.rem_i32_u();\r\n a.eqz_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n // Trial division from 3 to sqrt(n)\r\n a.const_i32(3);\r\n a.set_local(i);\r\n\r\n a.loop(webasmjs.BlockType.Void, (loopLabel) => {\r\n a.block(webasmjs.BlockType.Void, (breakLabel) => {\r\n // if i * i > n, break (is prime)\r\n a.get_local(i);\r\n a.get_local(i);\r\n a.mul_i32();\r\n a.get_local(n);\r\n a.gt_i32();\r\n a.br_if(breakLabel);\r\n\r\n // if n % i == 0, not prime\r\n a.get_local(n);\r\n a.get_local(i);\r\n a.rem_i32_u();\r\n a.eqz_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(0);\r\n a.return();\r\n });\r\n\r\n a.get_local(i);\r\n a.const_i32(2);\r\n a.add_i32();\r\n a.set_local(i);\r\n a.br(loopLabel);\r\n });\r\n });\r\n\r\n a.const_i32(1);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isPrime } = instance.instance.exports;\r\n\r\nlog('Prime numbers up to 100:');\r\nconst primes = [];\r\nfor (let n = 2; n <= 100; n++) {\r\n if (isPrime(n)) primes.push(n);\r\n}\r\nlog(primes.join(', '));\r\nlog('');\r\nlog('Testing larger numbers:');\r\nfor (const n of [997, 1000, 7919, 7920, 104729]) {\r\n log(n + ' is ' + (isPrime(n) ? 'prime' : 'not prime'));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 WAT Parser \u2500\u2500\u2500\r\n 'wat-parser': {\r\n label: 'WAT Parser',\r\n group: 'WAT',\r\n description: 'Parse WebAssembly Text format and instantiate the module.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Parse WAT text and instantiate\r\nconst watSource = \\`\r\n(module $parsed\r\n (func $add (param i32) (param i32) (result i32)\r\n local.get 0\r\n local.get 1\r\n i32.add\r\n )\r\n (export \"add\" (func $add))\r\n)\r\n\\`;\r\n\r\nlog('Parsing WAT source...');\r\nconst mod = webasmjs.parseWat(watSource);\r\nlog('WAT parsed successfully!');\r\nlog('');\r\n\r\nconst instance = await mod.instantiate();\r\nconst add = instance.instance.exports.add;\r\nlog('add(3, 4) = ' + add(3, 4));\r\nlog('add(100, 200) = ' + add(100, 200));\r\nlog('add(-5, 10) = ' + add(-5, 10));`,\r\n },\r\n\r\n 'wat-loop': {\r\n label: 'WAT Loop & Branch',\r\n group: 'WAT',\r\n description: 'WAT with loop, block, and branch instructions.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// WAT with loop and branch instructions\r\nconst watSource = \\`\r\n(module $loops\r\n (func $sum (param i32) (result i32)\r\n (local i32) ;; accumulator\r\n (local i32) ;; counter\r\n i32.const 0\r\n local.set 1\r\n i32.const 1\r\n local.set 2\r\n block $break\r\n loop $continue\r\n local.get 2\r\n local.get 0\r\n i32.gt_s\r\n br_if $break\r\n\r\n local.get 1\r\n local.get 2\r\n i32.add\r\n local.set 1\r\n\r\n local.get 2\r\n i32.const 1\r\n i32.add\r\n local.set 2\r\n br $continue\r\n end\r\n end\r\n local.get 1\r\n )\r\n (export \"sum\" (func $sum))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst sum = instance.instance.exports.sum;\r\n\r\nlog('Sum from 1 to N:');\r\nfor (const n of [0, 1, 5, 10, 50, 100]) {\r\n log(' sum(' + n + ') = ' + sum(n));\r\n}`,\r\n },\r\n\r\n 'wat-memory': {\r\n label: 'WAT Memory & Data',\r\n group: 'WAT',\r\n description: 'WAT with memory declarations, store/load, and exports.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// WAT with memory, data segments, and imports\r\nconst watSource = \\`\r\n(module $memTest\r\n (memory 1)\r\n (func $store (param i32) (param i32)\r\n local.get 0\r\n local.get 1\r\n i32.store offset=0 align=4\r\n )\r\n (func $load (param i32) (result i32)\r\n local.get 0\r\n i32.load offset=0 align=4\r\n )\r\n (export \"store\" (func $store))\r\n (export \"load\" (func $load))\r\n (export \"mem\" (memory 0))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst { store, load, mem } = instance.instance.exports;\r\n\r\n// Store values at various offsets\r\nstore(0, 11);\r\nstore(4, 22);\r\nstore(8, 33);\r\nstore(12, 44);\r\n\r\nlog('Memory contents:');\r\nfor (let addr = 0; addr < 16; addr += 4) {\r\n log(' [' + addr + '] = ' + load(addr));\r\n}\r\n\r\n// Also inspect raw memory\r\nconst view = new Uint8Array(mem.buffer);\r\nlog('');\r\nlog('Raw bytes [0..15]: ' + Array.from(view.slice(0, 16)).join(', '));`,\r\n },\r\n\r\n 'wat-global': {\r\n label: 'WAT Globals & Start',\r\n group: 'WAT',\r\n description: 'WAT with mutable globals, start function, and inc/dec.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// WAT with globals, start function, and if/else\r\nconst watSource = \\`\r\n(module $globalDemo\r\n (global $counter (mut i32) (i32.const 0))\r\n\r\n (func $init\r\n i32.const 100\r\n global.set 0\r\n )\r\n\r\n (func $inc (result i32)\r\n global.get 0\r\n i32.const 1\r\n i32.add\r\n global.set 0\r\n global.get 0\r\n )\r\n\r\n (func $dec (result i32)\r\n global.get 0\r\n i32.const 1\r\n i32.sub\r\n global.set 0\r\n global.get 0\r\n )\r\n\r\n (func $getCounter (result i32)\r\n global.get 0\r\n )\r\n\r\n (start $init)\r\n (export \"inc\" (func $inc))\r\n (export \"dec\" (func $dec))\r\n (export \"getCounter\" (func $getCounter))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst instance = await mod.instantiate();\r\nconst { inc, dec, getCounter } = instance.instance.exports;\r\n\r\nlog('Initial (set by start): ' + getCounter());\r\nlog('inc() = ' + inc());\r\nlog('inc() = ' + inc());\r\nlog('inc() = ' + inc());\r\nlog('dec() = ' + dec());\r\nlog('Final: ' + getCounter());`,\r\n },\r\n\r\n 'wat-imports': {\r\n label: 'WAT Imports',\r\n group: 'WAT',\r\n description: 'WAT with function imports calling JavaScript host functions.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// WAT with imports \u2014 call JavaScript from WebAssembly text\r\nconst watSource = \\`\r\n(module $importDemo\r\n (import \"env\" \"print\" (func $print (param i32)))\r\n (import \"env\" \"add\" (func $add (param i32) (param i32) (result i32)))\r\n\r\n (func $run\r\n ;; Call host add(3, 4), then print the result\r\n i32.const 3\r\n i32.const 4\r\n call $add\r\n call $print\r\n\r\n ;; Print some constants\r\n i32.const 100\r\n call $print\r\n i32.const 200\r\n call $print\r\n )\r\n\r\n (export \"run\" (func $run))\r\n)\r\n\\`;\r\n\r\nconst mod = webasmjs.parseWat(watSource);\r\nconst results = [];\r\nconst instance = await mod.instantiate({\r\n env: {\r\n print: (v) => results.push(v),\r\n add: (a, b) => a + b,\r\n },\r\n});\r\n\r\ninstance.instance.exports.run();\r\n\r\nlog('WAT module called JS imports:');\r\nresults.forEach((v, i) => log(' print[' + i + '] = ' + v));\r\nlog('');\r\nlog('First value is add(3, 4) = 7, then constants 100, 200');`,\r\n },\r\n\r\n // \u2500\u2500\u2500 SIMD \u2500\u2500\u2500\r\n 'simd-vec-add': {\r\n label: 'SIMD Vector Add',\r\n group: 'SIMD',\r\n description: 'Add two f32x4 vectors in memory using SIMD.',\r\n target: '3.0',\r\n features: ['simd'],\r\n code: `// SIMD: add two f32x4 vectors in memory\r\nconst mod = new webasmjs.ModuleBuilder('simdAdd');\r\nmod.defineMemory(1);\r\n\r\n// vec4_add(srcA, srcB, dst) \u2014 adds two 4-float vectors\r\nmod.defineFunction('vec4_add', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(2)); // push dest address first\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.add_f32x4();\r\n a.store_v128(2, 0); // store expects [addr, value] on stack\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getF32', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { vec4_add, setF32, getF32 } = instance.instance.exports;\r\n\r\n// A = [1, 2, 3, 4] at offset 0\r\n// B = [10, 20, 30, 40] at offset 16\r\nfor (let i = 0; i < 4; i++) {\r\n setF32(i * 4, i + 1);\r\n setF32(16 + i * 4, (i + 1) * 10);\r\n}\r\n\r\nvec4_add(0, 16, 32);\r\n\r\nlog('A = [1, 2, 3, 4]');\r\nlog('B = [10, 20, 30, 40]');\r\nlog('A + B:');\r\nfor (let i = 0; i < 4; i++) {\r\n log(' [' + i + '] = ' + getF32(32 + i * 4));\r\n}`,\r\n },\r\n\r\n 'simd-dot-product': {\r\n label: 'SIMD Dot Product',\r\n group: 'SIMD',\r\n description: 'Element-wise multiply then sum lanes for dot product.',\r\n target: '3.0',\r\n features: ['simd'],\r\n code: `// SIMD dot product: multiply element-wise then sum lanes\r\nconst mod = new webasmjs.ModuleBuilder('simdDot');\r\nmod.defineMemory(1);\r\n\r\nmod.defineFunction('dot4', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const products = a.declareLocal(webasmjs.ValueType.V128, 'products');\r\n\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.mul_f32x4();\r\n a.set_local(products);\r\n\r\n // Sum all 4 lanes\r\n a.get_local(products);\r\n a.extract_lane_f32x4(0);\r\n a.get_local(products);\r\n a.extract_lane_f32x4(1);\r\n a.add_f32();\r\n a.get_local(products);\r\n a.extract_lane_f32x4(2);\r\n a.add_f32();\r\n a.get_local(products);\r\n a.extract_lane_f32x4(3);\r\n a.add_f32();\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { dot4, setF32 } = instance.instance.exports;\r\n\r\nconst vecA = [1, 2, 3, 4];\r\nconst vecB = [5, 6, 7, 8];\r\n\r\nfor (let i = 0; i < 4; i++) {\r\n setF32(i * 4, vecA[i]);\r\n setF32(16 + i * 4, vecB[i]);\r\n}\r\n\r\nlog('A = [' + vecA + ']');\r\nlog('B = [' + vecB + ']');\r\nlog('dot(A, B) = ' + dot4(0, 16));\r\nlog('Expected: ' + (1*5 + 2*6 + 3*7 + 4*8));`,\r\n },\r\n\r\n 'simd-splat-scale': {\r\n label: 'SIMD Splat & Scale',\r\n group: 'SIMD',\r\n description: 'Broadcast a scalar to all lanes and multiply a vector.',\r\n target: '3.0',\r\n features: ['simd'],\r\n code: `// SIMD splat: broadcast a scalar to all lanes, then multiply\r\nconst mod = new webasmjs.ModuleBuilder('simdScale');\r\nmod.defineMemory(1);\r\n\r\n// scale_vec4(src, dst, scalar) \u2014 multiply a vector by a scalar\r\nmod.defineFunction('scale_vec4', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(1)); // push dest address first\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(2));\r\n a.splat_f32x4(); // broadcast scalar to all 4 lanes\r\n a.mul_f32x4();\r\n a.store_v128(2, 0); // store expects [addr, value] on stack\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getF32', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_f32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { scale_vec4, setF32, getF32 } = instance.instance.exports;\r\n\r\nconst vec = [2.0, 4.0, 6.0, 8.0];\r\nfor (let i = 0; i < 4; i++) setF32(i * 4, vec[i]);\r\n\r\nscale_vec4(0, 16, 3.0);\r\n\r\nlog('Vector: [' + vec + ']');\r\nlog('Scalar: 3.0');\r\nlog('Scaled:');\r\nfor (let i = 0; i < 4; i++) {\r\n log(' [' + i + '] = ' + getF32(16 + i * 4));\r\n}`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Bulk Memory \u2500\u2500\u2500\r\n 'bulk-memory': {\r\n label: 'Bulk Memory Ops',\r\n group: 'Bulk Memory',\r\n description: 'Fill and copy memory regions with bulk operations.',\r\n target: '2.0',\r\n features: ['bulk-memory'],\r\n code: `// Bulk memory: memory.fill and memory.copy\r\nconst mod = new webasmjs.ModuleBuilder('bulkMem');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// fill(dest, value, length)\r\nmod.defineFunction('fill', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.get_local(f.getParameter(2));\r\n a.memory_fill(0);\r\n}).withExport();\r\n\r\n// copy(dest, src, length)\r\nmod.defineFunction('copy', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.get_local(f.getParameter(2));\r\n a.memory_copy(0, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { fill, copy, memory } = instance.instance.exports;\r\nconst view = new Uint8Array(memory.buffer);\r\n\r\n// Fill 8 bytes at offset 0 with 0xAA\r\nfill(0, 0xAA, 8);\r\nlog('After fill(0, 0xAA, 8):');\r\nlog(' bytes[0..7] = [' + Array.from(view.slice(0, 8)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']');\r\n\r\n// Copy those 8 bytes to offset 32\r\ncopy(32, 0, 8);\r\nlog('');\r\nlog('After copy(32, 0, 8):');\r\nlog(' bytes[32..39] = [' + Array.from(view.slice(32, 40)).map(b => '0x' + b.toString(16).toUpperCase()).join(', ') + ']');\r\n\r\n// Fill a region with incrementing pattern using a loop\r\nfill(64, 0, 16);\r\nfor (let i = 0; i < 16; i++) {\r\n view[64 + i] = i * 3;\r\n}\r\nlog('');\r\nlog('Manual pattern at [64..79]:');\r\nlog(' ' + Array.from(view.slice(64, 80)).join(', '));\r\n\r\n// Copy that pattern further\r\ncopy(128, 64, 16);\r\nlog('Copied to [128..143]:');\r\nlog(' ' + Array.from(view.slice(128, 144)).join(', '));`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Post-MVP Features \u2500\u2500\u2500\r\n 'sign-extend': {\r\n label: 'Sign Extension',\r\n group: 'Post-MVP',\r\n description: 'Interpret low bits as signed values with extend8/extend16.',\r\n target: '2.0',\r\n features: ['sign-extend'],\r\n code: `// Sign extension: interpret low bits as signed values\r\nconst mod = new webasmjs.ModuleBuilder('signExt');\r\n\r\n// Treat low 8 bits as a signed byte\r\nmod.defineFunction('extend8', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend8_s_i32();\r\n}).withExport();\r\n\r\n// Treat low 16 bits as a signed i16\r\nmod.defineFunction('extend16', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.extend16_s_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { extend8, extend16 } = instance.instance.exports;\r\n\r\nlog('i32.extend8_s:');\r\nlog(' extend8(0x7F) = ' + extend8(0x7F) + ' (127, positive byte)');\r\nlog(' extend8(0x80) = ' + extend8(0x80) + ' (128 \u2192 -128, sign bit set)');\r\nlog(' extend8(0xFF) = ' + extend8(0xFF) + ' (255 \u2192 -1)');\r\nlog(' extend8(0x100) = ' + extend8(0x100) + ' (256 \u2192 0, wraps to low byte)');\r\nlog('');\r\nlog('i32.extend16_s:');\r\nlog(' extend16(0x7FFF) = ' + extend16(0x7FFF) + ' (32767, positive)');\r\nlog(' extend16(0x8000) = ' + extend16(0x8000) + ' (32768 \u2192 -32768)');\r\nlog(' extend16(0xFFFF) = ' + extend16(0xFFFF) + ' (65535 \u2192 -1)');`,\r\n },\r\n\r\n 'sat-trunc': {\r\n label: 'Saturating Truncation',\r\n group: 'Post-MVP',\r\n description: 'Float-to-int conversion that clamps instead of trapping.',\r\n target: '2.0',\r\n features: ['sat-trunc'],\r\n code: `// Saturating truncation: float \u2192 int without trapping on overflow\r\nconst mod = new webasmjs.ModuleBuilder('satTrunc');\r\n\r\n// Normal trunc would trap on overflow; saturating clamps instead\r\nmod.defineFunction('sat_f64_to_i32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_sat_f64_s_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('sat_f64_to_u32', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.trunc_sat_f64_u_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { sat_f64_to_i32, sat_f64_to_u32 } = instance.instance.exports;\r\n\r\nlog('Saturating f64 \u2192 i32 (signed):');\r\nlog(' 42.9 \u2192 ' + sat_f64_to_i32(42.9));\r\nlog(' -42.9 \u2192 ' + sat_f64_to_i32(-42.9));\r\nlog(' 1e20 \u2192 ' + sat_f64_to_i32(1e20) + ' (clamped to i32 max)');\r\nlog(' -1e20 \u2192 ' + sat_f64_to_i32(-1e20) + ' (clamped to i32 min)');\r\nlog(' NaN \u2192 ' + sat_f64_to_i32(NaN) + ' (NaN \u2192 0)');\r\nlog(' Inf \u2192 ' + sat_f64_to_i32(Infinity) + ' (clamped)');\r\nlog('');\r\nlog('Saturating f64 \u2192 u32 (unsigned, shown as signed i32):');\r\nlog(' 42.9 \u2192 ' + sat_f64_to_u32(42.9));\r\nlog(' -1.0 \u2192 ' + sat_f64_to_u32(-1.0) + ' (negative \u2192 0)');\r\nlog(' 1e20 \u2192 ' + sat_f64_to_u32(1e20) + ' (clamped to u32 max)');`,\r\n },\r\n\r\n 'ref-types': {\r\n label: 'Reference Types',\r\n group: 'Post-MVP',\r\n description: 'Use ref.null, ref.is_null, and ref.func instructions.',\r\n target: '2.0',\r\n features: ['reference-types'],\r\n code: `// Reference types: ref.null, ref.is_null, ref.func\r\nconst mod = new webasmjs.ModuleBuilder('refTypes');\r\n\r\nconst double = mod.defineFunction('double', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(2);\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Check if a null funcref is null \u2192 1\r\nmod.defineFunction('isRefNull', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.ref_null(0x70);\r\n a.ref_is_null();\r\n}).withExport();\r\n\r\n// Check if a real function ref is null \u2192 0\r\nmod.defineFunction('isFuncNull', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.ref_func(double);\r\n a.ref_is_null();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { isRefNull, isFuncNull } = instance.instance.exports;\r\n\r\nlog('ref.null + ref.is_null:');\r\nlog(' null funcref is null: ' + (isRefNull() === 1));\r\nlog(' real func ref is null: ' + (isFuncNull() === 1));\r\nlog('');\r\nlog('double(21) = ' + instance.instance.exports.double(21));`,\r\n },\r\n\r\n 'target-system': {\r\n label: 'Target System',\r\n group: 'Post-MVP',\r\n description: 'Choose WebAssembly targets and feature flags.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Target system: control which features are available\r\n// Default is 'latest' \u2014 all features enabled\r\nconst modLatest = new webasmjs.ModuleBuilder('latest');\r\nlog('latest features:');\r\nlog(' threads: ' + modLatest.hasFeature('threads'));\r\nlog(' simd: ' + modLatest.hasFeature('simd'));\r\nlog(' exception-handling: ' + modLatest.hasFeature('exception-handling'));\r\nlog(' memory64: ' + modLatest.hasFeature('memory64'));\r\nlog(' relaxed-simd: ' + modLatest.hasFeature('relaxed-simd'));\r\n\r\nlog('');\r\n\r\n// WebAssembly 2.0 \u2014 only widely-deployed features\r\nconst mod2 = new webasmjs.ModuleBuilder('compat', { target: '2.0' });\r\nlog('2.0 features:');\r\nlog(' sign-extend: ' + mod2.hasFeature('sign-extend'));\r\nlog(' bulk-memory: ' + mod2.hasFeature('bulk-memory'));\r\nlog(' threads: ' + mod2.hasFeature('threads'));\r\nlog(' simd: ' + mod2.hasFeature('simd'));\r\n\r\nlog('');\r\n\r\n// MVP with specific features\r\nconst modCustom = new webasmjs.ModuleBuilder('custom', {\r\n target: 'mvp',\r\n features: ['simd', 'bulk-memory'],\r\n});\r\nlog('mvp + simd + bulk-memory:');\r\nlog(' simd: ' + modCustom.hasFeature('simd'));\r\nlog(' bulk-memory: ' + modCustom.hasFeature('bulk-memory'));\r\nlog(' threads: ' + modCustom.hasFeature('threads'));\r\n\r\nlog('');\r\n\r\n// Build a simple module with 2.0 target\r\nmod2.defineFunction('add', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod2.instantiate();\r\nlog('2.0 module works: add(3, 4) = ' + instance.instance.exports.add(3, 4));`,\r\n },\r\n\r\n 'multi-value': {\r\n label: 'Multi-Value Returns',\r\n group: 'Post-MVP',\r\n description: 'Functions returning multiple values at once.',\r\n target: '2.0',\r\n features: ['multi-value'],\r\n code: `// Multi-value: functions can return more than one value\r\nconst mod = new webasmjs.ModuleBuilder('multiValue');\r\n\r\n// divmod returns both quotient and remainder\r\nmod.defineFunction('divmod', [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const dividend = f.getParameter(0);\r\n const divisor = f.getParameter(1);\r\n\r\n // Push quotient\r\n a.get_local(dividend);\r\n a.get_local(divisor);\r\n a.div_s_i32();\r\n\r\n // Push remainder\r\n a.get_local(dividend);\r\n a.get_local(divisor);\r\n a.rem_s_i32();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst divmod = instance.instance.exports.divmod;\r\n\r\nlog('Multi-value returns (quotient, remainder):');\r\nfor (const [a, b] of [[17, 5], [100, 7], [42, 6], [99, 10]]) {\r\n const result = divmod(a, b);\r\n log(' ' + a + ' / ' + b + ' = ' + result);\r\n}`,\r\n },\r\n\r\n 'mutable-global-export': {\r\n label: 'Mutable Global Export',\r\n group: 'Post-MVP',\r\n description: 'Export a mutable global, read from JavaScript.',\r\n target: '2.0',\r\n features: ['mutable-globals'],\r\n code: `// Mutable global export: JS can read the global's value\r\nconst mod = new webasmjs.ModuleBuilder('mutGlobal');\r\n\r\nconst counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\nmod.exportGlobal(counter, 'counter');\r\n\r\nmod.defineFunction('increment', null, [], (f, a) => {\r\n a.get_global(counter);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_global(counter);\r\n}).withExport();\r\n\r\nmod.defineFunction('add', null, [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_global(counter);\r\n a.get_local(f.getParameter(0));\r\n a.add_i32();\r\n a.set_global(counter);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { increment, add, counter: g } = instance.instance.exports;\r\n\r\nlog('Initial: ' + g.value);\r\nincrement();\r\nincrement();\r\nincrement();\r\nlog('After 3 increments: ' + g.value);\r\nadd(10);\r\nlog('After add(10): ' + g.value);\r\nadd(-5);\r\nlog('After add(-5): ' + g.value);`,\r\n },\r\n\r\n 'tail-call': {\r\n label: 'Tail Calls',\r\n group: 'Post-MVP',\r\n description: 'Tail-recursive factorial \u2014 no stack overflow.',\r\n target: '3.0',\r\n features: ['tail-call'],\r\n code: `// Tail calls: return_call reuses the current frame\r\nconst mod = new webasmjs.ModuleBuilder('tailCall');\r\n\r\n// Tail-recursive helper: fact_helper(n, acc)\r\nconst helper = mod.defineFunction('fact_helper', [webasmjs.ValueType.Int64],\r\n [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => {\r\n const n = f.getParameter(0);\r\n const acc = f.getParameter(1);\r\n\r\n // Base case: n <= 1\r\n a.get_local(n);\r\n a.const_i64(1n);\r\n a.le_s_i64();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.get_local(acc);\r\n a.return();\r\n });\r\n\r\n // Tail call: return_call fact_helper(n-1, n*acc)\r\n a.get_local(n);\r\n a.const_i64(1n);\r\n a.sub_i64();\r\n a.get_local(n);\r\n a.get_local(acc);\r\n a.mul_i64();\r\n a.return_call(helper);\r\n});\r\n\r\n// Public entry: factorial(n)\r\nmod.defineFunction('factorial', [webasmjs.ValueType.Int64],\r\n [webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i64(1n);\r\n a.call(helper);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst factorial = instance.instance.exports.factorial;\r\n\r\nlog('Tail-recursive factorial (i64):');\r\nfor (let n = 0n; n <= 20n; n++) {\r\n log(' ' + n + '! = ' + factorial(n));\r\n}\r\nlog('');\r\nlog('No stack overflow \u2014 return_call reuses the frame!');`,\r\n },\r\n\r\n 'shared-memory': {\r\n label: 'Shared Memory',\r\n group: 'Post-MVP',\r\n description: 'Shared memory with atomic load/store/add.',\r\n target: '3.0',\r\n features: ['threads'],\r\n code: `// Shared memory + atomic operations\r\nconst mod = new webasmjs.ModuleBuilder('atomics');\r\n\r\n// Shared memory requires both initial and maximum\r\nconst mem = mod.defineMemory(1, 10, true); // shared=true\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// Atomic store\r\nmod.defineFunction('atomicStore', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.atomic_store_i32(2, 0);\r\n}).withExport();\r\n\r\n// Atomic load\r\nmod.defineFunction('atomicLoad', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.atomic_load_i32(2, 0);\r\n}).withExport();\r\n\r\n// Atomic add (returns old value)\r\nmod.defineFunction('atomicAdd', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.atomic_rmw_add_i32(2, 0);\r\n}).withExport();\r\n\r\n// Atomic compare-and-swap\r\nmod.defineFunction('atomicCAS', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0)); // address\r\n a.get_local(f.getParameter(1)); // expected\r\n a.get_local(f.getParameter(2)); // replacement\r\n a.atomic_rmw_cmpxchg_i32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { atomicStore, atomicLoad, atomicAdd, atomicCAS } = instance.instance.exports;\r\n\r\nlog('=== Atomic Operations ===');\r\natomicStore(0, 100);\r\nlog('atomicStore(0, 100)');\r\nlog('atomicLoad(0) = ' + atomicLoad(0));\r\n\r\nlog('');\r\nconst old1 = atomicAdd(0, 5);\r\nlog('atomicAdd(0, 5) returned old value: ' + old1);\r\nlog('atomicLoad(0) = ' + atomicLoad(0));\r\n\r\nconst old2 = atomicAdd(0, 10);\r\nlog('atomicAdd(0, 10) returned old value: ' + old2);\r\nlog('atomicLoad(0) = ' + atomicLoad(0));\r\n\r\nlog('');\r\nlog('=== Compare-and-Swap ===');\r\nconst cas1 = atomicCAS(0, 115, 200);\r\nlog('atomicCAS(0, 115, 200) = ' + cas1 + ' (matched, swapped)');\r\nlog('atomicLoad(0) = ' + atomicLoad(0));\r\n\r\nconst cas2 = atomicCAS(0, 999, 300);\r\nlog('atomicCAS(0, 999, 300) = ' + cas2 + ' (no match, not swapped)');\r\nlog('atomicLoad(0) = ' + atomicLoad(0));`,\r\n },\r\n\r\n 'exception-handling': {\r\n label: 'Exception Handling',\r\n group: 'Post-MVP',\r\n description: 'Define tags and throw exceptions from WASM.',\r\n target: '3.0',\r\n features: ['exception-handling'],\r\n code: `// Exception handling: defineTag + throw\r\nconst mod = new webasmjs.ModuleBuilder('exceptions', { disableVerification: true });\r\n\r\n// Define a tag with an i32 payload (like an error code)\r\nconst errorTag = mod.defineTag([webasmjs.ValueType.Int32]);\r\n\r\n// Throws when input is negative\r\nmod.defineFunction('checkPositive', null, [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(0);\r\n a.lt_s_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.get_local(f.getParameter(0));\r\n a.throw(errorTag._index);\r\n });\r\n}).withExport();\r\n\r\n// Show the WAT output with tag and throw\r\nconst wat = mod.toString();\r\nlog('=== WAT Output ===');\r\nlog(wat);\r\n\r\n// Compile to bytes\r\nconst bytes = mod.toBytes();\r\nlog('Module compiled: ' + bytes.length + ' bytes');\r\nlog('Valid WASM: ' + WebAssembly.validate(bytes.buffer));`,\r\n },\r\n\r\n 'memory64': {\r\n label: 'Memory64',\r\n group: 'Post-MVP',\r\n description: '64-bit addressed memory for very large address spaces.',\r\n target: '3.0',\r\n features: ['memory64'],\r\n code: `// Memory64: 64-bit addressed memory\r\nconst mod = new webasmjs.ModuleBuilder('memory64');\r\n\r\n// Define a 64-bit addressed memory\r\nconst mem = mod.defineMemory(1, 100, false, true); // memory64=true\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// Store: address is i64 for memory64\r\nmod.defineFunction('store64', null,\r\n [webasmjs.ValueType.Int64, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0)); // i64 address\r\n a.get_local(f.getParameter(1)); // i32 value\r\n a.store_i32(2, 0);\r\n}).withExport();\r\n\r\n// Load: address is i64 for memory64\r\nmod.defineFunction('load64', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0)); // i64 address\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\n// Show the WAT \u2014 note i64 addresses\r\nconst wat = mod.toString();\r\nlog('=== WAT Output (memory64) ===');\r\nlog(wat);\r\n\r\n// Compile\r\nconst bytes = mod.toBytes();\r\nlog('');\r\nlog('Module compiled: ' + bytes.length + ' bytes');\r\nlog('');\r\nlog('Note: memory64 uses i64 addresses instead of i32.');\r\nlog('Runtime instantiation requires engine support for memory64.');`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Debug & Inspection \u2500\u2500\u2500\r\n 'debug-names': {\r\n label: 'Debug Name Section',\r\n group: 'Debug',\r\n description: 'Inspect function, local, and global names in the binary.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Inspect the debug name section in the binary\r\nconst mod = new webasmjs.ModuleBuilder('debugExample');\r\n\r\nconst g = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\ng.withName('counter');\r\n\r\nmod.defineFunction('add', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n f.getParameter(0).withName('x');\r\n f.getParameter(1).withName('y');\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('addThree', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n f.getParameter(0).withName('a');\r\n f.getParameter(1).withName('b');\r\n f.getParameter(2).withName('c');\r\n const temp = a.declareLocal(webasmjs.ValueType.Int32, 'temp');\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n a.get_local(f.getParameter(2));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nconst bytes = mod.toBytes();\r\n\r\nlog('Binary size: ' + bytes.length + ' bytes');\r\nlog('');\r\n\r\n// Read back the name section\r\nconst reader = new webasmjs.BinaryReader(bytes);\r\nconst info = reader.read();\r\nconst ns = info.nameSection;\r\n\r\nif (ns) {\r\n log('Module name: ' + ns.moduleName);\r\n log('');\r\n\r\n if (ns.functionNames) {\r\n log('Function names:');\r\n ns.functionNames.forEach((name, idx) => {\r\n log(' [' + idx + '] ' + name);\r\n });\r\n }\r\n\r\n if (ns.localNames) {\r\n log('');\r\n log('Local/parameter names:');\r\n ns.localNames.forEach((locals, funcIdx) => {\r\n const funcName = ns.functionNames?.get(funcIdx) || 'func' + funcIdx;\r\n log(' ' + funcName + ':');\r\n locals.forEach((name, localIdx) => {\r\n log(' [' + localIdx + '] ' + name);\r\n });\r\n });\r\n }\r\n\r\n if (ns.globalNames) {\r\n log('');\r\n log('Global names:');\r\n ns.globalNames.forEach((name, idx) => {\r\n log(' [' + idx + '] ' + name);\r\n });\r\n }\r\n} else {\r\n log('No name section found!');\r\n}`,\r\n },\r\n\r\n 'binary-inspect': {\r\n label: 'Binary Inspector',\r\n group: 'Debug',\r\n description: 'Read back the binary structure \u2014 types, functions, exports.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Inspect the binary structure of a WASM module\r\nconst mod = new webasmjs.ModuleBuilder('inspect');\r\nmod.defineMemory(1);\r\n\r\nconst counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0);\r\n\r\nmod.defineFunction('add', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('noop', null, [], (f, a) => {\r\n a.nop();\r\n}).withExport();\r\n\r\nconst bytes = mod.toBytes();\r\n\r\nlog('=== Binary Analysis ===');\r\nlog('Total size: ' + bytes.length + ' bytes');\r\nlog('');\r\n\r\n// Read with BinaryReader\r\nconst reader = new webasmjs.BinaryReader(bytes);\r\nconst info = reader.read();\r\n\r\nlog('WASM version: ' + info.version);\r\nlog('Types: ' + info.types.length);\r\ninfo.types.forEach((t, i) => {\r\n const params = t.parameterTypes.map(p => p.name).join(', ');\r\n const results = t.returnTypes.map(r => r.name).join(', ');\r\n log(' [' + i + '] (' + params + ') -> (' + results + ')');\r\n});\r\n\r\nlog('Functions: ' + info.functions.length);\r\ninfo.functions.forEach((f, i) => {\r\n log(' [' + i + '] type=' + f.typeIndex + ', locals=' + f.locals.length + ', body=' + f.body.length + ' bytes');\r\n});\r\n\r\nlog('Memories: ' + info.memories.length);\r\ninfo.memories.forEach((m, i) => {\r\n log(' [' + i + '] initial=' + m.initial + ' pages (' + (m.initial * 64) + ' KB)');\r\n});\r\n\r\nlog('Globals: ' + info.globals.length);\r\ninfo.globals.forEach((g, i) => {\r\n log(' [' + i + '] mutable=' + g.mutable);\r\n});\r\n\r\nlog('Exports: ' + info.exports.length);\r\ninfo.exports.forEach((e) => {\r\n const kinds = ['function', 'table', 'memory', 'global'];\r\n log(' \"' + e.name + '\" -> ' + (kinds[e.kind] || 'unknown') + '[' + e.index + ']');\r\n});\r\n\r\nlog('');\r\nlog('Valid: ' + WebAssembly.validate(bytes.buffer));`,\r\n },\r\n\r\n 'wat-roundtrip': {\r\n label: 'WAT Roundtrip',\r\n group: 'Debug',\r\n description: 'Build a module, emit WAT, parse it back, and verify.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Build a module programmatically, inspect WAT, parse it back\r\nconst mod = new webasmjs.ModuleBuilder('roundtrip');\r\n\r\nmod.defineFunction('multiply', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i32();\r\n}).withExport();\r\n\r\nmod.defineFunction('negate', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n a.const_i32(0);\r\n a.get_local(f.getParameter(0));\r\n a.sub_i32();\r\n}).withExport();\r\n\r\n// Get WAT text\r\nconst watText = mod.toString();\r\nlog('=== Generated WAT ===');\r\nlog(watText);\r\n\r\n// Parse it back\r\nlog('');\r\nlog('=== Parsing WAT back... ===');\r\nconst mod2 = webasmjs.parseWat(watText);\r\n\r\n// Instantiate and test\r\nconst instance = await mod2.instantiate();\r\nconst { multiply, negate } = instance.instance.exports;\r\n\r\nlog('multiply(6, 7) = ' + multiply(6, 7));\r\nlog('multiply(100, -3) = ' + multiply(100, -3));\r\nlog('negate(42) = ' + negate(42));\r\nlog('negate(-10) = ' + negate(-10));\r\nlog('');\r\nlog('Roundtrip successful!');`,\r\n },\r\n\r\n 'custom-section': {\r\n label: 'Custom Section',\r\n group: 'Debug',\r\n description: 'Add custom metadata to a module and read it back.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// Custom section \u2014 embed arbitrary metadata in the binary\r\nconst mod = new webasmjs.ModuleBuilder('customSec');\r\n\r\nmod.defineFunction('nop', null, [], (f, a) => {\r\n a.nop();\r\n}).withExport();\r\n\r\n// Add custom sections with metadata\r\nconst version = new TextEncoder().encode('1.0.0');\r\nmod.defineCustomSection('version', new Uint8Array(version));\r\n\r\nconst author = new TextEncoder().encode('webasmjs playground');\r\nmod.defineCustomSection('author', new Uint8Array(author));\r\n\r\nconst bytes = mod.toBytes();\r\nlog('Module size: ' + bytes.length + ' bytes');\r\n\r\n// Read it back with BinaryReader\r\nconst reader = new webasmjs.BinaryReader(bytes);\r\nconst info = reader.read();\r\n\r\nlog('');\r\nlog('Custom sections found:');\r\nif (info.customSections) {\r\n for (const sec of info.customSections) {\r\n const text = new TextDecoder().decode(sec.data);\r\n log(' \"' + sec.name + '\" = \"' + text + '\" (' + sec.data.length + ' bytes)');\r\n }\r\n} else {\r\n log(' (none found \u2014 BinaryReader may not expose custom sections)');\r\n}\r\n\r\nlog('');\r\nlog('The binary is still valid WASM:');\r\nlog(' WebAssembly.validate() = ' + WebAssembly.validate(bytes.buffer));`,\r\n },\r\n\r\n 'extended-const': {\r\n label: 'Extended Constants',\r\n group: 'Post-MVP',\r\n description: 'Arithmetic in global init expressions with extended-const.',\r\n target: '3.0',\r\n features: ['extended-const'],\r\n code: `// Extended constants: arithmetic in global initializers\r\nconst mod = new webasmjs.ModuleBuilder('extConst', {\r\n target: 'mvp',\r\n features: ['extended-const'],\r\n});\r\n\r\n// Base offset as an immutable global\r\nconst base = mod.defineGlobal(webasmjs.ValueType.Int32, false, 100);\r\n\r\n// Computed global: base + 50 (uses i32.add in init expression)\r\nconst offset1 = mod.defineGlobal(webasmjs.ValueType.Int32, false, (asm) => {\r\n asm.get_global(base);\r\n asm.const_i32(50);\r\n asm.add_i32();\r\n});\r\n\r\n// Computed global: base * 3 (uses i32.mul in init expression)\r\nconst scaled = mod.defineGlobal(webasmjs.ValueType.Int32, false, (asm) => {\r\n asm.get_global(base);\r\n asm.const_i32(3);\r\n asm.mul_i32();\r\n});\r\n\r\n// Computed global: base * 2 + 7\r\nconst combined = mod.defineGlobal(webasmjs.ValueType.Int32, false, (asm) => {\r\n asm.get_global(base);\r\n asm.const_i32(2);\r\n asm.mul_i32();\r\n asm.const_i32(7);\r\n asm.add_i32();\r\n});\r\n\r\nmod.defineFunction('getBase', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(base);\r\n}).withExport();\r\n\r\nmod.defineFunction('getOffset1', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(offset1);\r\n}).withExport();\r\n\r\nmod.defineFunction('getScaled', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(scaled);\r\n}).withExport();\r\n\r\nmod.defineFunction('getCombined', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.get_global(combined);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { getBase, getOffset1, getScaled, getCombined } = instance.instance.exports;\r\n\r\nlog('Extended-const: arithmetic in global init expressions');\r\nlog('base = ' + getBase());\r\nlog('base + 50 = ' + getOffset1());\r\nlog('base * 3 = ' + getScaled());\r\nlog('base * 2 + 7 = ' + getCombined());`,\r\n },\r\n\r\n 'multi-memory': {\r\n label: 'Multi-Memory',\r\n group: 'Post-MVP',\r\n description: 'Define and use multiple linear memories in one module.',\r\n target: '3.0',\r\n features: ['multi-memory'],\r\n code: `// Multi-memory: two separate linear memories\r\nconst mod = new webasmjs.ModuleBuilder('multiMem', {\r\n target: 'mvp',\r\n features: ['multi-memory'],\r\n});\r\n\r\nconst mem0 = mod.defineMemory(1);\r\nmod.exportMemory(mem0, 'mem0');\r\nconst mem1 = mod.defineMemory(1);\r\nmod.exportMemory(mem1, 'mem1');\r\n\r\n// Store to memory 0\r\nmod.defineFunction('store0', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0, 0); // memIndex=0\r\n}).withExport();\r\n\r\n// Load from memory 0\r\nmod.defineFunction('load0', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_i32(2, 0, 0); // memIndex=0\r\n}).withExport();\r\n\r\n// Store to memory 1\r\nmod.defineFunction('store1', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0, 1); // memIndex=1\r\n}).withExport();\r\n\r\n// Load from memory 1\r\nmod.defineFunction('load1', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_i32(2, 0, 1); // memIndex=1\r\n}).withExport();\r\n\r\n// Show WAT with two memories\r\nconst wat = mod.toString();\r\nlog('=== WAT Output ===');\r\nlog(wat);\r\n\r\nconst bytes = mod.toBytes();\r\nlog('Module compiled: ' + bytes.length + ' bytes');\r\nlog('Valid WASM: ' + WebAssembly.validate(bytes.buffer));`,\r\n },\r\n\r\n 'multi-table': {\r\n label: 'Multi-Table',\r\n group: 'Post-MVP',\r\n description: 'Define multiple function tables and dispatch through each.',\r\n target: '3.0',\r\n features: ['multi-table'],\r\n code: `// Multi-table: two function tables for different dispatch\r\nconst mod = new webasmjs.ModuleBuilder('multiTable', {\r\n target: 'mvp',\r\n features: ['multi-table'],\r\n});\r\n\r\nconst add = mod.defineFunction('add', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n});\r\n\r\nconst sub = mod.defineFunction('sub', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.sub_i32();\r\n});\r\n\r\nconst mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i32();\r\n});\r\n\r\n// Table 0: math operations\r\nconst table0 = mod.defineTable(webasmjs.ElementType.AnyFunc, 3);\r\nmod.defineTableSegment(table0, [add, sub, mul], 0);\r\n\r\n// Table 1: just add and mul (different arrangement)\r\nconst table1 = mod.defineTable(webasmjs.ElementType.AnyFunc, 2);\r\nmod.defineTableSegment(table1, [mul, add], 0);\r\n\r\n// Show WAT with two tables\r\nconst wat = mod.toString();\r\nlog('=== WAT Output (multi-table) ===');\r\nlog(wat);\r\n\r\nconst bytes = mod.toBytes();\r\nlog('Module compiled: ' + bytes.length + ' bytes');\r\nlog('Valid WASM: ' + WebAssembly.validate(bytes.buffer));`,\r\n },\r\n\r\n 'relaxed-simd': {\r\n label: 'Relaxed SIMD',\r\n group: 'Post-MVP',\r\n description: 'Relaxed SIMD operations for performance-sensitive code.',\r\n target: 'latest',\r\n features: ['relaxed-simd'],\r\n code: `// Relaxed SIMD: relaxed_madd for fused multiply-add\r\nconst mod = new webasmjs.ModuleBuilder('relaxedSimd');\r\nmod.defineMemory(1);\r\n\r\n// relaxed_madd: a * b + c (fused multiply-add, may use FMA instruction)\r\nmod.defineFunction('madd_f32x4', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32,\r\n webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(3)); // dest address\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0); // load A\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0); // load B\r\n a.get_local(f.getParameter(2));\r\n a.load_v128(2, 0); // load C\r\n a.relaxed_madd_f32x4(); // A * B + C\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('setF32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_f32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getF32', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_f32(2, 0);\r\n}).withExport();\r\n\r\n// Show WAT\r\nconst wat = mod.toString();\r\nlog('=== WAT Output (relaxed SIMD) ===');\r\nlog(wat);\r\n\r\nconst bytes = mod.toBytes();\r\nlog('Module compiled: ' + bytes.length + ' bytes');\r\nlog('Valid WASM: ' + WebAssembly.validate(bytes.buffer));`,\r\n },\r\n\r\n 'atomic-rmw': {\r\n label: 'Atomic RMW Ops',\r\n group: 'Post-MVP',\r\n description: 'Atomic read-modify-write: sub, and, or, xor, exchange.',\r\n target: '3.0',\r\n features: ['threads'],\r\n code: `// Atomic read-modify-write operations\r\nconst mod = new webasmjs.ModuleBuilder('atomicRMW');\r\n\r\n// Shared memory for atomics\r\nconst mem = mod.defineMemory(1, 10, true);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// Atomic store\r\nmod.defineFunction('store', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.atomic_store_i32(2, 0);\r\n}).withExport();\r\n\r\n// Atomic load\r\nmod.defineFunction('load', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.atomic_load_i32(2, 0);\r\n}).withExport();\r\n\r\n// Atomic sub (returns old value)\r\nmod.defineFunction('atomicSub', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.atomic_rmw_sub_i32(2, 0);\r\n}).withExport();\r\n\r\n// Atomic AND (returns old value)\r\nmod.defineFunction('atomicAnd', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.atomic_rmw_and_i32(2, 0);\r\n}).withExport();\r\n\r\n// Atomic OR (returns old value)\r\nmod.defineFunction('atomicOr', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.atomic_rmw_or_i32(2, 0);\r\n}).withExport();\r\n\r\n// Atomic XOR (returns old value)\r\nmod.defineFunction('atomicXor', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.atomic_rmw_xor_i32(2, 0);\r\n}).withExport();\r\n\r\n// Atomic exchange (returns old value, stores new)\r\nmod.defineFunction('atomicXchg', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.atomic_rmw_xchg_i32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { store, load, atomicSub, atomicAnd, atomicOr, atomicXor, atomicXchg } = instance.instance.exports;\r\n\r\nlog('=== Atomic Read-Modify-Write ===');\r\nlog('All RMW ops return the OLD value before modification.');\r\nlog('');\r\n\r\n// Sub\r\nstore(0, 100);\r\nconst oldSub = atomicSub(0, 30);\r\nlog('atomicSub(100, 30): old=' + oldSub + ', new=' + load(0));\r\n\r\n// AND\r\nstore(0, 0xFF);\r\nconst oldAnd = atomicAnd(0, 0x0F);\r\nlog('atomicAnd(0xFF, 0x0F): old=0x' + (oldAnd >>> 0).toString(16) + ', new=0x' + (load(0) >>> 0).toString(16));\r\n\r\n// OR\r\nstore(0, 0xF0);\r\nconst oldOr = atomicOr(0, 0x0F);\r\nlog('atomicOr(0xF0, 0x0F): old=0x' + (oldOr >>> 0).toString(16) + ', new=0x' + (load(0) >>> 0).toString(16));\r\n\r\n// XOR\r\nstore(0, 0xFF);\r\nconst oldXor = atomicXor(0, 0xAA);\r\nlog('atomicXor(0xFF, 0xAA): old=0x' + (oldXor >>> 0).toString(16) + ', new=0x' + (load(0) >>> 0).toString(16));\r\n\r\n// Exchange\r\nstore(0, 42);\r\nconst oldXchg = atomicXchg(0, 99);\r\nlog('atomicXchg(42, 99): old=' + oldXchg + ', new=' + load(0));`,\r\n },\r\n\r\n 'atomic-wait-notify': {\r\n label: 'Wait & Notify',\r\n group: 'Post-MVP',\r\n description: 'Atomic wait/notify primitives and memory fence.',\r\n target: '3.0',\r\n features: ['threads'],\r\n code: `// Atomic wait, notify, and fence \u2014 thread synchronization primitives\r\nconst mod = new webasmjs.ModuleBuilder('waitNotify', { disableVerification: true });\r\n\r\nconst mem = mod.defineMemory(1, 10, true);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// atomic.wait32(addr, expected, timeout) -> 0=ok, 1=not-equal, 2=timed-out\r\nmod.defineFunction('wait32', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int64], (f, a) => {\r\n a.get_local(f.getParameter(0)); // address\r\n a.get_local(f.getParameter(1)); // expected value\r\n a.get_local(f.getParameter(2)); // timeout in ns (-1 = infinite)\r\n a.atomic_wait32(2, 0);\r\n}).withExport();\r\n\r\n// atomic.notify(addr, count) -> number of waiters woken\r\nmod.defineFunction('notify', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0)); // address\r\n a.get_local(f.getParameter(1)); // count of waiters to wake\r\n a.atomic_notify(2, 0);\r\n}).withExport();\r\n\r\n// atomic.fence \u2014 full memory barrier\r\nmod.defineFunction('fence', null, [], (f, a) => {\r\n a.atomic_fence(0);\r\n}).withExport();\r\n\r\n// Atomic store for setup\r\nmod.defineFunction('store', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.atomic_store_i32(2, 0);\r\n}).withExport();\r\n\r\n// Show the WAT output\r\nconst wat = mod.toString();\r\nlog('=== WAT Output (wait/notify/fence) ===');\r\nlog(wat);\r\n\r\n// Compile and validate\r\nconst bytes = mod.toBytes();\r\nlog('Module compiled: ' + bytes.length + ' bytes');\r\nlog('Valid WASM: ' + WebAssembly.validate(bytes.buffer));\r\nlog('');\r\nlog('Note: atomic.wait blocks the calling thread until notified.');\r\nlog('In a multi-threaded setup:');\r\nlog(' Thread A: wait32(addr, 0, -1n) // sleep until value changes');\r\nlog(' Thread B: store(addr, 1); notify(addr, 1) // wake thread A');\r\nlog(' fence() ensures memory operations are visible across threads.');`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Additional SIMD \u2500\u2500\u2500\r\n 'simd-integer': {\r\n label: 'SIMD Integer Ops',\r\n group: 'SIMD',\r\n description: 'Integer SIMD: i32x4 add, sub, mul, comparisons, and lane ops.',\r\n target: '3.0',\r\n features: ['simd'],\r\n code: `// Integer SIMD: i32x4 arithmetic, comparisons, lane extract/replace\r\nconst mod = new webasmjs.ModuleBuilder('simdInt');\r\nmod.defineMemory(1);\r\n\r\n// Add two i32x4 vectors\r\nmod.defineFunction('add_i32x4', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(2));\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.add_i32x4();\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\n// Element-wise min (signed)\r\nmod.defineFunction('min_s_i32x4', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(2));\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.min_s_i32x4();\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\n// Extract a single lane\r\nmod.defineFunction('extract', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n // Load vector, extract lane based on index using a br_table\r\n // For simplicity, extract lane 0 from the vector at the address\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.extract_lane_i32x4(0);\r\n}).withExport();\r\n\r\n// Splat a scalar to all 4 lanes\r\nmod.defineFunction('splat_i32x4', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0)); // dest\r\n a.get_local(f.getParameter(1)); // scalar\r\n a.splat_i32x4();\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('setI32', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store_i32(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getI32', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load_i32(2, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { add_i32x4, min_s_i32x4, extract, splat_i32x4, setI32, getI32 } = instance.instance.exports;\r\n\r\n// A = [10, 20, 30, 40], B = [5, 25, 15, 45]\r\nconst a = [10, 20, 30, 40], b = [5, 25, 15, 45];\r\nfor (let i = 0; i < 4; i++) { setI32(i * 4, a[i]); setI32(16 + i * 4, b[i]); }\r\n\r\nadd_i32x4(0, 16, 32);\r\nlog('A = [' + a + ']');\r\nlog('B = [' + b + ']');\r\nlog('A + B = [' + [getI32(32), getI32(36), getI32(40), getI32(44)] + ']');\r\n\r\nmin_s_i32x4(0, 16, 48);\r\nlog('min(A, B) = [' + [getI32(48), getI32(52), getI32(56), getI32(60)] + ']');\r\n\r\nlog('');\r\nlog('extract lane 0 of A: ' + extract(0, 0));\r\n\r\nsplat_i32x4(64, 7);\r\nlog('splat(7) = [' + [getI32(64), getI32(68), getI32(72), getI32(76)] + ']');`,\r\n },\r\n\r\n 'simd-shuffle': {\r\n label: 'SIMD Shuffle & Swizzle',\r\n group: 'SIMD',\r\n description: 'Rearrange vector lanes with shuffle and swizzle.',\r\n target: '3.0',\r\n features: ['simd'],\r\n code: `// SIMD shuffle & swizzle: rearrange bytes across vectors\r\nconst mod = new webasmjs.ModuleBuilder('simdShuffle');\r\nmod.defineMemory(1);\r\n\r\n// shuffle: pick 16 bytes from two source vectors by index\r\n// Indices 0-15 = first vector, 16-31 = second vector\r\nmod.defineFunction('interleave', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(2)); // dest\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0); // vector A\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0); // vector B\r\n // Interleave first 4 bytes: A[0], B[0], A[1], B[1], A[2], B[2], A[3], B[3], ...\r\n a.shuffle_i8x16(new Uint8Array([0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23]));\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\n// Reverse bytes within a vector using shuffle\r\nmod.defineFunction('reverse', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(1)); // dest\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0); // same vector for both operands\r\n a.shuffle_i8x16(new Uint8Array([15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]));\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\n// swizzle: rearrange bytes using a dynamic index vector\r\nmod.defineFunction('swizzle', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(2)); // dest\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0); // data\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0); // indices\r\n a.swizzle_i8x16();\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('setByte', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store8_i32(0, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getByte', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load8_i32_u(0, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { interleave, reverse, swizzle, setByte, getByte } = instance.instance.exports;\r\n\r\n// Set up: A = [0,1,2,...,15], B = [16,17,...,31]\r\nfor (let i = 0; i < 16; i++) { setByte(i, i); setByte(16 + i, 16 + i); }\r\n\r\ninterleave(0, 16, 32);\r\nconst interleaved = [];\r\nfor (let i = 0; i < 16; i++) interleaved.push(getByte(32 + i));\r\nlog('A = [0,1,2,...,15]');\r\nlog('B = [16,17,...,31]');\r\nlog('interleave(A, B) = [' + interleaved.join(', ') + ']');\r\n\r\nlog('');\r\nreverse(0, 48);\r\nconst reversed = [];\r\nfor (let i = 0; i < 16; i++) reversed.push(getByte(48 + i));\r\nlog('reverse(A) = [' + reversed.join(', ') + ']');\r\n\r\nlog('');\r\n// swizzle: use indices [3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12] to reverse each group of 4\r\nfor (let i = 0; i < 4; i++) {\r\n for (let j = 0; j < 4; j++) setByte(64 + i * 4 + j, i * 4 + (3 - j));\r\n}\r\nswizzle(0, 64, 80);\r\nconst swizzled = [];\r\nfor (let i = 0; i < 16; i++) swizzled.push(getByte(80 + i));\r\nlog('swizzle(A, reverse-within-groups) = [' + swizzled.join(', ') + ']');`,\r\n },\r\n\r\n 'simd-widen-narrow': {\r\n label: 'SIMD Widen & Narrow',\r\n group: 'SIMD',\r\n description: 'Convert between vector widths \u2014 narrow i16x8 to i8x16, extend i8x16 to i16x8.',\r\n target: '3.0',\r\n features: ['simd'],\r\n code: `// SIMD widening and narrowing: convert between lane sizes\r\nconst mod = new webasmjs.ModuleBuilder('simdWidenNarrow');\r\nmod.defineMemory(1);\r\n\r\n// Narrow two i16x8 vectors into one i8x16 (saturating, unsigned)\r\nmod.defineFunction('narrow_u', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(2));\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.narrow_i16x8_u_i8x16();\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\n// Extend low half of i8x16 to i16x8 (signed)\r\nmod.defineFunction('extend_low_s', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(1));\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.extend_low_i8x16_s_i16x8();\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('setByte', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store8_i32(0, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getByte', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load8_i32_u(0, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('setI16', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store16_i32(1, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getI16', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load16_i32_s(1, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { narrow_u, extend_low_s, setByte, getByte, setI16, getI16 } = instance.instance.exports;\r\n\r\n// Narrowing: two i16x8 \u2192 one i8x16 (values clamped to 0-255)\r\n// A = [10, 200, 300, 50, 0, 255, 1000, 128] at offset 0\r\nconst i16a = [10, 200, 300, 50, 0, 255, 1000, 128];\r\nfor (let i = 0; i < 8; i++) setI16(i * 2, i16a[i]);\r\n// B = [1, 2, 3, 4, 5, 6, 7, 8]\r\nfor (let i = 0; i < 8; i++) setI16(16 + i * 2, i + 1);\r\n\r\nnarrow_u(0, 16, 32);\r\nconst narrowed = [];\r\nfor (let i = 0; i < 16; i++) narrowed.push(getByte(32 + i));\r\nlog('=== Narrowing (i16x8 \u2192 i8x16, unsigned saturating) ===');\r\nlog('A (i16) = [' + i16a + ']');\r\nlog('B (i16) = [1,2,3,4,5,6,7,8]');\r\nlog('narrow_u = [' + narrowed.join(', ') + ']');\r\nlog('(300\u2192255, 1000\u2192255 clamped)');\r\n\r\n// Widening: i8x16 low half \u2192 i16x8 (signed extend)\r\nlog('');\r\nlog('=== Widening (i8x16 \u2192 i16x8, signed) ===');\r\nconst bytes = [5, 200, 127, 128, 0, 255, 1, 100]; // 200=0xC8\u2192-56 signed, 128\u2192-128, 255\u2192-1\r\nfor (let i = 0; i < 8; i++) setByte(48 + i, bytes[i]);\r\nextend_low_s(48, 64);\r\nconst widened = [];\r\nfor (let i = 0; i < 8; i++) widened.push(getI16(64 + i * 2));\r\nlog('input bytes = [' + bytes + ']');\r\nlog('extend_low_s = [' + widened.join(', ') + ']');\r\nlog('(200\u2192-56, 128\u2192-128, 255\u2192-1 sign-extended)');`,\r\n },\r\n\r\n 'simd-saturating': {\r\n label: 'SIMD Saturating Math',\r\n group: 'SIMD',\r\n description: 'Saturating add/sub that clamp instead of wrapping.',\r\n target: '3.0',\r\n features: ['simd'],\r\n code: `// SIMD saturating arithmetic: clamp on overflow instead of wrap\r\nconst mod = new webasmjs.ModuleBuilder('simdSat');\r\nmod.defineMemory(1);\r\n\r\n// Saturating unsigned add on i8x16\r\nmod.defineFunction('add_sat_u', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(2));\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.add_sat_u_i8x16();\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\n// Saturating unsigned sub on i8x16\r\nmod.defineFunction('sub_sat_u', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(2));\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.sub_sat_u_i8x16();\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\n// Regular (wrapping) add for comparison\r\nmod.defineFunction('add_wrap', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(2));\r\n a.get_local(f.getParameter(0));\r\n a.load_v128(2, 0);\r\n a.get_local(f.getParameter(1));\r\n a.load_v128(2, 0);\r\n a.add_i8x16();\r\n a.store_v128(2, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('setByte', null,\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.store8_i32(0, 0);\r\n}).withExport();\r\n\r\nmod.defineFunction('getByte', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.load8_i32_u(0, 0);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { add_sat_u, sub_sat_u, add_wrap, setByte, getByte } = instance.instance.exports;\r\n\r\n// A = [200, 100, 255, 0, 128, 50, 250, 10, ...]\r\nconst a = [200, 100, 255, 0, 128, 50, 250, 10];\r\n// B = [100, 200, 10, 5, 128, 250, 50, 0]\r\nconst b = [100, 200, 10, 5, 128, 250, 50, 0];\r\nfor (let i = 0; i < 8; i++) { setByte(i, a[i]); setByte(16 + i, b[i]); }\r\nfor (let i = 8; i < 16; i++) { setByte(i, 0); setByte(16 + i, 0); }\r\n\r\nadd_sat_u(0, 16, 32);\r\nadd_wrap(0, 16, 48);\r\n\r\nconst satResult = [], wrapResult = [];\r\nfor (let i = 0; i < 8; i++) { satResult.push(getByte(32 + i)); wrapResult.push(getByte(48 + i)); }\r\n\r\nlog('A = [' + a.join(', ') + ']');\r\nlog('B = [' + b.join(', ') + ']');\r\nlog('');\r\nlog('add_sat_u = [' + satResult.join(', ') + '] (clamped to 255)');\r\nlog('add_wrap = [' + wrapResult.join(', ') + '] (wraps around)');\r\n\r\nlog('');\r\nsub_sat_u(0, 16, 64);\r\nconst subResult = [];\r\nfor (let i = 0; i < 8; i++) subResult.push(getByte(64 + i));\r\nlog('sub_sat_u = [' + subResult.join(', ') + '] (clamped to 0)');`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Additional Bulk Memory \u2500\u2500\u2500\r\n 'passive-data': {\r\n label: 'Passive Data Segments',\r\n group: 'Bulk Memory',\r\n description: 'Lazy-init memory with passive segments and memory.init.',\r\n target: '2.0',\r\n features: ['bulk-memory'],\r\n code: `// Passive data segments: lazy initialization with memory.init\r\nconst mod = new webasmjs.ModuleBuilder('passiveData');\r\nconst mem = mod.defineMemory(1);\r\nmod.exportMemory(mem, 'memory');\r\n\r\n// Passive segment: not placed in memory until memory.init is called\r\nconst greeting = new TextEncoder().encode('Hello, WebAssembly!');\r\nconst dataSegment = mod.defineData(new Uint8Array([...greeting]));\r\n// dataSegment is passive because no offset was given\r\n\r\n// Copy passive data into memory: init(destOffset)\r\nmod.defineFunction('init', null, [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0)); // destination offset\r\n a.const_i32(0); // source offset in data segment\r\n a.const_i32(${greeting.length}); // length\r\n a.memory_init(dataSegment._index, 0);\r\n}).withExport();\r\n\r\n// Drop data segment (free it after init)\r\nmod.defineFunction('drop', null, [], (f, a) => {\r\n a.data_drop(dataSegment._index);\r\n}).withExport();\r\n\r\n// strlen\r\nmod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => {\r\n const ptr = f.getParameter(0);\r\n const len = a.declareLocal(webasmjs.ValueType.Int32, 'len');\r\n a.const_i32(0);\r\n a.set_local(len);\r\n a.loop(webasmjs.BlockType.Void, (cont) => {\r\n a.block(webasmjs.BlockType.Void, (brk) => {\r\n a.get_local(ptr);\r\n a.get_local(len);\r\n a.add_i32();\r\n a.load8_i32_u(0, 0);\r\n a.eqz_i32();\r\n a.br_if(brk);\r\n a.get_local(len);\r\n a.const_i32(1);\r\n a.add_i32();\r\n a.set_local(len);\r\n a.br(cont);\r\n });\r\n });\r\n a.get_local(len);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { init, drop: dataDrop, strlen, memory } = instance.instance.exports;\r\nconst view = new Uint8Array(memory.buffer);\r\n\r\n// Memory starts empty (passive segment not yet loaded)\r\nlog('Before init: byte[0] = ' + view[0] + ' (empty)');\r\n\r\n// Load passive data to offset 0\r\ninit(0);\r\nconst len = strlen(0);\r\nconst str = new TextDecoder().decode(view.slice(0, len));\r\nlog('After init(0): \"' + str + '\" (length=' + len + ')');\r\n\r\n// Load the same data at a different offset\r\ninit(100);\r\nconst str2 = new TextDecoder().decode(view.slice(100, 100 + len));\r\nlog('After init(100): \"' + str2 + '\"');\r\n\r\n// Drop the data segment (can no longer init)\r\ndataDrop();\r\nlog('');\r\nlog('Data segment dropped \u2014 passive data freed.');\r\ntry {\r\n init(200);\r\n log('Should not reach here');\r\n} catch (e) {\r\n log('init after drop: trapped as expected');\r\n}`,\r\n },\r\n\r\n 'bulk-table-ops': {\r\n label: 'Bulk Table Operations',\r\n group: 'Bulk Memory',\r\n description: 'table.copy and table.fill for bulk table manipulation.',\r\n target: '2.0',\r\n features: ['bulk-memory'],\r\n code: `// Bulk table operations: table.fill and table.copy\r\nconst mod = new webasmjs.ModuleBuilder('bulkTable');\r\n\r\nconst add = mod.defineFunction('add', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_i32();\r\n}).withExport();\r\n\r\nconst mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.mul_i32();\r\n}).withExport();\r\n\r\n// Table with space for 8 entries\r\nconst table = mod.defineTable(webasmjs.ElementType.AnyFunc, 8);\r\nmod.defineTableSegment(table, [add, mul], 0);\r\n\r\n// table.fill(start, ref, count) \u2014 fill slots 2-5 with the add function\r\nmod.defineFunction('fillWithAdd', null, [], (f, a) => {\r\n a.const_i32(2); // start index\r\n a.ref_func(add); // function ref\r\n a.const_i32(4); // count\r\n a.table_fill(0);\r\n}).withExport();\r\n\r\n// table.copy(dest, src, count) \u2014 copy slots 0-1 to slots 6-7\r\nmod.defineFunction('copySlots', null, [], (f, a) => {\r\n a.const_i32(6); // dest\r\n a.const_i32(0); // src\r\n a.const_i32(2); // count\r\n a.table_copy(0, 0);\r\n}).withExport();\r\n\r\n// table.size\r\nmod.defineFunction('tableSize', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.table_size(0);\r\n}).withExport();\r\n\r\n// Dispatch through table\r\nmod.defineFunction('dispatch', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(1));\r\n a.get_local(f.getParameter(2));\r\n a.get_local(f.getParameter(0));\r\n a.call_indirect(add.funcTypeBuilder);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { fillWithAdd, copySlots, tableSize, dispatch } = instance.instance.exports;\r\n\r\nlog('Table size: ' + tableSize());\r\nlog('');\r\n\r\n// Initial: [add, mul, ?, ?, ?, ?, ?, ?]\r\nlog('Initial: slot 0 (add): dispatch(0, 3, 4) = ' + dispatch(0, 3, 4));\r\nlog('Initial: slot 1 (mul): dispatch(1, 3, 4) = ' + dispatch(1, 3, 4));\r\n\r\n// Fill slots 2-5 with add\r\nfillWithAdd();\r\nlog('');\r\nlog('After table.fill(2, add, 4):');\r\nlog(' slot 2: dispatch(2, 10, 20) = ' + dispatch(2, 10, 20) + ' (add)');\r\nlog(' slot 3: dispatch(3, 10, 20) = ' + dispatch(3, 10, 20) + ' (add)');\r\n\r\n// Copy slots 0-1 to 6-7\r\ncopySlots();\r\nlog('');\r\nlog('After table.copy(6, 0, 2):');\r\nlog(' slot 6: dispatch(6, 5, 6) = ' + dispatch(6, 5, 6) + ' (add, copied from 0)');\r\nlog(' slot 7: dispatch(7, 5, 6) = ' + dispatch(7, 5, 6) + ' (mul, copied from 1)');`,\r\n },\r\n\r\n // \u2500\u2500\u2500 Additional Post-MVP \u2500\u2500\u2500\r\n 'table-ops': {\r\n label: 'Table Get/Set/Grow',\r\n group: 'Post-MVP',\r\n description: 'Dynamic table manipulation with table.get, table.set, table.grow.',\r\n target: '2.0',\r\n features: ['reference-types'],\r\n code: `// Dynamic table operations: get, set, grow\r\nconst mod = new webasmjs.ModuleBuilder('tableOps');\r\n\r\nconst double = mod.defineFunction('double', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(2);\r\n a.mul_i32();\r\n}).withExport();\r\n\r\nconst triple = mod.defineFunction('triple', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.const_i32(3);\r\n a.mul_i32();\r\n}).withExport();\r\n\r\nconst negate = mod.defineFunction('negate', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.const_i32(0);\r\n a.get_local(f.getParameter(0));\r\n a.sub_i32();\r\n}).withExport();\r\n\r\n// Start with table of size 2\r\nconst table = mod.defineTable(webasmjs.ElementType.AnyFunc, 2);\r\nmod.defineTableSegment(table, [double, triple], 0);\r\n\r\n// table.set: place a function ref at an index\r\nmod.defineFunction('setSlot', null, [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.ref_func(negate);\r\n a.table_set(0);\r\n}).withExport();\r\n\r\n// table.grow: add N slots (returns old size, or -1 on failure)\r\nmod.defineFunction('growTable', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.ref_null(0x70); // fill new slots with null\r\n a.get_local(f.getParameter(0));\r\n a.table_grow(0);\r\n}).withExport();\r\n\r\n// table.size\r\nmod.defineFunction('size', [webasmjs.ValueType.Int32], [], (f, a) => {\r\n a.table_size(0);\r\n}).withExport();\r\n\r\n// Check if a slot is null\r\nmod.defineFunction('isNull', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.table_get(0);\r\n a.ref_is_null();\r\n}).withExport();\r\n\r\n// Call through table\r\nmod.defineFunction('call', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n a.get_local(f.getParameter(1));\r\n a.get_local(f.getParameter(0));\r\n a.call_indirect(double.funcTypeBuilder);\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst fn = instance.instance.exports;\r\n\r\nlog('Initial size: ' + fn.size());\r\nlog('slot 0 (double): call(0, 5) = ' + fn.call(0, 5));\r\nlog('slot 1 (triple): call(1, 5) = ' + fn.call(1, 5));\r\n\r\n// Grow table by 3 slots\r\nconst oldSize = fn.growTable(3);\r\nlog('');\r\nlog('growTable(3) returned old size: ' + oldSize);\r\nlog('New size: ' + fn.size());\r\nlog('slot 2 is null: ' + (fn.isNull(2) === 1));\r\n\r\n// Set slot 2 to negate\r\nfn.setSlot(2);\r\nlog('');\r\nlog('After setSlot(2, negate):');\r\nlog('slot 2 is null: ' + (fn.isNull(2) === 1));\r\nlog('slot 2 (negate): call(2, 5) = ' + fn.call(2, 5));`,\r\n },\r\n\r\n 'try-catch': {\r\n label: 'Try/Catch',\r\n group: 'Post-MVP',\r\n description: 'Full try/catch exception handling with multiple tags.',\r\n target: '3.0',\r\n features: ['exception-handling'],\r\n code: `// Full try/catch exception handling\r\nconst mod = new webasmjs.ModuleBuilder('tryCatch', { disableVerification: true });\r\n\r\n// Define two exception tags with different payloads\r\nconst errorTag = mod.defineTag([webasmjs.ValueType.Int32]); // error code\r\nconst overflowTag = mod.defineTag([webasmjs.ValueType.Int32]); // overflow value\r\n\r\n// Function that may throw\r\nmod.defineFunction('checkedAdd', [webasmjs.ValueType.Int32],\r\n [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => {\r\n const x = f.getParameter(0);\r\n const y = f.getParameter(1);\r\n const result = a.declareLocal(webasmjs.ValueType.Int32, 'result');\r\n\r\n a.get_local(x);\r\n a.get_local(y);\r\n a.add_i32();\r\n a.set_local(result);\r\n\r\n // Check for \"overflow\" (result > 1000 for demo purposes)\r\n a.get_local(result);\r\n a.const_i32(1000);\r\n a.gt_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.get_local(result);\r\n a.throw(overflowTag._index);\r\n });\r\n\r\n // Check for negative input\r\n a.get_local(x);\r\n a.const_i32(0);\r\n a.lt_s_i32();\r\n a.if(webasmjs.BlockType.Void, () => {\r\n a.const_i32(-1);\r\n a.throw(errorTag._index);\r\n });\r\n\r\n a.get_local(result);\r\n}).withExport();\r\n\r\n// Show the WAT with tags, throw, try/catch\r\nconst wat = mod.toString();\r\nlog('=== WAT Output (try/catch) ===');\r\nlog(wat);\r\n\r\nconst bytes = mod.toBytes();\r\nlog('Module compiled: ' + bytes.length + ' bytes');\r\nlog('Valid WASM: ' + WebAssembly.validate(bytes.buffer));\r\nlog('');\r\nlog('This module defines:');\r\nlog(' - errorTag: thrown when input is negative');\r\nlog(' - overflowTag: thrown when result > 1000');\r\nlog(' - checkedAdd: adds two numbers with validation');`,\r\n },\r\n\r\n 'f32-math': {\r\n label: 'f32 Math',\r\n group: 'Numeric',\r\n description: 'Single-precision float ops \u2014 f32 min, max, abs, neg, sqrt.',\r\n target: 'mvp',\r\n features: [],\r\n code: `// f32 math \u2014 single-precision float operations\r\nconst mod = new webasmjs.ModuleBuilder('f32math');\r\n\r\nmod.defineFunction('min', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Float32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.min_f32();\r\n}).withExport();\r\n\r\nmod.defineFunction('max', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Float32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.max_f32();\r\n}).withExport();\r\n\r\nmod.defineFunction('abs', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.abs_f32();\r\n}).withExport();\r\n\r\nmod.defineFunction('neg', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.neg_f32();\r\n}).withExport();\r\n\r\nmod.defineFunction('sqrt', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.sqrt_f32();\r\n}).withExport();\r\n\r\n// Compare: f32 arithmetic vs f64 for precision\r\nmod.defineFunction('addF32', [webasmjs.ValueType.Float32],\r\n [webasmjs.ValueType.Float32, webasmjs.ValueType.Float32], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_f32();\r\n}).withExport();\r\n\r\nmod.defineFunction('addF64', [webasmjs.ValueType.Float64],\r\n [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => {\r\n a.get_local(f.getParameter(0));\r\n a.get_local(f.getParameter(1));\r\n a.add_f64();\r\n}).withExport();\r\n\r\nconst instance = await mod.instantiate();\r\nconst { min, max, abs, neg, sqrt, addF32, addF64 } = instance.instance.exports;\r\n\r\nlog('=== f32 Operations ===');\r\nlog('min(3.14, 2.71) = ' + min(3.14, 2.71));\r\nlog('max(3.14, 2.71) = ' + max(3.14, 2.71));\r\nlog('abs(-42.5) = ' + abs(-42.5));\r\nlog('neg(3.14) = ' + neg(3.14));\r\nlog('sqrt(2.0) = ' + sqrt(2.0));\r\nlog('sqrt(9.0) = ' + sqrt(9.0));\r\n\r\nlog('');\r\nlog('=== f32 vs f64 Precision ===');\r\nlog('f32: 0.1 + 0.2 = ' + addF32(0.1, 0.2));\r\nlog('f64: 0.1 + 0.2 = ' + addF64(0.1, 0.2));\r\nlog('f32 uses 4 bytes, f64 uses 8 bytes per value.');`,\r\n },\r\n};\r\n\r\n// \u2500\u2500\u2500 UI helpers \u2500\u2500\u2500\r\n\r\nconst GROUP_ICONS: Record = {\r\n Basics: '\\u{1F44B}',\r\n Memory: '\\u{1F4BE}',\r\n Globals: '\\u{1F30D}',\r\n Functions: '\\u{1F517}',\r\n 'Control Flow': '\\u{1F500}',\r\n Numeric: '\\u{1F522}',\r\n Algorithms: '\\u{2699}',\r\n SIMD: '\\u{26A1}',\r\n 'Bulk Memory': '\\u{1F4E6}',\r\n 'Post-MVP': '\\u{1F680}',\r\n WAT: '\\u{1F4DD}',\r\n Debug: '\\u{1F50D}',\r\n};\r\n\r\n// \u2500\u2500\u2500 Target ordering for filter comparison \u2500\u2500\u2500\r\nconst TARGET_ORDER: Record = {\r\n mvp: 0,\r\n '2.0': 1,\r\n '3.0': 2,\r\n latest: 3,\r\n};\r\n\r\nfunction getEditor(): HTMLTextAreaElement {\r\n return document.getElementById('editor') as HTMLTextAreaElement;\r\n}\r\n\r\nfunction getWatOutput(): HTMLElement {\r\n return document.getElementById('watOutput') as HTMLElement;\r\n}\r\n\r\nfunction getRunOutput(): HTMLElement {\r\n return document.getElementById('runOutput') as HTMLElement;\r\n}\r\n\r\nfunction getConsoleOutput(): HTMLElement {\r\n return document.getElementById('consoleOutput') as HTMLElement;\r\n}\r\n\r\nfunction clearOutput(el: HTMLElement): void {\r\n el.textContent = '';\r\n}\r\n\r\nfunction appendOutput(el: HTMLElement, text: string, className?: string): void {\r\n const line = document.createElement('div');\r\n line.textContent = text;\r\n if (className) line.className = className;\r\n el.appendChild(line);\r\n}\r\n\r\nlet currentExampleKey = 'hello-wasm';\r\n\r\nfunction loadExample(name: string): void {\r\n const example = EXAMPLES[name];\r\n if (example) {\r\n currentExampleKey = name;\r\n getEditor().value = example.code;\r\n clearOutput(getWatOutput());\r\n clearOutput(getRunOutput());\r\n clearOutput(getConsoleOutput());\r\n const label = document.getElementById('currentExample');\r\n if (label) label.textContent = example.label;\r\n }\r\n}\r\n\r\n// \u2500\u2500\u2500 Tab switching \u2500\u2500\u2500\r\n\r\nfunction switchTab(tabName: 'wat' | 'output'): void {\r\n const tabs = document.querySelectorAll('.tab-bar .tab');\r\n const panels = document.querySelectorAll('.tab-panel');\r\n tabs.forEach((tab) => {\r\n tab.classList.toggle('active', (tab as HTMLElement).dataset.tab === tabName);\r\n });\r\n panels.forEach((panel) => {\r\n const isTarget = panel.id === (tabName === 'wat' ? 'watOutput' : 'runOutput');\r\n panel.classList.toggle('active', isTarget);\r\n });\r\n}\r\n\r\n// \u2500\u2500\u2500 Console drawer \u2500\u2500\u2500\r\n\r\nfunction toggleConsole(): void {\r\n const drawer = document.getElementById('consoleDrawer')!;\r\n drawer.classList.toggle('open');\r\n}\r\n\r\nfunction clearConsole(): void {\r\n getConsoleOutput().textContent = '';\r\n updateConsoleBadge();\r\n}\r\n\r\nlet consoleMessageCount = 0;\r\n\r\nfunction updateConsoleBadge(): void {\r\n const badge = document.getElementById('consoleBadge')!;\r\n consoleMessageCount = getConsoleOutput().childElementCount;\r\n badge.textContent = String(consoleMessageCount);\r\n badge.classList.toggle('has-messages', consoleMessageCount > 0);\r\n}\r\n\r\n// \u2500\u2500\u2500 Resize handler \u2500\u2500\u2500\r\n\r\nfunction initResizeHandler(): void {\r\n const handle = document.getElementById('resizeHandle')!;\r\n const main = document.querySelector('.main') as HTMLElement;\r\n const editorPane = document.querySelector('.editor-pane') as HTMLElement;\r\n const outputPane = document.querySelector('.output-pane') as HTMLElement;\r\n let isResizing = false;\r\n\r\n handle.addEventListener('mousedown', (e: MouseEvent) => {\r\n isResizing = true;\r\n handle.classList.add('active');\r\n document.body.style.cursor = 'col-resize';\r\n document.body.style.userSelect = 'none';\r\n e.preventDefault();\r\n });\r\n\r\n document.addEventListener('mousemove', (e: MouseEvent) => {\r\n if (!isResizing) return;\r\n const rect = main.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const totalWidth = rect.width - 4; // handle width\r\n const leftPct = Math.max(20, Math.min(80, (x / rect.width) * 100));\r\n editorPane.style.flex = 'none';\r\n outputPane.style.flex = 'none';\r\n editorPane.style.width = leftPct + '%';\r\n outputPane.style.width = (100 - leftPct) + '%';\r\n });\r\n\r\n document.addEventListener('mouseup', () => {\r\n if (isResizing) {\r\n isResizing = false;\r\n handle.classList.remove('active');\r\n document.body.style.cursor = '';\r\n document.body.style.userSelect = '';\r\n }\r\n });\r\n}\r\n\r\n// \u2500\u2500\u2500 Example picker dialog \u2500\u2500\u2500\r\n\r\nfunction openExamplePicker(): void {\r\n const existing = document.getElementById('exampleDialog');\r\n if (existing) existing.remove();\r\n\r\n const overlay = document.createElement('div');\r\n overlay.id = 'exampleDialog';\r\n overlay.className = 'dialog-overlay';\r\n\r\n const dialog = document.createElement('div');\r\n dialog.className = 'dialog';\r\n\r\n // Header with search + filter dropdown\r\n const header = document.createElement('div');\r\n header.className = 'dialog-header';\r\n header.innerHTML = '

Examples

';\r\n\r\n const searchRow = document.createElement('div');\r\n searchRow.className = 'dialog-search-row';\r\n\r\n const searchInput = document.createElement('input');\r\n searchInput.type = 'text';\r\n searchInput.placeholder = 'Search examples...';\r\n searchInput.className = 'dialog-search';\r\n searchRow.appendChild(searchInput);\r\n\r\n // Compact filter dropdown\r\n const filterSelect = document.createElement('select');\r\n filterSelect.className = 'filter-select';\r\n\r\n // \"All\" option\r\n const allOpt = document.createElement('option');\r\n allOpt.value = '';\r\n allOpt.textContent = 'All';\r\n filterSelect.appendChild(allOpt);\r\n\r\n // Target group\r\n const targetGroup = document.createElement('optgroup');\r\n targetGroup.label = 'Target';\r\n for (const t of ['mvp', '2.0', '3.0', 'latest'] as WasmTarget[]) {\r\n const opt = document.createElement('option');\r\n opt.value = 'target:' + t;\r\n opt.textContent = t === 'mvp' ? 'MVP' : t === 'latest' ? 'Latest' : 'Wasm ' + t;\r\n targetGroup.appendChild(opt);\r\n }\r\n filterSelect.appendChild(targetGroup);\r\n\r\n // Feature group \u2014 only features actually used by examples\r\n const usedFeatures = new Set();\r\n for (const example of Object.values(EXAMPLES)) {\r\n for (const f of example.features) usedFeatures.add(f);\r\n }\r\n const featureGroup = document.createElement('optgroup');\r\n featureGroup.label = 'Feature';\r\n for (const f of Array.from(usedFeatures).sort()) {\r\n const opt = document.createElement('option');\r\n opt.value = 'feature:' + f;\r\n opt.textContent = f;\r\n featureGroup.appendChild(opt);\r\n }\r\n filterSelect.appendChild(featureGroup);\r\n\r\n searchRow.appendChild(filterSelect);\r\n header.appendChild(searchRow);\r\n dialog.appendChild(header);\r\n\r\n // Build grouped grid\r\n const body = document.createElement('div');\r\n body.className = 'dialog-body';\r\n\r\n const groups = new Map();\r\n for (const [key, example] of Object.entries(EXAMPLES)) {\r\n const group = example.group;\r\n if (!groups.has(group)) groups.set(group, []);\r\n groups.get(group)!.push({ key, example });\r\n }\r\n\r\n const allCards: HTMLElement[] = [];\r\n const allSections: HTMLElement[] = [];\r\n\r\n for (const [groupName, items] of groups) {\r\n const section = document.createElement('div');\r\n section.className = 'dialog-group';\r\n section.dataset.group = groupName;\r\n\r\n const groupHeader = document.createElement('div');\r\n groupHeader.className = 'dialog-group-header';\r\n const icon = GROUP_ICONS[groupName] || '';\r\n groupHeader.textContent = `${icon} ${groupName}`;\r\n section.appendChild(groupHeader);\r\n\r\n const grid = document.createElement('div');\r\n grid.className = 'dialog-grid';\r\n\r\n for (const item of items) {\r\n const card = document.createElement('button');\r\n card.className = 'dialog-card';\r\n if (item.key === currentExampleKey) card.classList.add('active');\r\n card.dataset.key = item.key;\r\n card.dataset.search = `${item.example.label} ${item.example.description} ${groupName}`.toLowerCase();\r\n card.dataset.target = item.example.target;\r\n card.dataset.features = item.example.features.join(',');\r\n\r\n const title = document.createElement('div');\r\n title.className = 'dialog-card-title';\r\n title.textContent = item.example.label;\r\n card.appendChild(title);\r\n\r\n const desc = document.createElement('div');\r\n desc.className = 'dialog-card-desc';\r\n desc.textContent = item.example.description;\r\n card.appendChild(desc);\r\n\r\n // Metadata badges\r\n if (item.example.target !== 'mvp' || item.example.features.length > 0) {\r\n const meta = document.createElement('div');\r\n meta.className = 'dialog-card-meta';\r\n\r\n if (item.example.target !== 'mvp') {\r\n const targetBadge = document.createElement('span');\r\n targetBadge.className = 'card-target';\r\n targetBadge.textContent = item.example.target;\r\n meta.appendChild(targetBadge);\r\n }\r\n\r\n for (const feat of item.example.features) {\r\n const featBadge = document.createElement('span');\r\n featBadge.className = 'card-feature';\r\n featBadge.textContent = feat;\r\n meta.appendChild(featBadge);\r\n }\r\n\r\n card.appendChild(meta);\r\n }\r\n\r\n card.addEventListener('click', () => {\r\n loadExample(item.key);\r\n overlay.remove();\r\n });\r\n\r\n grid.appendChild(card);\r\n allCards.push(card);\r\n }\r\n\r\n section.appendChild(grid);\r\n body.appendChild(section);\r\n allSections.push(section);\r\n }\r\n\r\n dialog.appendChild(body);\r\n overlay.appendChild(dialog);\r\n document.body.appendChild(overlay);\r\n\r\n // Filter logic\r\n function applyFilters(): void {\r\n const q = searchInput.value.toLowerCase().trim();\r\n const filterVal = filterSelect.value;\r\n\r\n for (const card of allCards) {\r\n const searchMatch = !q || card.dataset.search!.includes(q);\r\n\r\n let filterMatch = true;\r\n if (filterVal.startsWith('target:')) {\r\n const selectedTarget = filterVal.slice(7) as WasmTarget;\r\n const cardTarget = card.dataset.target as WasmTarget;\r\n filterMatch = TARGET_ORDER[cardTarget] <= TARGET_ORDER[selectedTarget];\r\n } else if (filterVal.startsWith('feature:')) {\r\n const selectedFeature = filterVal.slice(8);\r\n const cardFeatures = card.dataset.features ? card.dataset.features.split(',') : [];\r\n filterMatch = cardFeatures.includes(selectedFeature);\r\n }\r\n\r\n (card as HTMLElement).style.display = searchMatch && filterMatch ? '' : 'none';\r\n }\r\n for (const section of allSections) {\r\n const visibleCards = section.querySelectorAll('.dialog-card:not([style*=\"display: none\"])');\r\n (section as HTMLElement).style.display = visibleCards.length > 0 ? '' : 'none';\r\n }\r\n }\r\n\r\n searchInput.addEventListener('input', applyFilters);\r\n filterSelect.addEventListener('change', applyFilters);\r\n\r\n // Close on overlay click\r\n overlay.addEventListener('click', (e) => {\r\n if (e.target === overlay) overlay.remove();\r\n });\r\n\r\n // Close on Escape\r\n const onKey = (e: KeyboardEvent) => {\r\n if (e.key === 'Escape') {\r\n overlay.remove();\r\n document.removeEventListener('keydown', onKey);\r\n }\r\n };\r\n document.addEventListener('keydown', onKey);\r\n\r\n // Focus search\r\n setTimeout(() => searchInput.focus(), 50);\r\n}\r\n\r\n// Expose library globally for eval'd code\r\n(window as any).webasmjs = {\r\n ModuleBuilder,\r\n PackageBuilder,\r\n ValueType,\r\n BlockType,\r\n ElementType,\r\n TextModuleWriter,\r\n BinaryReader,\r\n parseWat,\r\n};\r\n\r\nasync function run(): Promise {\r\n const watEl = getWatOutput();\r\n const runEl = getRunOutput();\r\n const consoleEl = getConsoleOutput();\r\n clearOutput(watEl);\r\n clearOutput(runEl);\r\n clearOutput(consoleEl);\r\n\r\n const code = getEditor().value;\r\n\r\n // Open console drawer and switch to WAT tab\r\n const drawer = document.getElementById('consoleDrawer')!;\r\n drawer.classList.add('open');\r\n\r\n // Capture log calls -> console drawer\r\n const log = (msg: any) => {\r\n appendOutput(consoleEl, String(msg));\r\n updateConsoleBadge();\r\n };\r\n\r\n // Intercept ModuleBuilder to capture WAT before instantiate\r\n const OrigModuleBuilder = ModuleBuilder;\r\n const patchedClass = class extends OrigModuleBuilder {\r\n async instantiate(imports?: WebAssembly.Imports) {\r\n try {\r\n const wat = this.toString();\r\n appendOutput(watEl, wat);\r\n } catch (e: any) {\r\n appendOutput(watEl, 'Error generating WAT: ' + e.message, 'error');\r\n }\r\n return super.instantiate(imports);\r\n }\r\n };\r\n (window as any).webasmjs.ModuleBuilder = patchedClass;\r\n\r\n try {\r\n const asyncFn = new Function('log', 'webasmjs', `return (async () => {\\n${code}\\n})();`);\r\n await asyncFn(log, (window as any).webasmjs);\r\n appendOutput(runEl, '\\n--- Done ---');\r\n } catch (e: any) {\r\n appendOutput(runEl, 'Error: ' + e.message, 'error');\r\n if (e.stack) {\r\n appendOutput(runEl, e.stack, 'error');\r\n }\r\n } finally {\r\n (window as any).webasmjs.ModuleBuilder = OrigModuleBuilder;\r\n updateConsoleBadge();\r\n }\r\n}\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n document.getElementById('examplesBtn')!.addEventListener('click', openExamplePicker);\r\n document.getElementById('runBtn')!.addEventListener('click', run);\r\n\r\n // Tab switching\r\n document.querySelectorAll('.tab-bar .tab').forEach((tab) => {\r\n tab.addEventListener('click', () => {\r\n switchTab((tab as HTMLElement).dataset.tab as 'wat' | 'output');\r\n });\r\n });\r\n\r\n // Console drawer toggle and clear\r\n document.getElementById('consoleToggle')!.addEventListener('click', toggleConsole);\r\n document.getElementById('consoleClear')!.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n clearConsole();\r\n });\r\n\r\n // Resize handler\r\n initResizeHandler();\r\n\r\n // Ctrl/Cmd+Enter to run\r\n getEditor().addEventListener('keydown', (e: KeyboardEvent) => {\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {\r\n e.preventDefault();\r\n run();\r\n }\r\n });\r\n\r\n // Load default example\r\n loadExample('hello-wasm');\r\n});\r\n"], + "mappings": "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", "names": ["MagicHeader", "index"] } diff --git a/playground/playground.ts b/playground/playground.ts index 4054bf4..df654e8 100644 --- a/playground/playground.ts +++ b/playground/playground.ts @@ -1,5 +1,6 @@ import { ModuleBuilder, + PackageBuilder, ValueType, BlockType, ElementType, @@ -8,11 +9,25 @@ import { parseWat, } from '../src/index'; -const EXAMPLES: Record = { +import type { WasmTarget, WasmFeature } from '../src/types'; + +interface ExampleDef { + label: string; + group: string; + description: string; + target: WasmTarget; + features: WasmFeature[]; + code: string; +} + +const EXAMPLES: Record = { // ─── Basics ─── 'hello-wasm': { label: 'Hello WASM', group: 'Basics', + description: 'The simplest possible module — export a function that returns 42.', + target: 'mvp', + features: [], code: `// Hello WASM — the simplest possible module const mod = new webasmjs.ModuleBuilder('hello'); @@ -28,6 +43,9 @@ log('The answer to everything: ' + answer());`, factorial: { label: 'Factorial', group: 'Basics', + description: 'Iterative factorial using loop and block for control flow.', + target: 'mvp', + features: [], code: `// Factorial — iterative with loop and block const mod = new webasmjs.ModuleBuilder('factorial'); @@ -74,6 +92,9 @@ for (let n = 0; n <= 10; n++) { fibonacci: { label: 'Fibonacci', group: 'Basics', + description: 'Iterative Fibonacci with local variables and branching.', + target: 'mvp', + features: [], code: `// Fibonacci sequence — iterative const mod = new webasmjs.ModuleBuilder('fibonacci'); @@ -136,6 +157,9 @@ for (let n = 0; n <= 15; n++) { 'if-else': { label: 'If/Else', group: 'Basics', + description: 'Absolute value and sign function using typed if/else blocks.', + target: 'mvp', + features: [], code: `// If/Else — absolute value and sign function const mod = new webasmjs.ModuleBuilder('ifElse'); @@ -188,6 +212,9 @@ log('sign(0) = ' + sign(0));`, memory: { label: 'Memory Basics', group: 'Memory', + description: 'Store and load i32 values in linear memory.', + target: 'mvp', + features: [], code: `// Memory: store and load values const mod = new webasmjs.ModuleBuilder('memoryExample'); const mem = mod.defineMemory(1); @@ -218,6 +245,9 @@ log('Sum stored at 0: ' + load(0));`, 'byte-array': { label: 'Byte Array', group: 'Memory', + description: 'Store and sum individual bytes with load8/store8 instructions.', + target: 'mvp', + features: [], code: `// Byte array — store and sum individual bytes const mod = new webasmjs.ModuleBuilder('byteArray'); mod.defineMemory(1); @@ -288,6 +318,9 @@ log('Sum of 10 bytes: ' + sumBytes(10));`, 'string-memory': { label: 'Strings in Memory', group: 'Memory', + description: 'Store a string via data segment and compute its length.', + target: 'mvp', + features: [], code: `// Strings in memory — store a string, compute its length const mod = new webasmjs.ModuleBuilder('stringMem'); const mem = mod.defineMemory(1); @@ -338,10 +371,136 @@ log('String in memory: "' + str + '"'); log('Length: ' + strLen);`, }, + 'data-segments': { + label: 'Data Segments', + group: 'Memory', + description: 'Pre-initialize memory with defineData and read values at runtime.', + target: 'mvp', + features: [], + code: `// Data segments — pre-initialize memory with static data +const mod = new webasmjs.ModuleBuilder('dataSegments'); +const mem = mod.defineMemory(1); +mod.exportMemory(mem, 'memory'); + +// Pre-fill memory with a lookup table at offset 0 +// Powers of 2: [1, 2, 4, 8, 16, 32, 64, 128] +const powers = new Uint8Array(new Int32Array([1, 2, 4, 8, 16, 32, 64, 128]).buffer); +mod.defineData(powers, 0); + +// Pre-fill memory with a message at offset 64 +const msg = new TextEncoder().encode('Hello from data segment!'); +mod.defineData(new Uint8Array([...msg, 0]), 64); + +// Read an i32 from the powers table: getPower(index) +mod.defineFunction('getPower', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(4); + a.mul_i32(); + a.load_i32(2, 0); +}).withExport(); + +// strlen starting at offset +mod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const ptr = f.getParameter(0); + const len = a.declareLocal(webasmjs.ValueType.Int32, 'len'); + a.const_i32(0); + a.set_local(len); + a.loop(webasmjs.BlockType.Void, (loopLabel) => { + a.block(webasmjs.BlockType.Void, (breakLabel) => { + a.get_local(ptr); + a.get_local(len); + a.add_i32(); + a.load8_i32_u(0, 0); + a.eqz_i32(); + a.br_if(breakLabel); + a.get_local(len); + a.const_i32(1); + a.add_i32(); + a.set_local(len); + a.br(loopLabel); + }); + }); + a.get_local(len); +}).withExport(); + +const instance = await mod.instantiate(); +const { getPower, strlen, memory } = instance.instance.exports; + +log('Powers of 2 from data segment:'); +for (let i = 0; i < 8; i++) { + log(' 2^' + i + ' = ' + getPower(i)); +} + +const view = new Uint8Array(memory.buffer); +const len = strlen(64); +const str = new TextDecoder().decode(view.slice(64, 64 + len)); +log(''); +log('Message from data segment: "' + str + '"');`, + }, + + 'memory-growth': { + label: 'Memory Growth', + group: 'Memory', + description: 'Grow memory at runtime with mem_grow and query size with mem_size.', + target: 'mvp', + features: [], + code: `// Memory growth — dynamically add pages at runtime +const mod = new webasmjs.ModuleBuilder('memGrowth'); +const mem = mod.defineMemory(1); // start with 1 page (64KB) +mod.exportMemory(mem, 'memory'); + +// Return current memory size in pages +mod.defineFunction('pages', [webasmjs.ValueType.Int32], [], (f, a) => { + a.mem_size(0); +}).withExport(); + +// Grow memory by N pages, return previous size (or -1 on failure) +mod.defineFunction('grow', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.mem_grow(0); +}).withExport(); + +// Store an i32 at a byte offset +mod.defineFunction('store', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0); +}).withExport(); + +// Load an i32 from a byte offset +mod.defineFunction('load', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { pages, grow, store, load } = instance.instance.exports; + +log('Initial size: ' + pages() + ' page(s) = ' + (pages() * 64) + ' KB'); + +// Grow by 2 pages +const prev = grow(2); +log('grow(2) returned previous size: ' + prev); +log('New size: ' + pages() + ' page(s) = ' + (pages() * 64) + ' KB'); + +// Write to the new pages (offset > 64KB = beyond original page) +const offset = 65536 + 100; // byte 100 in second page +store(offset, 12345); +log('Stored 12345 at offset ' + offset + ' (in grown memory)'); +log('Loaded: ' + load(offset)); + +// Grow again +grow(1); +log('After another grow(1): ' + pages() + ' pages');`, + }, + // ─── Globals & State ─── globals: { label: 'Global Counter', group: 'Globals', + description: 'Mutable global variable used as a persistent counter.', + target: 'mvp', + features: [], code: `// Globals: mutable counter const mod = new webasmjs.ModuleBuilder('globals'); @@ -374,6 +533,9 @@ log('After 7 more: ' + getCount());`, 'start-function': { label: 'Start Function', group: 'Globals', + description: 'A function that runs automatically on module instantiation.', + target: 'mvp', + features: [], code: `// Start function — runs automatically on instantiation const mod = new webasmjs.ModuleBuilder('startExample'); @@ -401,6 +563,9 @@ log('The start function ran automatically!');`, 'multi-func': { label: 'Function Calls', group: 'Functions', + description: 'Multiple functions calling each other — square, double, compose.', + target: 'mvp', + features: [], code: `// Multiple functions calling each other const mod = new webasmjs.ModuleBuilder('multiFn'); @@ -439,6 +604,9 @@ for (let x = 1; x <= 5; x++) { 'imports': { label: 'Import Functions', group: 'Functions', + description: 'Import host functions so WASM can call JavaScript.', + target: 'mvp', + features: [], code: `// Importing host functions — WASM calling JavaScript const mod = new webasmjs.ModuleBuilder('imports'); @@ -479,6 +647,9 @@ logged.forEach((v, i) => log(' [' + i + '] ' + v));`, 'indirect-call': { label: 'Indirect Calls (Table)', group: 'Functions', + description: 'Dispatch function calls through a table using call_indirect.', + target: 'mvp', + features: [], code: `// Indirect calls via function table const mod = new webasmjs.ModuleBuilder('indirectCall'); @@ -522,10 +693,435 @@ for (let op = 0; op < 3; op++) { }`, }, + 'multi-module': { + label: 'Multi-Module', + group: 'Functions', + description: 'Use PackageBuilder to link two modules with imports.', + target: 'mvp', + features: [], + code: `// Multi-module — PackageBuilder links modules with dependencies +const pkg = new webasmjs.PackageBuilder(); + +// Module "math": provides a double function +const mathMod = pkg.defineModule('math'); +mathMod.defineFunction('double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(2); + a.mul_i32(); +}).withExport(); + +mathMod.defineFunction('square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(0)); + a.mul_i32(); +}).withExport(); + +// Module "main": imports from "math" and composes +const mainMod = pkg.defineModule('main'); +const doubleFn = mainMod.importFunction('math', 'double', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32]); +const squareFn = mainMod.importFunction('math', 'square', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32]); + +// quadruple(x) = double(double(x)) +mainMod.defineFunction('quadruple', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.call(doubleFn); + a.call(doubleFn); +}).withExport(); + +// doubleSquare(x) = double(square(x)) = 2 * x^2 +mainMod.defineFunction('doubleSquare', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.call(squareFn); + a.call(doubleFn); +}).withExport(); + +pkg.addDependency('main', 'math'); +const result = await pkg.instantiate(); +const { quadruple, doubleSquare } = result.main.exports; + +log('PackageBuilder — two linked modules:'); +for (let x = 1; x <= 6; x++) { + log(' x=' + x + ': quadruple=' + quadruple(x) + ', 2x\\u00B2=' + doubleSquare(x)); +}`, + }, + + 'recursive': { + label: 'Recursive Function', + group: 'Functions', + description: 'Self-recursive power function using a.call(f).', + target: 'mvp', + features: [], + code: `// Recursive function — power(base, exp) calls itself +const mod = new webasmjs.ModuleBuilder('recursion'); + +mod.defineFunction('power', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const base = f.getParameter(0); + const exp = f.getParameter(1); + + // if exp == 0 return 1 + a.get_local(exp); + a.eqz_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.const_i32(1); + a.return(); + }); + + // return base * power(base, exp - 1) + a.get_local(base); + a.get_local(base); + a.get_local(exp); + a.const_i32(1); + a.sub_i32(); + a.call(f); // recursive call to self! + a.mul_i32(); +}).withExport(); + +const instance = await mod.instantiate(); +const { power } = instance.instance.exports; + +log('Recursive power(base, exp):'); +for (let b = 2; b <= 5; b++) { + const results = []; + for (let e = 0; e <= 5; e++) results.push(b + '^' + e + '=' + power(b, e)); + log(' ' + results.join(', ')); +}`, + }, + + // ─── Control Flow ─── + 'br-table': { + label: 'Branch Table', + group: 'Control Flow', + description: 'Switch/case dispatch using the br_table instruction.', + target: 'mvp', + features: [], + code: `// br_table — switch/case dispatch to different blocks +const mod = new webasmjs.ModuleBuilder('brTable'); + +// dayType(day): 0-4 => "weekday" (return 1), 5-6 => "weekend" (return 2), else => "invalid" (return 0) +mod.defineFunction('dayType', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const day = f.getParameter(0); + const result = a.declareLocal(webasmjs.ValueType.Int32, 'result'); + + a.block(webasmjs.BlockType.Void, (invalidBlock) => { + a.block(webasmjs.BlockType.Void, (weekendBlock) => { + a.block(webasmjs.BlockType.Void, (weekdayBlock) => { + // br_table: value 0-4 => weekdayBlock, 5-6 => weekendBlock, default => invalidBlock + a.get_local(day); + a.br_table(invalidBlock, + weekdayBlock, weekdayBlock, weekdayBlock, weekdayBlock, weekdayBlock, + weekendBlock, weekendBlock + ); + }); + // weekday path + a.const_i32(1); + a.set_local(result); + a.br(invalidBlock); // jump to end + }); + // weekend path + a.const_i32(2); + a.set_local(result); + a.br(invalidBlock); // jump to end + }); + // if we fell through to here via default, result is still 0 + + a.get_local(result); +}).withExport(); + +const instance = await mod.instantiate(); +const { dayType } = instance.instance.exports; + +const names = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; +const types = ['invalid', 'weekday', 'weekend']; +for (let d = 0; d < 7; d++) { + log(names[d] + ' (day ' + d + '): ' + types[dayType(d)]); +} +log('day 7: ' + types[dayType(7)]); +log('day 99: ' + types[dayType(99)]);`, + }, + + 'select': { + label: 'Select (Ternary)', + group: 'Control Flow', + description: 'Branchless conditional with select — like a ternary operator.', + target: 'mvp', + features: [], + code: `// select — branchless conditional (ternary operator) +const mod = new webasmjs.ModuleBuilder('selectOp'); + +// max(a, b) = a > b ? a : b (using select) +mod.defineFunction('max', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const x = f.getParameter(0); + const y = f.getParameter(1); + + a.get_local(x); // value if true + a.get_local(y); // value if false + a.get_local(x); + a.get_local(y); + a.gt_i32(); // condition: x > y + a.select(); +}).withExport(); + +// min(a, b) = a < b ? a : b +mod.defineFunction('min', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const x = f.getParameter(0); + const y = f.getParameter(1); + + a.get_local(x); + a.get_local(y); + a.get_local(x); + a.get_local(y); + a.lt_i32(); + a.select(); +}).withExport(); + +// clamp(val, lo, hi) +mod.defineFunction('clamp', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const val = f.getParameter(0); + const lo = f.getParameter(1); + const hi = f.getParameter(2); + const tmp = a.declareLocal(webasmjs.ValueType.Int32, 'tmp'); + + // tmp = val > hi ? hi : val + a.get_local(hi); + a.get_local(val); + a.get_local(val); + a.get_local(hi); + a.gt_i32(); + a.select(); + a.set_local(tmp); + + // result = tmp < lo ? lo : tmp + a.get_local(lo); + a.get_local(tmp); + a.get_local(tmp); + a.get_local(lo); + a.lt_i32(); + a.select(); +}).withExport(); + +const instance = await mod.instantiate(); +const { max, min, clamp } = instance.instance.exports; + +log('max(3, 7) = ' + max(3, 7)); +log('max(10, 2) = ' + max(10, 2)); +log('min(3, 7) = ' + min(3, 7)); +log('min(10, 2) = ' + min(10, 2)); +log(''); +log('clamp(5, 0, 10) = ' + clamp(5, 0, 10)); +log('clamp(-3, 0, 10) = ' + clamp(-3, 0, 10)); +log('clamp(15, 0, 10) = ' + clamp(15, 0, 10)); +log('clamp(0, 0, 10) = ' + clamp(0, 0, 10)); +log('clamp(10, 0, 10) = ' + clamp(10, 0, 10));`, + }, + + 'nested-blocks': { + label: 'Nested Blocks', + group: 'Control Flow', + description: 'Multi-level block nesting with early break and continue.', + target: 'mvp', + features: [], + code: `// Nested blocks — multi-level break and continue patterns +const mod = new webasmjs.ModuleBuilder('nestedBlocks'); + +// Find the first number in [start, start+limit) divisible by both 3 and 5 +// Returns -1 if not found +mod.defineFunction('findFizzBuzz', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const start = f.getParameter(0); + const limit = f.getParameter(1); + const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); + const end = a.declareLocal(webasmjs.ValueType.Int32, 'end'); + const result = a.declareLocal(webasmjs.ValueType.Int32, 'result'); + + a.const_i32(-1); + a.set_local(result); + + // end = start + limit + a.get_local(start); + a.get_local(limit); + a.add_i32(); + a.set_local(end); + + a.get_local(start); + a.set_local(i); + + // outer block — break here when found + a.block(webasmjs.BlockType.Void, (found) => { + a.loop(webasmjs.BlockType.Void, (cont) => { + // if i >= end, exit loop + a.block(webasmjs.BlockType.Void, (skip) => { + a.get_local(i); + a.get_local(end); + a.ge_i32(); + a.br_if(found); + + // Check divisible by 3 + a.get_local(i); + a.const_i32(3); + a.rem_i32_u(); + a.br_if(skip); // not divisible by 3, skip + + // Check divisible by 5 + a.get_local(i); + a.const_i32(5); + a.rem_i32_u(); + a.br_if(skip); // not divisible by 5, skip + + // Found! Save and break to outer + a.get_local(i); + a.set_local(result); + a.br(found); + }); + + // i++ + a.get_local(i); + a.const_i32(1); + a.add_i32(); + a.set_local(i); + a.br(cont); + }); + }); + + a.get_local(result); +}).withExport(); + +const instance = await mod.instantiate(); +const { findFizzBuzz } = instance.instance.exports; + +log('Find first FizzBuzz (divisible by 3 and 5):'); +log(' findFizzBuzz(1, 100) = ' + findFizzBuzz(1, 100)); +log(' findFizzBuzz(16, 10) = ' + findFizzBuzz(16, 10)); +log(' findFizzBuzz(31, 50) = ' + findFizzBuzz(31, 50)); +log(' findFizzBuzz(1, 5) = ' + findFizzBuzz(1, 5) + ' (not found)'); +log(' findFizzBuzz(46, 10) = ' + findFizzBuzz(46, 10));`, + }, + + 'drop-and-tee': { + label: 'Drop & Tee Local', + group: 'Control Flow', + description: 'Stack manipulation with drop() and tee_local().', + target: 'mvp', + features: [], + code: `// drop and tee_local — stack manipulation +const mod = new webasmjs.ModuleBuilder('stackOps'); + +// tee_local: stores to local AND keeps value on stack +// Equivalent to: set_local + get_local, but in one instruction +mod.defineFunction('sumAndCount', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + const n = f.getParameter(0); + const sum = a.declareLocal(webasmjs.ValueType.Int32, 'sum'); + const i = a.declareLocal(webasmjs.ValueType.Int32, 'i'); + + a.const_i32(0); + a.set_local(sum); + a.const_i32(1); + a.set_local(i); + + a.loop(webasmjs.BlockType.Void, (cont) => { + a.block(webasmjs.BlockType.Void, (brk) => { + a.get_local(i); + a.get_local(n); + a.gt_i32(); + a.br_if(brk); + + // tee_local: store i to sum while keeping it on stack + a.get_local(sum); + a.get_local(i); + a.tee_local(i); // stores i, but also leaves value on stack + a.add_i32(); + a.set_local(sum); + + // increment i (which was already tee'd) + a.get_local(i); + a.const_i32(1); + a.add_i32(); + a.set_local(i); + a.br(cont); + }); + }); + + a.get_local(sum); +}).withExport(); + +// drop: discard an unwanted return value +mod.defineFunction('callAndDiscard', [webasmjs.ValueType.Int32], [], (f, a) => { + // Call sumAndCount but ignore its return value + a.const_i32(10); + a.call(mod._functions[0]); // calls sumAndCount(10) + a.drop(); // discard the result + + // Return a fixed value instead + a.const_i32(42); +}).withExport(); + +const instance = await mod.instantiate(); +const { sumAndCount, callAndDiscard } = instance.instance.exports; + +log('sumAndCount (uses tee_local):'); +for (const n of [5, 10, 100]) { + log(' sum(1..' + n + ') = ' + sumAndCount(n)); +} +log(''); +log('callAndDiscard (uses drop):'); +log(' result = ' + callAndDiscard() + ' (dropped sumAndCount result, returned 42)');`, + }, + + 'unreachable-trap': { + label: 'Unreachable Trap', + group: 'Control Flow', + description: 'Use unreachable as an assertion — traps if reached.', + target: 'mvp', + features: [], + code: `// unreachable — intentional trap for defensive programming +const mod = new webasmjs.ModuleBuilder('trapDemo'); + +// divide(a, b) — traps if b is zero +mod.defineFunction('divide', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const x = f.getParameter(0); + const y = f.getParameter(1); + + // Guard: trap if divisor is zero + a.get_local(y); + a.eqz_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.unreachable(); // trap! + }); + + a.get_local(x); + a.get_local(y); + a.div_i32(); +}).withExport(); + +const instance = await mod.instantiate(); +const { divide } = instance.instance.exports; + +log('divide(10, 2) = ' + divide(10, 2)); +log('divide(100, 5) = ' + divide(100, 5)); +log('divide(7, 3) = ' + divide(7, 3)); +log(''); + +try { + divide(10, 0); + log('Should not reach here!'); +} catch (e) { + log('divide(10, 0) trapped: ' + e.message); + log('The unreachable instruction prevented division by zero!'); +}`, + }, + // ─── Numeric Types ─── 'float-math': { label: 'Float Math', group: 'Numeric', + description: 'Floating-point distance, rounding, and sqrt with f64.', + target: 'mvp', + features: [], code: `// Floating-point operations — f64 math functions const mod = new webasmjs.ModuleBuilder('floatMath'); @@ -589,6 +1185,9 @@ log('roundDown(2.7) = ' + roundDown(2.7));`, 'i64-bigint': { label: 'i64 / BigInt', group: 'Numeric', + description: '64-bit integers with BigInt interop — large factorial.', + target: 'mvp', + features: [], code: `// 64-bit integers — BigInt interop const mod = new webasmjs.ModuleBuilder('i64ops'); @@ -655,6 +1254,9 @@ for (let n = 0n; n <= 20n; n++) { 'type-conversions': { label: 'Type Conversions', group: 'Numeric', + description: 'Convert between i32, i64, f32, and f64 types.', + target: 'mvp', + features: [], code: `// Type conversions between numeric types const mod = new webasmjs.ModuleBuilder('conversions'); @@ -700,21 +1302,193 @@ log('i64(0x1FFFFFFFFn) → i32: ' + i64_to_i32(0x1FFFFFFFFn)); log('f32(3.14) → f64: ' + f32_to_f64(3.140000104904175));`, }, - // ─── Algorithms ─── - 'bubble-sort': { - label: 'Bubble Sort', - group: 'Algorithms', - code: `// Bubble sort in WASM memory -const mod = new webasmjs.ModuleBuilder('bubbleSort'); -mod.defineMemory(1); + 'bitwise-ops': { + label: 'Bitwise Operations', + group: 'Numeric', + description: 'Rotation, leading/trailing zeros, and popcount on i32.', + target: 'mvp', + features: [], + code: `// Bitwise operations — rotl, rotr, clz, ctz, popcnt +const mod = new webasmjs.ModuleBuilder('bitwiseOps'); -// Store i32 at index (index * 4) -mod.defineFunction('set', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { +mod.defineFunction('rotl', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { a.get_local(f.getParameter(0)); - a.const_i32(4); - a.mul_i32(); a.get_local(f.getParameter(1)); - a.store_i32(2, 0); + a.rotl_i32(); +}).withExport(); + +mod.defineFunction('rotr', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.rotr_i32(); +}).withExport(); + +mod.defineFunction('clz', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.clz_i32(); +}).withExport(); + +mod.defineFunction('ctz', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.ctz_i32(); +}).withExport(); + +mod.defineFunction('popcnt', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.popcnt_i32(); +}).withExport(); + +const instance = await mod.instantiate(); +const { rotl, rotr, clz, ctz, popcnt } = instance.instance.exports; + +log('=== Rotation ==='); +log('rotl(0x80000001, 1) = 0x' + (rotl(0x80000001, 1) >>> 0).toString(16)); +log('rotr(0x80000001, 1) = 0x' + (rotr(0x80000001, 1) >>> 0).toString(16)); +log('rotl(1, 10) = ' + rotl(1, 10) + ' (1 << 10 = 1024)'); + +log(''); +log('=== Bit Counting ==='); +log('clz(1) = ' + clz(1) + ' (31 leading zeros)'); +log('clz(256) = ' + clz(256) + ' (23 leading zeros)'); +log('clz(0) = ' + clz(0) + ' (all 32 zeros)'); +log('ctz(256) = ' + ctz(256) + ' (8 trailing zeros)'); +log('ctz(1) = ' + ctz(1) + ' (0 trailing zeros)'); +log('popcnt(0xFF) = ' + popcnt(0xFF) + ' (8 bits set)'); +log('popcnt(0x55555555) = ' + popcnt(0x55555555) + ' (16 bits set)'); +log('popcnt(0) = ' + popcnt(0));`, + }, + + 'float-special': { + label: 'Float Special Ops', + group: 'Numeric', + description: 'copysign, nearest, trunc — standalone float operations.', + target: 'mvp', + features: [], + code: `// Special float operations — copysign, nearest, trunc +const mod = new webasmjs.ModuleBuilder('floatSpecial'); + +// copysign(a, b) — magnitude of a, sign of b +mod.defineFunction('copysign', [webasmjs.ValueType.Float64], + [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.copysign_f64(); +}).withExport(); + +// nearest — round to nearest even (banker's rounding) +mod.defineFunction('nearest', [webasmjs.ValueType.Float64], + [webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.nearest_f64(); +}).withExport(); + +// trunc — round towards zero (remove fractional part) +mod.defineFunction('trunc', [webasmjs.ValueType.Float64], + [webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.trunc_f64(); +}).withExport(); + +const instance = await mod.instantiate(); +const { copysign, nearest, trunc } = instance.instance.exports; + +log('=== copysign(magnitude, sign) ==='); +log('copysign(5.0, -1.0) = ' + copysign(5.0, -1.0)); +log('copysign(-5.0, 1.0) = ' + copysign(-5.0, 1.0)); +log('copysign(3.14, -0.0) = ' + copysign(3.14, -0.0)); + +log(''); +log('=== nearest (banker\\u2019s rounding) ==='); +log('nearest(0.5) = ' + nearest(0.5) + ' (rounds to even: 0)'); +log('nearest(1.5) = ' + nearest(1.5) + ' (rounds to even: 2)'); +log('nearest(2.5) = ' + nearest(2.5) + ' (rounds to even: 2)'); +log('nearest(3.5) = ' + nearest(3.5) + ' (rounds to even: 4)'); +log('nearest(2.3) = ' + nearest(2.3)); +log('nearest(-1.7) = ' + nearest(-1.7)); + +log(''); +log('=== trunc (towards zero) ==='); +log('trunc(2.9) = ' + trunc(2.9)); +log('trunc(-2.9) = ' + trunc(-2.9)); +log('trunc(0.1) = ' + trunc(0.1));`, + }, + + 'reinterpret': { + label: 'Reinterpret Casts', + group: 'Numeric', + description: 'Reinterpret bits between float and int without conversion.', + target: 'mvp', + features: [], + code: `// Reinterpret — same bits, different type interpretation +const mod = new webasmjs.ModuleBuilder('reinterpret'); + +// View f32 bits as i32 +mod.defineFunction('f32_bits', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.reinterpret_f32_i32(); +}).withExport(); + +// View i32 bits as f32 +mod.defineFunction('i32_as_f32', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.reinterpret_i32_f32(); +}).withExport(); + +// View f64 bits as i64 +mod.defineFunction('f64_bits', [webasmjs.ValueType.Int64], + [webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.reinterpret_f64_i64(); +}).withExport(); + +// View i64 bits as f64 +mod.defineFunction('i64_as_f64', [webasmjs.ValueType.Float64], + [webasmjs.ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); + a.reinterpret_i64_f64(); +}).withExport(); + +const instance = await mod.instantiate(); +const { f32_bits, i32_as_f32, f64_bits, i64_as_f64 } = instance.instance.exports; + +log('=== f32 \\u2194 i32 reinterpret ==='); +log('f32_bits(1.0) = 0x' + (f32_bits(1.0) >>> 0).toString(16).padStart(8, '0') + ' (IEEE 754: 3F800000)'); +log('f32_bits(-1.0) = 0x' + (f32_bits(-1.0) >>> 0).toString(16).padStart(8, '0') + ' (BF800000)'); +log('f32_bits(0.0) = 0x' + (f32_bits(0.0) >>> 0).toString(16).padStart(8, '0')); +log('i32_as_f32(0x3F800000) = ' + i32_as_f32(0x3F800000) + ' (1.0)'); +log('i32_as_f32(0x40490FDB) = ' + i32_as_f32(0x40490FDB) + ' (~pi)'); + +log(''); +log('=== f64 \\u2194 i64 reinterpret ==='); +log('f64_bits(1.0) = 0x' + f64_bits(1.0).toString(16) + ' (3FF0000000000000)'); +log('i64_as_f64(0x4009_21FB_5444_2D18n) = ' + i64_as_f64(0x400921FB54442D18n) + ' (pi)');`, + }, + + // ─── Algorithms ─── + 'bubble-sort': { + label: 'Bubble Sort', + group: 'Algorithms', + description: 'Sort an array in linear memory with nested loops.', + target: 'mvp', + features: [], + code: `// Bubble sort in WASM memory +const mod = new webasmjs.ModuleBuilder('bubbleSort'); +mod.defineMemory(1); + +// Store i32 at index (index * 4) +mod.defineFunction('set', null, [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(4); + a.mul_i32(); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0); }).withExport(); // Load i32 at index @@ -835,6 +1609,9 @@ log('After: ' + sorted.join(', '));`, 'gcd': { label: 'GCD (Euclidean)', group: 'Algorithms', + description: 'Greatest common divisor using the Euclidean algorithm.', + target: 'mvp', + features: [], code: `// Greatest common divisor — Euclidean algorithm const mod = new webasmjs.ModuleBuilder('gcd'); @@ -881,6 +1658,9 @@ for (const [a, b] of pairs) { 'collatz': { label: 'Collatz Conjecture', group: 'Algorithms', + description: 'Count steps to reach 1 using the 3n+1 conjecture.', + target: 'mvp', + features: [], code: `// Collatz conjecture — count steps to reach 1 const mod = new webasmjs.ModuleBuilder('collatz'); @@ -941,6 +1721,9 @@ for (const n of [1, 2, 3, 6, 7, 9, 27, 97, 871]) { 'is-prime': { label: 'Primality Test', group: 'Algorithms', + description: 'Trial division to test and list prime numbers.', + target: 'mvp', + features: [], code: `// Primality test — trial division const mod = new webasmjs.ModuleBuilder('prime'); @@ -1031,6 +1814,9 @@ for (const n of [997, 1000, 7919, 7920, 104729]) { 'wat-parser': { label: 'WAT Parser', group: 'WAT', + description: 'Parse WebAssembly Text format and instantiate the module.', + target: 'mvp', + features: [], code: `// Parse WAT text and instantiate const watSource = \` (module $parsed @@ -1058,6 +1844,9 @@ log('add(-5, 10) = ' + add(-5, 10));`, 'wat-loop': { label: 'WAT Loop & Branch', group: 'WAT', + description: 'WAT with loop, block, and branch instructions.', + target: 'mvp', + features: [], code: `// WAT with loop and branch instructions const watSource = \` (module $loops @@ -1106,6 +1895,9 @@ for (const n of [0, 1, 5, 10, 50, 100]) { 'wat-memory': { label: 'WAT Memory & Data', group: 'WAT', + description: 'WAT with memory declarations, store/load, and exports.', + target: 'mvp', + features: [], code: `// WAT with memory, data segments, and imports const watSource = \` (module $memTest @@ -1149,6 +1941,9 @@ log('Raw bytes [0..15]: ' + Array.from(view.slice(0, 16)).join(', '));`, 'wat-global': { label: 'WAT Globals & Start', group: 'WAT', + description: 'WAT with mutable globals, start function, and inc/dec.', + target: 'mvp', + features: [], code: `// WAT with globals, start function, and if/else const watSource = \` (module $globalDemo @@ -1198,10 +1993,60 @@ log('dec() = ' + dec()); log('Final: ' + getCounter());`, }, + 'wat-imports': { + label: 'WAT Imports', + group: 'WAT', + description: 'WAT with function imports calling JavaScript host functions.', + target: 'mvp', + features: [], + code: `// WAT with imports — call JavaScript from WebAssembly text +const watSource = \` +(module $importDemo + (import "env" "print" (func $print (param i32))) + (import "env" "add" (func $add (param i32) (param i32) (result i32))) + + (func $run + ;; Call host add(3, 4), then print the result + i32.const 3 + i32.const 4 + call $add + call $print + + ;; Print some constants + i32.const 100 + call $print + i32.const 200 + call $print + ) + + (export "run" (func $run)) +) +\`; + +const mod = webasmjs.parseWat(watSource); +const results = []; +const instance = await mod.instantiate({ + env: { + print: (v) => results.push(v), + add: (a, b) => a + b, + }, +}); + +instance.instance.exports.run(); + +log('WAT module called JS imports:'); +results.forEach((v, i) => log(' print[' + i + '] = ' + v)); +log(''); +log('First value is add(3, 4) = 7, then constants 100, 200');`, + }, + // ─── SIMD ─── 'simd-vec-add': { label: 'SIMD Vector Add', group: 'SIMD', + description: 'Add two f32x4 vectors in memory using SIMD.', + target: '3.0', + features: ['simd'], code: `// SIMD: add two f32x4 vectors in memory const mod = new webasmjs.ModuleBuilder('simdAdd'); mod.defineMemory(1); @@ -1254,6 +2099,9 @@ for (let i = 0; i < 4; i++) { 'simd-dot-product': { label: 'SIMD Dot Product', group: 'SIMD', + description: 'Element-wise multiply then sum lanes for dot product.', + target: '3.0', + features: ['simd'], code: `// SIMD dot product: multiply element-wise then sum lanes const mod = new webasmjs.ModuleBuilder('simdDot'); mod.defineMemory(1); @@ -1310,6 +2158,9 @@ log('Expected: ' + (1*5 + 2*6 + 3*7 + 4*8));`, 'simd-splat-scale': { label: 'SIMD Splat & Scale', group: 'SIMD', + description: 'Broadcast a scalar to all lanes and multiply a vector.', + target: '3.0', + features: ['simd'], code: `// SIMD splat: broadcast a scalar to all lanes, then multiply const mod = new webasmjs.ModuleBuilder('simdScale'); mod.defineMemory(1); @@ -1359,6 +2210,9 @@ for (let i = 0; i < 4; i++) { 'bulk-memory': { label: 'Bulk Memory Ops', group: 'Bulk Memory', + description: 'Fill and copy memory regions with bulk operations.', + target: '2.0', + features: ['bulk-memory'], code: `// Bulk memory: memory.fill and memory.copy const mod = new webasmjs.ModuleBuilder('bulkMem'); const mem = mod.defineMemory(1); @@ -1416,6 +2270,9 @@ log(' ' + Array.from(view.slice(128, 144)).join(', '));`, 'sign-extend': { label: 'Sign Extension', group: 'Post-MVP', + description: 'Interpret low bits as signed values with extend8/extend16.', + target: '2.0', + features: ['sign-extend'], code: `// Sign extension: interpret low bits as signed values const mod = new webasmjs.ModuleBuilder('signExt'); @@ -1449,6 +2306,9 @@ log(' extend16(0xFFFF) = ' + extend16(0xFFFF) + ' (65535 → -1)');`, 'sat-trunc': { label: 'Saturating Truncation', group: 'Post-MVP', + description: 'Float-to-int conversion that clamps instead of trapping.', + target: '2.0', + features: ['sat-trunc'], code: `// Saturating truncation: float → int without trapping on overflow const mod = new webasmjs.ModuleBuilder('satTrunc'); @@ -1483,6 +2343,9 @@ log(' 1e20 → ' + sat_f64_to_u32(1e20) + ' (clamped to u32 max)');`, 'ref-types': { label: 'Reference Types', group: 'Post-MVP', + description: 'Use ref.null, ref.is_null, and ref.func instructions.', + target: '2.0', + features: ['reference-types'], code: `// Reference types: ref.null, ref.is_null, ref.func const mod = new webasmjs.ModuleBuilder('refTypes'); @@ -1515,10 +2378,343 @@ log(''); log('double(21) = ' + instance.instance.exports.double(21));`, }, + 'target-system': { + label: 'Target System', + group: 'Post-MVP', + description: 'Choose WebAssembly targets and feature flags.', + target: 'mvp', + features: [], + code: `// Target system: control which features are available +// Default is 'latest' — all features enabled +const modLatest = new webasmjs.ModuleBuilder('latest'); +log('latest features:'); +log(' threads: ' + modLatest.hasFeature('threads')); +log(' simd: ' + modLatest.hasFeature('simd')); +log(' exception-handling: ' + modLatest.hasFeature('exception-handling')); +log(' memory64: ' + modLatest.hasFeature('memory64')); +log(' relaxed-simd: ' + modLatest.hasFeature('relaxed-simd')); + +log(''); + +// WebAssembly 2.0 — only widely-deployed features +const mod2 = new webasmjs.ModuleBuilder('compat', { target: '2.0' }); +log('2.0 features:'); +log(' sign-extend: ' + mod2.hasFeature('sign-extend')); +log(' bulk-memory: ' + mod2.hasFeature('bulk-memory')); +log(' threads: ' + mod2.hasFeature('threads')); +log(' simd: ' + mod2.hasFeature('simd')); + +log(''); + +// MVP with specific features +const modCustom = new webasmjs.ModuleBuilder('custom', { + target: 'mvp', + features: ['simd', 'bulk-memory'], +}); +log('mvp + simd + bulk-memory:'); +log(' simd: ' + modCustom.hasFeature('simd')); +log(' bulk-memory: ' + modCustom.hasFeature('bulk-memory')); +log(' threads: ' + modCustom.hasFeature('threads')); + +log(''); + +// Build a simple module with 2.0 target +mod2.defineFunction('add', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_i32(); +}).withExport(); + +const instance = await mod2.instantiate(); +log('2.0 module works: add(3, 4) = ' + instance.instance.exports.add(3, 4));`, + }, + + 'multi-value': { + label: 'Multi-Value Returns', + group: 'Post-MVP', + description: 'Functions returning multiple values at once.', + target: '2.0', + features: ['multi-value'], + code: `// Multi-value: functions can return more than one value +const mod = new webasmjs.ModuleBuilder('multiValue'); + +// divmod returns both quotient and remainder +mod.defineFunction('divmod', [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const dividend = f.getParameter(0); + const divisor = f.getParameter(1); + + // Push quotient + a.get_local(dividend); + a.get_local(divisor); + a.div_s_i32(); + + // Push remainder + a.get_local(dividend); + a.get_local(divisor); + a.rem_s_i32(); +}).withExport(); + +const instance = await mod.instantiate(); +const divmod = instance.instance.exports.divmod; + +log('Multi-value returns (quotient, remainder):'); +for (const [a, b] of [[17, 5], [100, 7], [42, 6], [99, 10]]) { + const result = divmod(a, b); + log(' ' + a + ' / ' + b + ' = ' + result); +}`, + }, + + 'mutable-global-export': { + label: 'Mutable Global Export', + group: 'Post-MVP', + description: 'Export a mutable global, read from JavaScript.', + target: '2.0', + features: ['mutable-globals'], + code: `// Mutable global export: JS can read the global's value +const mod = new webasmjs.ModuleBuilder('mutGlobal'); + +const counter = mod.defineGlobal(webasmjs.ValueType.Int32, true, 0); +mod.exportGlobal(counter, 'counter'); + +mod.defineFunction('increment', null, [], (f, a) => { + a.get_global(counter); + a.const_i32(1); + a.add_i32(); + a.set_global(counter); +}).withExport(); + +mod.defineFunction('add', null, [webasmjs.ValueType.Int32], (f, a) => { + a.get_global(counter); + a.get_local(f.getParameter(0)); + a.add_i32(); + a.set_global(counter); +}).withExport(); + +const instance = await mod.instantiate(); +const { increment, add, counter: g } = instance.instance.exports; + +log('Initial: ' + g.value); +increment(); +increment(); +increment(); +log('After 3 increments: ' + g.value); +add(10); +log('After add(10): ' + g.value); +add(-5); +log('After add(-5): ' + g.value);`, + }, + + 'tail-call': { + label: 'Tail Calls', + group: 'Post-MVP', + description: 'Tail-recursive factorial — no stack overflow.', + target: '3.0', + features: ['tail-call'], + code: `// Tail calls: return_call reuses the current frame +const mod = new webasmjs.ModuleBuilder('tailCall'); + +// Tail-recursive helper: fact_helper(n, acc) +const helper = mod.defineFunction('fact_helper', [webasmjs.ValueType.Int64], + [webasmjs.ValueType.Int64, webasmjs.ValueType.Int64], (f, a) => { + const n = f.getParameter(0); + const acc = f.getParameter(1); + + // Base case: n <= 1 + a.get_local(n); + a.const_i64(1n); + a.le_s_i64(); + a.if(webasmjs.BlockType.Void, () => { + a.get_local(acc); + a.return(); + }); + + // Tail call: return_call fact_helper(n-1, n*acc) + a.get_local(n); + a.const_i64(1n); + a.sub_i64(); + a.get_local(n); + a.get_local(acc); + a.mul_i64(); + a.return_call(helper); +}); + +// Public entry: factorial(n) +mod.defineFunction('factorial', [webasmjs.ValueType.Int64], + [webasmjs.ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i64(1n); + a.call(helper); +}).withExport(); + +const instance = await mod.instantiate(); +const factorial = instance.instance.exports.factorial; + +log('Tail-recursive factorial (i64):'); +for (let n = 0n; n <= 20n; n++) { + log(' ' + n + '! = ' + factorial(n)); +} +log(''); +log('No stack overflow — return_call reuses the frame!');`, + }, + + 'shared-memory': { + label: 'Shared Memory', + group: 'Post-MVP', + description: 'Shared memory with atomic load/store/add.', + target: '3.0', + features: ['threads'], + code: `// Shared memory + atomic operations +const mod = new webasmjs.ModuleBuilder('atomics'); + +// Shared memory requires both initial and maximum +const mem = mod.defineMemory(1, 10, true); // shared=true +mod.exportMemory(mem, 'memory'); + +// Atomic store +mod.defineFunction('atomicStore', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_store_i32(2, 0); +}).withExport(); + +// Atomic load +mod.defineFunction('atomicLoad', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.atomic_load_i32(2, 0); +}).withExport(); + +// Atomic add (returns old value) +mod.defineFunction('atomicAdd', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_add_i32(2, 0); +}).withExport(); + +// Atomic compare-and-swap +mod.defineFunction('atomicCAS', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // address + a.get_local(f.getParameter(1)); // expected + a.get_local(f.getParameter(2)); // replacement + a.atomic_rmw_cmpxchg_i32(2, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { atomicStore, atomicLoad, atomicAdd, atomicCAS } = instance.instance.exports; + +log('=== Atomic Operations ==='); +atomicStore(0, 100); +log('atomicStore(0, 100)'); +log('atomicLoad(0) = ' + atomicLoad(0)); + +log(''); +const old1 = atomicAdd(0, 5); +log('atomicAdd(0, 5) returned old value: ' + old1); +log('atomicLoad(0) = ' + atomicLoad(0)); + +const old2 = atomicAdd(0, 10); +log('atomicAdd(0, 10) returned old value: ' + old2); +log('atomicLoad(0) = ' + atomicLoad(0)); + +log(''); +log('=== Compare-and-Swap ==='); +const cas1 = atomicCAS(0, 115, 200); +log('atomicCAS(0, 115, 200) = ' + cas1 + ' (matched, swapped)'); +log('atomicLoad(0) = ' + atomicLoad(0)); + +const cas2 = atomicCAS(0, 999, 300); +log('atomicCAS(0, 999, 300) = ' + cas2 + ' (no match, not swapped)'); +log('atomicLoad(0) = ' + atomicLoad(0));`, + }, + + 'exception-handling': { + label: 'Exception Handling', + group: 'Post-MVP', + description: 'Define tags and throw exceptions from WASM.', + target: '3.0', + features: ['exception-handling'], + code: `// Exception handling: defineTag + throw +const mod = new webasmjs.ModuleBuilder('exceptions', { disableVerification: true }); + +// Define a tag with an i32 payload (like an error code) +const errorTag = mod.defineTag([webasmjs.ValueType.Int32]); + +// Throws when input is negative +mod.defineFunction('checkPositive', null, [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(0); + a.lt_s_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.get_local(f.getParameter(0)); + a.throw(errorTag._index); + }); +}).withExport(); + +// Show the WAT output with tag and throw +const wat = mod.toString(); +log('=== WAT Output ==='); +log(wat); + +// Compile to bytes +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer));`, + }, + + 'memory64': { + label: 'Memory64', + group: 'Post-MVP', + description: '64-bit addressed memory for very large address spaces.', + target: '3.0', + features: ['memory64'], + code: `// Memory64: 64-bit addressed memory +const mod = new webasmjs.ModuleBuilder('memory64'); + +// Define a 64-bit addressed memory +const mem = mod.defineMemory(1, 100, false, true); // memory64=true +mod.exportMemory(mem, 'memory'); + +// Store: address is i64 for memory64 +mod.defineFunction('store64', null, + [webasmjs.ValueType.Int64, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // i64 address + a.get_local(f.getParameter(1)); // i32 value + a.store_i32(2, 0); +}).withExport(); + +// Load: address is i64 for memory64 +mod.defineFunction('load64', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); // i64 address + a.load_i32(2, 0); +}).withExport(); + +// Show the WAT — note i64 addresses +const wat = mod.toString(); +log('=== WAT Output (memory64) ==='); +log(wat); + +// Compile +const bytes = mod.toBytes(); +log(''); +log('Module compiled: ' + bytes.length + ' bytes'); +log(''); +log('Note: memory64 uses i64 addresses instead of i32.'); +log('Runtime instantiation requires engine support for memory64.');`, + }, + // ─── Debug & Inspection ─── 'debug-names': { label: 'Debug Name Section', group: 'Debug', + description: 'Inspect function, local, and global names in the binary.', + target: 'mvp', + features: [], code: `// Inspect the debug name section in the binary const mod = new webasmjs.ModuleBuilder('debugExample'); @@ -1595,6 +2791,9 @@ if (ns) { 'binary-inspect': { label: 'Binary Inspector', group: 'Debug', + description: 'Read back the binary structure — types, functions, exports.', + target: 'mvp', + features: [], code: `// Inspect the binary structure of a WASM module const mod = new webasmjs.ModuleBuilder('inspect'); mod.defineMemory(1); @@ -1658,6 +2857,9 @@ log('Valid: ' + WebAssembly.validate(bytes.buffer));`, 'wat-roundtrip': { label: 'WAT Roundtrip', group: 'Debug', + description: 'Build a module, emit WAT, parse it back, and verify.', + target: 'mvp', + features: [], code: `// Build a module programmatically, inspect WAT, parse it back const mod = new webasmjs.ModuleBuilder('roundtrip'); @@ -1695,26 +2897,1210 @@ log('negate(-10) = ' + negate(-10)); log(''); log('Roundtrip successful!');`, }, -}; -// ─── UI helpers ─── + 'custom-section': { + label: 'Custom Section', + group: 'Debug', + description: 'Add custom metadata to a module and read it back.', + target: 'mvp', + features: [], + code: `// Custom section — embed arbitrary metadata in the binary +const mod = new webasmjs.ModuleBuilder('customSec'); -const GROUP_ICONS: Record = { - Basics: '\u{1F44B}', - Memory: '\u{1F4BE}', - Globals: '\u{1F30D}', - Functions: '\u{1F517}', - Numeric: '\u{1F522}', - Algorithms: '\u{2699}', - SIMD: '\u{26A1}', - 'Bulk Memory': '\u{1F4E6}', - 'Post-MVP': '\u{1F680}', - WAT: '\u{1F4DD}', - Debug: '\u{1F50D}', -}; +mod.defineFunction('nop', null, [], (f, a) => { + a.nop(); +}).withExport(); -function getEditor(): HTMLTextAreaElement { - return document.getElementById('editor') as HTMLTextAreaElement; +// Add custom sections with metadata +const version = new TextEncoder().encode('1.0.0'); +mod.defineCustomSection('version', new Uint8Array(version)); + +const author = new TextEncoder().encode('webasmjs playground'); +mod.defineCustomSection('author', new Uint8Array(author)); + +const bytes = mod.toBytes(); +log('Module size: ' + bytes.length + ' bytes'); + +// Read it back with BinaryReader +const reader = new webasmjs.BinaryReader(bytes); +const info = reader.read(); + +log(''); +log('Custom sections found:'); +if (info.customSections) { + for (const sec of info.customSections) { + const text = new TextDecoder().decode(sec.data); + log(' "' + sec.name + '" = "' + text + '" (' + sec.data.length + ' bytes)'); + } +} else { + log(' (none found — BinaryReader may not expose custom sections)'); +} + +log(''); +log('The binary is still valid WASM:'); +log(' WebAssembly.validate() = ' + WebAssembly.validate(bytes.buffer));`, + }, + + 'extended-const': { + label: 'Extended Constants', + group: 'Post-MVP', + description: 'Arithmetic in global init expressions with extended-const.', + target: '3.0', + features: ['extended-const'], + code: `// Extended constants: arithmetic in global initializers +const mod = new webasmjs.ModuleBuilder('extConst', { + target: 'mvp', + features: ['extended-const'], +}); + +// Base offset as an immutable global +const base = mod.defineGlobal(webasmjs.ValueType.Int32, false, 100); + +// Computed global: base + 50 (uses i32.add in init expression) +const offset1 = mod.defineGlobal(webasmjs.ValueType.Int32, false, (asm) => { + asm.get_global(base); + asm.const_i32(50); + asm.add_i32(); +}); + +// Computed global: base * 3 (uses i32.mul in init expression) +const scaled = mod.defineGlobal(webasmjs.ValueType.Int32, false, (asm) => { + asm.get_global(base); + asm.const_i32(3); + asm.mul_i32(); +}); + +// Computed global: base * 2 + 7 +const combined = mod.defineGlobal(webasmjs.ValueType.Int32, false, (asm) => { + asm.get_global(base); + asm.const_i32(2); + asm.mul_i32(); + asm.const_i32(7); + asm.add_i32(); +}); + +mod.defineFunction('getBase', [webasmjs.ValueType.Int32], [], (f, a) => { + a.get_global(base); +}).withExport(); + +mod.defineFunction('getOffset1', [webasmjs.ValueType.Int32], [], (f, a) => { + a.get_global(offset1); +}).withExport(); + +mod.defineFunction('getScaled', [webasmjs.ValueType.Int32], [], (f, a) => { + a.get_global(scaled); +}).withExport(); + +mod.defineFunction('getCombined', [webasmjs.ValueType.Int32], [], (f, a) => { + a.get_global(combined); +}).withExport(); + +const instance = await mod.instantiate(); +const { getBase, getOffset1, getScaled, getCombined } = instance.instance.exports; + +log('Extended-const: arithmetic in global init expressions'); +log('base = ' + getBase()); +log('base + 50 = ' + getOffset1()); +log('base * 3 = ' + getScaled()); +log('base * 2 + 7 = ' + getCombined());`, + }, + + 'multi-memory': { + label: 'Multi-Memory', + group: 'Post-MVP', + description: 'Define and use multiple linear memories in one module.', + target: '3.0', + features: ['multi-memory'], + code: `// Multi-memory: two separate linear memories +const mod = new webasmjs.ModuleBuilder('multiMem', { + target: 'mvp', + features: ['multi-memory'], +}); + +const mem0 = mod.defineMemory(1); +mod.exportMemory(mem0, 'mem0'); +const mem1 = mod.defineMemory(1); +mod.exportMemory(mem1, 'mem1'); + +// Store to memory 0 +mod.defineFunction('store0', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0, 0); // memIndex=0 +}).withExport(); + +// Load from memory 0 +mod.defineFunction('load0', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0, 0); // memIndex=0 +}).withExport(); + +// Store to memory 1 +mod.defineFunction('store1', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0, 1); // memIndex=1 +}).withExport(); + +// Load from memory 1 +mod.defineFunction('load1', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0, 1); // memIndex=1 +}).withExport(); + +// Show WAT with two memories +const wat = mod.toString(); +log('=== WAT Output ==='); +log(wat); + +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer));`, + }, + + 'multi-table': { + label: 'Multi-Table', + group: 'Post-MVP', + description: 'Define multiple function tables and dispatch through each.', + target: '3.0', + features: ['multi-table'], + code: `// Multi-table: two function tables for different dispatch +const mod = new webasmjs.ModuleBuilder('multiTable', { + target: 'mvp', + features: ['multi-table'], +}); + +const add = mod.defineFunction('add', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_i32(); +}); + +const sub = mod.defineFunction('sub', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.sub_i32(); +}); + +const mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.mul_i32(); +}); + +// Table 0: math operations +const table0 = mod.defineTable(webasmjs.ElementType.AnyFunc, 3); +mod.defineTableSegment(table0, [add, sub, mul], 0); + +// Table 1: just add and mul (different arrangement) +const table1 = mod.defineTable(webasmjs.ElementType.AnyFunc, 2); +mod.defineTableSegment(table1, [mul, add], 0); + +// Show WAT with two tables +const wat = mod.toString(); +log('=== WAT Output (multi-table) ==='); +log(wat); + +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer));`, + }, + + 'relaxed-simd': { + label: 'Relaxed SIMD', + group: 'Post-MVP', + description: 'Relaxed SIMD operations for performance-sensitive code.', + target: 'latest', + features: ['relaxed-simd'], + code: `// Relaxed SIMD: relaxed_madd for fused multiply-add +const mod = new webasmjs.ModuleBuilder('relaxedSimd'); +mod.defineMemory(1); + +// relaxed_madd: a * b + c (fused multiply-add, may use FMA instruction) +mod.defineFunction('madd_f32x4', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, + webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(3)); // dest address + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); // load A + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); // load B + a.get_local(f.getParameter(2)); + a.load_v128(2, 0); // load C + a.relaxed_madd_f32x4(); // A * B + C + a.store_v128(2, 0); +}).withExport(); + +mod.defineFunction('setF32', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_f32(2, 0); +}).withExport(); + +mod.defineFunction('getF32', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_f32(2, 0); +}).withExport(); + +// Show WAT +const wat = mod.toString(); +log('=== WAT Output (relaxed SIMD) ==='); +log(wat); + +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer));`, + }, + + 'atomic-rmw': { + label: 'Atomic RMW Ops', + group: 'Post-MVP', + description: 'Atomic read-modify-write: sub, and, or, xor, exchange.', + target: '3.0', + features: ['threads'], + code: `// Atomic read-modify-write operations +const mod = new webasmjs.ModuleBuilder('atomicRMW'); + +// Shared memory for atomics +const mem = mod.defineMemory(1, 10, true); +mod.exportMemory(mem, 'memory'); + +// Atomic store +mod.defineFunction('store', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_store_i32(2, 0); +}).withExport(); + +// Atomic load +mod.defineFunction('load', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.atomic_load_i32(2, 0); +}).withExport(); + +// Atomic sub (returns old value) +mod.defineFunction('atomicSub', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_sub_i32(2, 0); +}).withExport(); + +// Atomic AND (returns old value) +mod.defineFunction('atomicAnd', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_and_i32(2, 0); +}).withExport(); + +// Atomic OR (returns old value) +mod.defineFunction('atomicOr', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_or_i32(2, 0); +}).withExport(); + +// Atomic XOR (returns old value) +mod.defineFunction('atomicXor', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_xor_i32(2, 0); +}).withExport(); + +// Atomic exchange (returns old value, stores new) +mod.defineFunction('atomicXchg', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_rmw_xchg_i32(2, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { store, load, atomicSub, atomicAnd, atomicOr, atomicXor, atomicXchg } = instance.instance.exports; + +log('=== Atomic Read-Modify-Write ==='); +log('All RMW ops return the OLD value before modification.'); +log(''); + +// Sub +store(0, 100); +const oldSub = atomicSub(0, 30); +log('atomicSub(100, 30): old=' + oldSub + ', new=' + load(0)); + +// AND +store(0, 0xFF); +const oldAnd = atomicAnd(0, 0x0F); +log('atomicAnd(0xFF, 0x0F): old=0x' + (oldAnd >>> 0).toString(16) + ', new=0x' + (load(0) >>> 0).toString(16)); + +// OR +store(0, 0xF0); +const oldOr = atomicOr(0, 0x0F); +log('atomicOr(0xF0, 0x0F): old=0x' + (oldOr >>> 0).toString(16) + ', new=0x' + (load(0) >>> 0).toString(16)); + +// XOR +store(0, 0xFF); +const oldXor = atomicXor(0, 0xAA); +log('atomicXor(0xFF, 0xAA): old=0x' + (oldXor >>> 0).toString(16) + ', new=0x' + (load(0) >>> 0).toString(16)); + +// Exchange +store(0, 42); +const oldXchg = atomicXchg(0, 99); +log('atomicXchg(42, 99): old=' + oldXchg + ', new=' + load(0));`, + }, + + 'atomic-wait-notify': { + label: 'Wait & Notify', + group: 'Post-MVP', + description: 'Atomic wait/notify primitives and memory fence.', + target: '3.0', + features: ['threads'], + code: `// Atomic wait, notify, and fence — thread synchronization primitives +const mod = new webasmjs.ModuleBuilder('waitNotify', { disableVerification: true }); + +const mem = mod.defineMemory(1, 10, true); +mod.exportMemory(mem, 'memory'); + +// atomic.wait32(addr, expected, timeout) -> 0=ok, 1=not-equal, 2=timed-out +mod.defineFunction('wait32', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int64], (f, a) => { + a.get_local(f.getParameter(0)); // address + a.get_local(f.getParameter(1)); // expected value + a.get_local(f.getParameter(2)); // timeout in ns (-1 = infinite) + a.atomic_wait32(2, 0); +}).withExport(); + +// atomic.notify(addr, count) -> number of waiters woken +mod.defineFunction('notify', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // address + a.get_local(f.getParameter(1)); // count of waiters to wake + a.atomic_notify(2, 0); +}).withExport(); + +// atomic.fence — full memory barrier +mod.defineFunction('fence', null, [], (f, a) => { + a.atomic_fence(0); +}).withExport(); + +// Atomic store for setup +mod.defineFunction('store', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.atomic_store_i32(2, 0); +}).withExport(); + +// Show the WAT output +const wat = mod.toString(); +log('=== WAT Output (wait/notify/fence) ==='); +log(wat); + +// Compile and validate +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer)); +log(''); +log('Note: atomic.wait blocks the calling thread until notified.'); +log('In a multi-threaded setup:'); +log(' Thread A: wait32(addr, 0, -1n) // sleep until value changes'); +log(' Thread B: store(addr, 1); notify(addr, 1) // wake thread A'); +log(' fence() ensures memory operations are visible across threads.');`, + }, + + // ─── Additional SIMD ─── + 'simd-integer': { + label: 'SIMD Integer Ops', + group: 'SIMD', + description: 'Integer SIMD: i32x4 add, sub, mul, comparisons, and lane ops.', + target: '3.0', + features: ['simd'], + code: `// Integer SIMD: i32x4 arithmetic, comparisons, lane extract/replace +const mod = new webasmjs.ModuleBuilder('simdInt'); +mod.defineMemory(1); + +// Add two i32x4 vectors +mod.defineFunction('add_i32x4', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.add_i32x4(); + a.store_v128(2, 0); +}).withExport(); + +// Element-wise min (signed) +mod.defineFunction('min_s_i32x4', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.min_s_i32x4(); + a.store_v128(2, 0); +}).withExport(); + +// Extract a single lane +mod.defineFunction('extract', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + // Load vector, extract lane based on index using a br_table + // For simplicity, extract lane 0 from the vector at the address + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.extract_lane_i32x4(0); +}).withExport(); + +// Splat a scalar to all 4 lanes +mod.defineFunction('splat_i32x4', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // dest + a.get_local(f.getParameter(1)); // scalar + a.splat_i32x4(); + a.store_v128(2, 0); +}).withExport(); + +mod.defineFunction('setI32', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0); +}).withExport(); + +mod.defineFunction('getI32', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { add_i32x4, min_s_i32x4, extract, splat_i32x4, setI32, getI32 } = instance.instance.exports; + +// A = [10, 20, 30, 40], B = [5, 25, 15, 45] +const a = [10, 20, 30, 40], b = [5, 25, 15, 45]; +for (let i = 0; i < 4; i++) { setI32(i * 4, a[i]); setI32(16 + i * 4, b[i]); } + +add_i32x4(0, 16, 32); +log('A = [' + a + ']'); +log('B = [' + b + ']'); +log('A + B = [' + [getI32(32), getI32(36), getI32(40), getI32(44)] + ']'); + +min_s_i32x4(0, 16, 48); +log('min(A, B) = [' + [getI32(48), getI32(52), getI32(56), getI32(60)] + ']'); + +log(''); +log('extract lane 0 of A: ' + extract(0, 0)); + +splat_i32x4(64, 7); +log('splat(7) = [' + [getI32(64), getI32(68), getI32(72), getI32(76)] + ']');`, + }, + + 'simd-shuffle': { + label: 'SIMD Shuffle & Swizzle', + group: 'SIMD', + description: 'Rearrange vector lanes with shuffle and swizzle.', + target: '3.0', + features: ['simd'], + code: `// SIMD shuffle & swizzle: rearrange bytes across vectors +const mod = new webasmjs.ModuleBuilder('simdShuffle'); +mod.defineMemory(1); + +// shuffle: pick 16 bytes from two source vectors by index +// Indices 0-15 = first vector, 16-31 = second vector +mod.defineFunction('interleave', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); // dest + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); // vector A + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); // vector B + // Interleave first 4 bytes: A[0], B[0], A[1], B[1], A[2], B[2], A[3], B[3], ... + a.shuffle_i8x16(new Uint8Array([0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23])); + a.store_v128(2, 0); +}).withExport(); + +// Reverse bytes within a vector using shuffle +mod.defineFunction('reverse', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(1)); // dest + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); // same vector for both operands + a.shuffle_i8x16(new Uint8Array([15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])); + a.store_v128(2, 0); +}).withExport(); + +// swizzle: rearrange bytes using a dynamic index vector +mod.defineFunction('swizzle', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); // dest + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); // data + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); // indices + a.swizzle_i8x16(); + a.store_v128(2, 0); +}).withExport(); + +mod.defineFunction('setByte', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store8_i32(0, 0); +}).withExport(); + +mod.defineFunction('getByte', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load8_i32_u(0, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { interleave, reverse, swizzle, setByte, getByte } = instance.instance.exports; + +// Set up: A = [0,1,2,...,15], B = [16,17,...,31] +for (let i = 0; i < 16; i++) { setByte(i, i); setByte(16 + i, 16 + i); } + +interleave(0, 16, 32); +const interleaved = []; +for (let i = 0; i < 16; i++) interleaved.push(getByte(32 + i)); +log('A = [0,1,2,...,15]'); +log('B = [16,17,...,31]'); +log('interleave(A, B) = [' + interleaved.join(', ') + ']'); + +log(''); +reverse(0, 48); +const reversed = []; +for (let i = 0; i < 16; i++) reversed.push(getByte(48 + i)); +log('reverse(A) = [' + reversed.join(', ') + ']'); + +log(''); +// swizzle: use indices [3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12] to reverse each group of 4 +for (let i = 0; i < 4; i++) { + for (let j = 0; j < 4; j++) setByte(64 + i * 4 + j, i * 4 + (3 - j)); +} +swizzle(0, 64, 80); +const swizzled = []; +for (let i = 0; i < 16; i++) swizzled.push(getByte(80 + i)); +log('swizzle(A, reverse-within-groups) = [' + swizzled.join(', ') + ']');`, + }, + + 'simd-widen-narrow': { + label: 'SIMD Widen & Narrow', + group: 'SIMD', + description: 'Convert between vector widths — narrow i16x8 to i8x16, extend i8x16 to i16x8.', + target: '3.0', + features: ['simd'], + code: `// SIMD widening and narrowing: convert between lane sizes +const mod = new webasmjs.ModuleBuilder('simdWidenNarrow'); +mod.defineMemory(1); + +// Narrow two i16x8 vectors into one i8x16 (saturating, unsigned) +mod.defineFunction('narrow_u', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.narrow_i16x8_u_i8x16(); + a.store_v128(2, 0); +}).withExport(); + +// Extend low half of i8x16 to i16x8 (signed) +mod.defineFunction('extend_low_s', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(1)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.extend_low_i8x16_s_i16x8(); + a.store_v128(2, 0); +}).withExport(); + +mod.defineFunction('setByte', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store8_i32(0, 0); +}).withExport(); + +mod.defineFunction('getByte', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load8_i32_u(0, 0); +}).withExport(); + +mod.defineFunction('setI16', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store16_i32(1, 0); +}).withExport(); + +mod.defineFunction('getI16', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load16_i32_s(1, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { narrow_u, extend_low_s, setByte, getByte, setI16, getI16 } = instance.instance.exports; + +// Narrowing: two i16x8 → one i8x16 (values clamped to 0-255) +// A = [10, 200, 300, 50, 0, 255, 1000, 128] at offset 0 +const i16a = [10, 200, 300, 50, 0, 255, 1000, 128]; +for (let i = 0; i < 8; i++) setI16(i * 2, i16a[i]); +// B = [1, 2, 3, 4, 5, 6, 7, 8] +for (let i = 0; i < 8; i++) setI16(16 + i * 2, i + 1); + +narrow_u(0, 16, 32); +const narrowed = []; +for (let i = 0; i < 16; i++) narrowed.push(getByte(32 + i)); +log('=== Narrowing (i16x8 → i8x16, unsigned saturating) ==='); +log('A (i16) = [' + i16a + ']'); +log('B (i16) = [1,2,3,4,5,6,7,8]'); +log('narrow_u = [' + narrowed.join(', ') + ']'); +log('(300→255, 1000→255 clamped)'); + +// Widening: i8x16 low half → i16x8 (signed extend) +log(''); +log('=== Widening (i8x16 → i16x8, signed) ==='); +const bytes = [5, 200, 127, 128, 0, 255, 1, 100]; // 200=0xC8→-56 signed, 128→-128, 255→-1 +for (let i = 0; i < 8; i++) setByte(48 + i, bytes[i]); +extend_low_s(48, 64); +const widened = []; +for (let i = 0; i < 8; i++) widened.push(getI16(64 + i * 2)); +log('input bytes = [' + bytes + ']'); +log('extend_low_s = [' + widened.join(', ') + ']'); +log('(200→-56, 128→-128, 255→-1 sign-extended)');`, + }, + + 'simd-saturating': { + label: 'SIMD Saturating Math', + group: 'SIMD', + description: 'Saturating add/sub that clamp instead of wrapping.', + target: '3.0', + features: ['simd'], + code: `// SIMD saturating arithmetic: clamp on overflow instead of wrap +const mod = new webasmjs.ModuleBuilder('simdSat'); +mod.defineMemory(1); + +// Saturating unsigned add on i8x16 +mod.defineFunction('add_sat_u', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.add_sat_u_i8x16(); + a.store_v128(2, 0); +}).withExport(); + +// Saturating unsigned sub on i8x16 +mod.defineFunction('sub_sat_u', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.sub_sat_u_i8x16(); + a.store_v128(2, 0); +}).withExport(); + +// Regular (wrapping) add for comparison +mod.defineFunction('add_wrap', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.load_v128(2, 0); + a.get_local(f.getParameter(1)); + a.load_v128(2, 0); + a.add_i8x16(); + a.store_v128(2, 0); +}).withExport(); + +mod.defineFunction('setByte', null, + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store8_i32(0, 0); +}).withExport(); + +mod.defineFunction('getByte', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load8_i32_u(0, 0); +}).withExport(); + +const instance = await mod.instantiate(); +const { add_sat_u, sub_sat_u, add_wrap, setByte, getByte } = instance.instance.exports; + +// A = [200, 100, 255, 0, 128, 50, 250, 10, ...] +const a = [200, 100, 255, 0, 128, 50, 250, 10]; +// B = [100, 200, 10, 5, 128, 250, 50, 0] +const b = [100, 200, 10, 5, 128, 250, 50, 0]; +for (let i = 0; i < 8; i++) { setByte(i, a[i]); setByte(16 + i, b[i]); } +for (let i = 8; i < 16; i++) { setByte(i, 0); setByte(16 + i, 0); } + +add_sat_u(0, 16, 32); +add_wrap(0, 16, 48); + +const satResult = [], wrapResult = []; +for (let i = 0; i < 8; i++) { satResult.push(getByte(32 + i)); wrapResult.push(getByte(48 + i)); } + +log('A = [' + a.join(', ') + ']'); +log('B = [' + b.join(', ') + ']'); +log(''); +log('add_sat_u = [' + satResult.join(', ') + '] (clamped to 255)'); +log('add_wrap = [' + wrapResult.join(', ') + '] (wraps around)'); + +log(''); +sub_sat_u(0, 16, 64); +const subResult = []; +for (let i = 0; i < 8; i++) subResult.push(getByte(64 + i)); +log('sub_sat_u = [' + subResult.join(', ') + '] (clamped to 0)');`, + }, + + // ─── Additional Bulk Memory ─── + 'passive-data': { + label: 'Passive Data Segments', + group: 'Bulk Memory', + description: 'Lazy-init memory with passive segments and memory.init.', + target: '2.0', + features: ['bulk-memory'], + code: `// Passive data segments: lazy initialization with memory.init +const mod = new webasmjs.ModuleBuilder('passiveData'); +const mem = mod.defineMemory(1); +mod.exportMemory(mem, 'memory'); + +// Passive segment: not placed in memory until memory.init is called +const greeting = new TextEncoder().encode('Hello, WebAssembly!'); +const dataSegment = mod.defineData(new Uint8Array([...greeting])); +// dataSegment is passive because no offset was given + +// Copy passive data into memory: init(destOffset) +mod.defineFunction('init', null, [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // destination offset + a.const_i32(0); // source offset in data segment + a.const_i32(${greeting.length}); // length + a.memory_init(dataSegment._index, 0); +}).withExport(); + +// Drop data segment (free it after init) +mod.defineFunction('drop', null, [], (f, a) => { + a.data_drop(dataSegment._index); +}).withExport(); + +// strlen +mod.defineFunction('strlen', [webasmjs.ValueType.Int32], [webasmjs.ValueType.Int32], (f, a) => { + const ptr = f.getParameter(0); + const len = a.declareLocal(webasmjs.ValueType.Int32, 'len'); + a.const_i32(0); + a.set_local(len); + a.loop(webasmjs.BlockType.Void, (cont) => { + a.block(webasmjs.BlockType.Void, (brk) => { + a.get_local(ptr); + a.get_local(len); + a.add_i32(); + a.load8_i32_u(0, 0); + a.eqz_i32(); + a.br_if(brk); + a.get_local(len); + a.const_i32(1); + a.add_i32(); + a.set_local(len); + a.br(cont); + }); + }); + a.get_local(len); +}).withExport(); + +const instance = await mod.instantiate(); +const { init, drop: dataDrop, strlen, memory } = instance.instance.exports; +const view = new Uint8Array(memory.buffer); + +// Memory starts empty (passive segment not yet loaded) +log('Before init: byte[0] = ' + view[0] + ' (empty)'); + +// Load passive data to offset 0 +init(0); +const len = strlen(0); +const str = new TextDecoder().decode(view.slice(0, len)); +log('After init(0): "' + str + '" (length=' + len + ')'); + +// Load the same data at a different offset +init(100); +const str2 = new TextDecoder().decode(view.slice(100, 100 + len)); +log('After init(100): "' + str2 + '"'); + +// Drop the data segment (can no longer init) +dataDrop(); +log(''); +log('Data segment dropped — passive data freed.'); +try { + init(200); + log('Should not reach here'); +} catch (e) { + log('init after drop: trapped as expected'); +}`, + }, + + 'bulk-table-ops': { + label: 'Bulk Table Operations', + group: 'Bulk Memory', + description: 'table.copy and table.fill for bulk table manipulation.', + target: '2.0', + features: ['bulk-memory'], + code: `// Bulk table operations: table.fill and table.copy +const mod = new webasmjs.ModuleBuilder('bulkTable'); + +const add = mod.defineFunction('add', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_i32(); +}).withExport(); + +const mul = mod.defineFunction('mul', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.mul_i32(); +}).withExport(); + +// Table with space for 8 entries +const table = mod.defineTable(webasmjs.ElementType.AnyFunc, 8); +mod.defineTableSegment(table, [add, mul], 0); + +// table.fill(start, ref, count) — fill slots 2-5 with the add function +mod.defineFunction('fillWithAdd', null, [], (f, a) => { + a.const_i32(2); // start index + a.ref_func(add); // function ref + a.const_i32(4); // count + a.table_fill(0); +}).withExport(); + +// table.copy(dest, src, count) — copy slots 0-1 to slots 6-7 +mod.defineFunction('copySlots', null, [], (f, a) => { + a.const_i32(6); // dest + a.const_i32(0); // src + a.const_i32(2); // count + a.table_copy(0, 0); +}).withExport(); + +// table.size +mod.defineFunction('tableSize', [webasmjs.ValueType.Int32], [], (f, a) => { + a.table_size(0); +}).withExport(); + +// Dispatch through table +mod.defineFunction('dispatch', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(1)); + a.get_local(f.getParameter(2)); + a.get_local(f.getParameter(0)); + a.call_indirect(add.funcTypeBuilder); +}).withExport(); + +const instance = await mod.instantiate(); +const { fillWithAdd, copySlots, tableSize, dispatch } = instance.instance.exports; + +log('Table size: ' + tableSize()); +log(''); + +// Initial: [add, mul, ?, ?, ?, ?, ?, ?] +log('Initial: slot 0 (add): dispatch(0, 3, 4) = ' + dispatch(0, 3, 4)); +log('Initial: slot 1 (mul): dispatch(1, 3, 4) = ' + dispatch(1, 3, 4)); + +// Fill slots 2-5 with add +fillWithAdd(); +log(''); +log('After table.fill(2, add, 4):'); +log(' slot 2: dispatch(2, 10, 20) = ' + dispatch(2, 10, 20) + ' (add)'); +log(' slot 3: dispatch(3, 10, 20) = ' + dispatch(3, 10, 20) + ' (add)'); + +// Copy slots 0-1 to 6-7 +copySlots(); +log(''); +log('After table.copy(6, 0, 2):'); +log(' slot 6: dispatch(6, 5, 6) = ' + dispatch(6, 5, 6) + ' (add, copied from 0)'); +log(' slot 7: dispatch(7, 5, 6) = ' + dispatch(7, 5, 6) + ' (mul, copied from 1)');`, + }, + + // ─── Additional Post-MVP ─── + 'table-ops': { + label: 'Table Get/Set/Grow', + group: 'Post-MVP', + description: 'Dynamic table manipulation with table.get, table.set, table.grow.', + target: '2.0', + features: ['reference-types'], + code: `// Dynamic table operations: get, set, grow +const mod = new webasmjs.ModuleBuilder('tableOps'); + +const double = mod.defineFunction('double', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(2); + a.mul_i32(); +}).withExport(); + +const triple = mod.defineFunction('triple', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(3); + a.mul_i32(); +}).withExport(); + +const negate = mod.defineFunction('negate', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.const_i32(0); + a.get_local(f.getParameter(0)); + a.sub_i32(); +}).withExport(); + +// Start with table of size 2 +const table = mod.defineTable(webasmjs.ElementType.AnyFunc, 2); +mod.defineTableSegment(table, [double, triple], 0); + +// table.set: place a function ref at an index +mod.defineFunction('setSlot', null, [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.ref_func(negate); + a.table_set(0); +}).withExport(); + +// table.grow: add N slots (returns old size, or -1 on failure) +mod.defineFunction('growTable', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.ref_null(0x70); // fill new slots with null + a.get_local(f.getParameter(0)); + a.table_grow(0); +}).withExport(); + +// table.size +mod.defineFunction('size', [webasmjs.ValueType.Int32], [], (f, a) => { + a.table_size(0); +}).withExport(); + +// Check if a slot is null +mod.defineFunction('isNull', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.table_get(0); + a.ref_is_null(); +}).withExport(); + +// Call through table +mod.defineFunction('call', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(1)); + a.get_local(f.getParameter(0)); + a.call_indirect(double.funcTypeBuilder); +}).withExport(); + +const instance = await mod.instantiate(); +const fn = instance.instance.exports; + +log('Initial size: ' + fn.size()); +log('slot 0 (double): call(0, 5) = ' + fn.call(0, 5)); +log('slot 1 (triple): call(1, 5) = ' + fn.call(1, 5)); + +// Grow table by 3 slots +const oldSize = fn.growTable(3); +log(''); +log('growTable(3) returned old size: ' + oldSize); +log('New size: ' + fn.size()); +log('slot 2 is null: ' + (fn.isNull(2) === 1)); + +// Set slot 2 to negate +fn.setSlot(2); +log(''); +log('After setSlot(2, negate):'); +log('slot 2 is null: ' + (fn.isNull(2) === 1)); +log('slot 2 (negate): call(2, 5) = ' + fn.call(2, 5));`, + }, + + 'try-catch': { + label: 'Try/Catch', + group: 'Post-MVP', + description: 'Full try/catch exception handling with multiple tags.', + target: '3.0', + features: ['exception-handling'], + code: `// Full try/catch exception handling +const mod = new webasmjs.ModuleBuilder('tryCatch', { disableVerification: true }); + +// Define two exception tags with different payloads +const errorTag = mod.defineTag([webasmjs.ValueType.Int32]); // error code +const overflowTag = mod.defineTag([webasmjs.ValueType.Int32]); // overflow value + +// Function that may throw +mod.defineFunction('checkedAdd', [webasmjs.ValueType.Int32], + [webasmjs.ValueType.Int32, webasmjs.ValueType.Int32], (f, a) => { + const x = f.getParameter(0); + const y = f.getParameter(1); + const result = a.declareLocal(webasmjs.ValueType.Int32, 'result'); + + a.get_local(x); + a.get_local(y); + a.add_i32(); + a.set_local(result); + + // Check for "overflow" (result > 1000 for demo purposes) + a.get_local(result); + a.const_i32(1000); + a.gt_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.get_local(result); + a.throw(overflowTag._index); + }); + + // Check for negative input + a.get_local(x); + a.const_i32(0); + a.lt_s_i32(); + a.if(webasmjs.BlockType.Void, () => { + a.const_i32(-1); + a.throw(errorTag._index); + }); + + a.get_local(result); +}).withExport(); + +// Show the WAT with tags, throw, try/catch +const wat = mod.toString(); +log('=== WAT Output (try/catch) ==='); +log(wat); + +const bytes = mod.toBytes(); +log('Module compiled: ' + bytes.length + ' bytes'); +log('Valid WASM: ' + WebAssembly.validate(bytes.buffer)); +log(''); +log('This module defines:'); +log(' - errorTag: thrown when input is negative'); +log(' - overflowTag: thrown when result > 1000'); +log(' - checkedAdd: adds two numbers with validation');`, + }, + + 'f32-math': { + label: 'f32 Math', + group: 'Numeric', + description: 'Single-precision float ops — f32 min, max, abs, neg, sqrt.', + target: 'mvp', + features: [], + code: `// f32 math — single-precision float operations +const mod = new webasmjs.ModuleBuilder('f32math'); + +mod.defineFunction('min', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32, webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.min_f32(); +}).withExport(); + +mod.defineFunction('max', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32, webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.max_f32(); +}).withExport(); + +mod.defineFunction('abs', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.abs_f32(); +}).withExport(); + +mod.defineFunction('neg', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.neg_f32(); +}).withExport(); + +mod.defineFunction('sqrt', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.sqrt_f32(); +}).withExport(); + +// Compare: f32 arithmetic vs f64 for precision +mod.defineFunction('addF32', [webasmjs.ValueType.Float32], + [webasmjs.ValueType.Float32, webasmjs.ValueType.Float32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_f32(); +}).withExport(); + +mod.defineFunction('addF64', [webasmjs.ValueType.Float64], + [webasmjs.ValueType.Float64, webasmjs.ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.add_f64(); +}).withExport(); + +const instance = await mod.instantiate(); +const { min, max, abs, neg, sqrt, addF32, addF64 } = instance.instance.exports; + +log('=== f32 Operations ==='); +log('min(3.14, 2.71) = ' + min(3.14, 2.71)); +log('max(3.14, 2.71) = ' + max(3.14, 2.71)); +log('abs(-42.5) = ' + abs(-42.5)); +log('neg(3.14) = ' + neg(3.14)); +log('sqrt(2.0) = ' + sqrt(2.0)); +log('sqrt(9.0) = ' + sqrt(9.0)); + +log(''); +log('=== f32 vs f64 Precision ==='); +log('f32: 0.1 + 0.2 = ' + addF32(0.1, 0.2)); +log('f64: 0.1 + 0.2 = ' + addF64(0.1, 0.2)); +log('f32 uses 4 bytes, f64 uses 8 bytes per value.');`, + }, +}; + +// ─── UI helpers ─── + +const GROUP_ICONS: Record = { + Basics: '\u{1F44B}', + Memory: '\u{1F4BE}', + Globals: '\u{1F30D}', + Functions: '\u{1F517}', + 'Control Flow': '\u{1F500}', + Numeric: '\u{1F522}', + Algorithms: '\u{2699}', + SIMD: '\u{26A1}', + 'Bulk Memory': '\u{1F4E6}', + 'Post-MVP': '\u{1F680}', + WAT: '\u{1F4DD}', + Debug: '\u{1F50D}', +}; + +// ─── Target ordering for filter comparison ─── +const TARGET_ORDER: Record = { + mvp: 0, + '2.0': 1, + '3.0': 2, + latest: 3, +}; + +function getEditor(): HTMLTextAreaElement { + return document.getElementById('editor') as HTMLTextAreaElement; } function getWatOutput(): HTMLElement { @@ -1725,6 +4111,10 @@ function getRunOutput(): HTMLElement { return document.getElementById('runOutput') as HTMLElement; } +function getConsoleOutput(): HTMLElement { + return document.getElementById('consoleOutput') as HTMLElement; +} + function clearOutput(el: HTMLElement): void { el.textContent = ''; } @@ -1745,15 +4135,89 @@ function loadExample(name: string): void { getEditor().value = example.code; clearOutput(getWatOutput()); clearOutput(getRunOutput()); + clearOutput(getConsoleOutput()); const label = document.getElementById('currentExample'); if (label) label.textContent = example.label; } } +// ─── Tab switching ─── + +function switchTab(tabName: 'wat' | 'output'): void { + const tabs = document.querySelectorAll('.tab-bar .tab'); + const panels = document.querySelectorAll('.tab-panel'); + tabs.forEach((tab) => { + tab.classList.toggle('active', (tab as HTMLElement).dataset.tab === tabName); + }); + panels.forEach((panel) => { + const isTarget = panel.id === (tabName === 'wat' ? 'watOutput' : 'runOutput'); + panel.classList.toggle('active', isTarget); + }); +} + +// ─── Console drawer ─── + +function toggleConsole(): void { + const drawer = document.getElementById('consoleDrawer')!; + drawer.classList.toggle('open'); +} + +function clearConsole(): void { + getConsoleOutput().textContent = ''; + updateConsoleBadge(); +} + +let consoleMessageCount = 0; + +function updateConsoleBadge(): void { + const badge = document.getElementById('consoleBadge')!; + consoleMessageCount = getConsoleOutput().childElementCount; + badge.textContent = String(consoleMessageCount); + badge.classList.toggle('has-messages', consoleMessageCount > 0); +} + +// ─── Resize handler ─── + +function initResizeHandler(): void { + const handle = document.getElementById('resizeHandle')!; + const main = document.querySelector('.main') as HTMLElement; + const editorPane = document.querySelector('.editor-pane') as HTMLElement; + const outputPane = document.querySelector('.output-pane') as HTMLElement; + let isResizing = false; + + handle.addEventListener('mousedown', (e: MouseEvent) => { + isResizing = true; + handle.classList.add('active'); + document.body.style.cursor = 'col-resize'; + document.body.style.userSelect = 'none'; + e.preventDefault(); + }); + + document.addEventListener('mousemove', (e: MouseEvent) => { + if (!isResizing) return; + const rect = main.getBoundingClientRect(); + const x = e.clientX - rect.left; + const totalWidth = rect.width - 4; // handle width + const leftPct = Math.max(20, Math.min(80, (x / rect.width) * 100)); + editorPane.style.flex = 'none'; + outputPane.style.flex = 'none'; + editorPane.style.width = leftPct + '%'; + outputPane.style.width = (100 - leftPct) + '%'; + }); + + document.addEventListener('mouseup', () => { + if (isResizing) { + isResizing = false; + handle.classList.remove('active'); + document.body.style.cursor = ''; + document.body.style.userSelect = ''; + } + }); +} + // ─── Example picker dialog ─── function openExamplePicker(): void { - // Prevent duplicates const existing = document.getElementById('exampleDialog'); if (existing) existing.remove(); @@ -1764,29 +4228,69 @@ function openExamplePicker(): void { const dialog = document.createElement('div'); dialog.className = 'dialog'; - // Header with search + // Header with search + filter dropdown const header = document.createElement('div'); header.className = 'dialog-header'; header.innerHTML = '

Examples

'; + const searchRow = document.createElement('div'); + searchRow.className = 'dialog-search-row'; + const searchInput = document.createElement('input'); searchInput.type = 'text'; searchInput.placeholder = 'Search examples...'; searchInput.className = 'dialog-search'; - header.appendChild(searchInput); + searchRow.appendChild(searchInput); + + // Compact filter dropdown + const filterSelect = document.createElement('select'); + filterSelect.className = 'filter-select'; + + // "All" option + const allOpt = document.createElement('option'); + allOpt.value = ''; + allOpt.textContent = 'All'; + filterSelect.appendChild(allOpt); + + // Target group + const targetGroup = document.createElement('optgroup'); + targetGroup.label = 'Target'; + for (const t of ['mvp', '2.0', '3.0', 'latest'] as WasmTarget[]) { + const opt = document.createElement('option'); + opt.value = 'target:' + t; + opt.textContent = t === 'mvp' ? 'MVP' : t === 'latest' ? 'Latest' : 'Wasm ' + t; + targetGroup.appendChild(opt); + } + filterSelect.appendChild(targetGroup); + + // Feature group — only features actually used by examples + const usedFeatures = new Set(); + for (const example of Object.values(EXAMPLES)) { + for (const f of example.features) usedFeatures.add(f); + } + const featureGroup = document.createElement('optgroup'); + featureGroup.label = 'Feature'; + for (const f of Array.from(usedFeatures).sort()) { + const opt = document.createElement('option'); + opt.value = 'feature:' + f; + opt.textContent = f; + featureGroup.appendChild(opt); + } + filterSelect.appendChild(featureGroup); + + searchRow.appendChild(filterSelect); + header.appendChild(searchRow); dialog.appendChild(header); // Build grouped grid const body = document.createElement('div'); body.className = 'dialog-body'; - const groups = new Map(); + const groups = new Map(); for (const [key, example] of Object.entries(EXAMPLES)) { const group = example.group; if (!groups.has(group)) groups.set(group, []); - // Extract first line of code as description - const firstComment = example.code.split('\n')[0].replace(/^\/\/\s*/, ''); - groups.get(group)!.push({ key, label: example.label, desc: firstComment }); + groups.get(group)!.push({ key, example }); } const allCards: HTMLElement[] = []; @@ -1811,18 +4315,42 @@ function openExamplePicker(): void { card.className = 'dialog-card'; if (item.key === currentExampleKey) card.classList.add('active'); card.dataset.key = item.key; - card.dataset.search = `${item.label} ${item.desc} ${groupName}`.toLowerCase(); + card.dataset.search = `${item.example.label} ${item.example.description} ${groupName}`.toLowerCase(); + card.dataset.target = item.example.target; + card.dataset.features = item.example.features.join(','); const title = document.createElement('div'); title.className = 'dialog-card-title'; - title.textContent = item.label; + title.textContent = item.example.label; card.appendChild(title); const desc = document.createElement('div'); desc.className = 'dialog-card-desc'; - desc.textContent = item.desc; + desc.textContent = item.example.description; card.appendChild(desc); + // Metadata badges + if (item.example.target !== 'mvp' || item.example.features.length > 0) { + const meta = document.createElement('div'); + meta.className = 'dialog-card-meta'; + + if (item.example.target !== 'mvp') { + const targetBadge = document.createElement('span'); + targetBadge.className = 'card-target'; + targetBadge.textContent = item.example.target; + meta.appendChild(targetBadge); + } + + for (const feat of item.example.features) { + const featBadge = document.createElement('span'); + featBadge.className = 'card-feature'; + featBadge.textContent = feat; + meta.appendChild(featBadge); + } + + card.appendChild(meta); + } + card.addEventListener('click', () => { loadExample(item.key); overlay.remove(); @@ -1841,19 +4369,35 @@ function openExamplePicker(): void { overlay.appendChild(dialog); document.body.appendChild(overlay); - // Search filtering - searchInput.addEventListener('input', () => { + // Filter logic + function applyFilters(): void { const q = searchInput.value.toLowerCase().trim(); + const filterVal = filterSelect.value; + for (const card of allCards) { - const match = !q || card.dataset.search!.includes(q); - (card as HTMLElement).style.display = match ? '' : 'none'; + const searchMatch = !q || card.dataset.search!.includes(q); + + let filterMatch = true; + if (filterVal.startsWith('target:')) { + const selectedTarget = filterVal.slice(7) as WasmTarget; + const cardTarget = card.dataset.target as WasmTarget; + filterMatch = TARGET_ORDER[cardTarget] <= TARGET_ORDER[selectedTarget]; + } else if (filterVal.startsWith('feature:')) { + const selectedFeature = filterVal.slice(8); + const cardFeatures = card.dataset.features ? card.dataset.features.split(',') : []; + filterMatch = cardFeatures.includes(selectedFeature); + } + + (card as HTMLElement).style.display = searchMatch && filterMatch ? '' : 'none'; } - // Hide groups with no visible cards for (const section of allSections) { const visibleCards = section.querySelectorAll('.dialog-card:not([style*="display: none"])'); (section as HTMLElement).style.display = visibleCards.length > 0 ? '' : 'none'; } - }); + } + + searchInput.addEventListener('input', applyFilters); + filterSelect.addEventListener('change', applyFilters); // Close on overlay click overlay.addEventListener('click', (e) => { @@ -1876,6 +4420,7 @@ function openExamplePicker(): void { // Expose library globally for eval'd code (window as any).webasmjs = { ModuleBuilder, + PackageBuilder, ValueType, BlockType, ElementType, @@ -1887,14 +4432,21 @@ function openExamplePicker(): void { async function run(): Promise { const watEl = getWatOutput(); const runEl = getRunOutput(); + const consoleEl = getConsoleOutput(); clearOutput(watEl); clearOutput(runEl); + clearOutput(consoleEl); const code = getEditor().value; - // Capture log calls + // Open console drawer and switch to WAT tab + const drawer = document.getElementById('consoleDrawer')!; + drawer.classList.add('open'); + + // Capture log calls -> console drawer const log = (msg: any) => { - appendOutput(runEl, String(msg)); + appendOutput(consoleEl, String(msg)); + updateConsoleBadge(); }; // Intercept ModuleBuilder to capture WAT before instantiate @@ -1923,14 +4475,31 @@ async function run(): Promise { } } finally { (window as any).webasmjs.ModuleBuilder = OrigModuleBuilder; + updateConsoleBadge(); } } -// Initialize document.addEventListener('DOMContentLoaded', () => { document.getElementById('examplesBtn')!.addEventListener('click', openExamplePicker); document.getElementById('runBtn')!.addEventListener('click', run); + // Tab switching + document.querySelectorAll('.tab-bar .tab').forEach((tab) => { + tab.addEventListener('click', () => { + switchTab((tab as HTMLElement).dataset.tab as 'wat' | 'output'); + }); + }); + + // Console drawer toggle and clear + document.getElementById('consoleToggle')!.addEventListener('click', toggleConsole); + document.getElementById('consoleClear')!.addEventListener('click', (e) => { + e.stopPropagation(); + clearConsole(); + }); + + // Resize handler + initResizeHandler(); + // Ctrl/Cmd+Enter to run getEditor().addEventListener('keydown', (e: KeyboardEvent) => { if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') { diff --git a/src/BinaryModuleWriter.ts b/src/BinaryModuleWriter.ts index d4ee6a0..38f374d 100644 --- a/src/BinaryModuleWriter.ts +++ b/src/BinaryModuleWriter.ts @@ -84,6 +84,10 @@ export default class BinaryModuleWriter { BinaryModuleWriter.writeSection(writer, SectionType.Export, this.moduleBuilder._exports); } + writeTagSection(writer: BinaryWriter): void { + BinaryModuleWriter.writeSection(writer, SectionType.Tag, this.moduleBuilder._tags); + } + writeStartSection(writer: BinaryWriter): void { if (!this.moduleBuilder._startFunction) { return; @@ -236,6 +240,7 @@ export default class BinaryModuleWriter { this.writeTableSection(writer); this.writeMemorySection(writer); this.writeGlobalSection(writer); + this.writeTagSection(writer); this.writeExportSection(writer); this.writeStartSection(writer); this.writeElementSection(writer); diff --git a/src/BinaryReader.ts b/src/BinaryReader.ts index fbe9335..491b65b 100644 --- a/src/BinaryReader.ts +++ b/src/BinaryReader.ts @@ -8,6 +8,7 @@ import { ImmediateType, LanguageType, } from './types'; +import OpCodes from './OpCodes'; export interface ModuleInfo { version: number; @@ -418,27 +419,26 @@ export default class BinaryReader { private readInitExpr(): Uint8Array { const start = this.offset; - // Read until we hit 0x0b (end opcode) while (this.offset < this.buffer.length) { const byte = this.buffer[this.offset++]; - if (byte === 0x0b) { + if (byte === OpCodes.end.value) { break; } // Skip over immediate operands for known init expression opcodes switch (byte) { - case 0x41: // i32.const + case OpCodes.i32_const.value: this.readVarInt32(); break; - case 0x42: // i64.const + case OpCodes.i64_const.value: this.readVarInt64(); break; - case 0x43: // f32.const + case OpCodes.f32_const.value: this.offset += 4; break; - case 0x44: // f64.const + case OpCodes.f64_const.value: this.offset += 8; break; - case 0x23: // global.get + case OpCodes.get_global.value: this.readVarUInt32(); break; } diff --git a/src/DataSegmentBuilder.ts b/src/DataSegmentBuilder.ts index 13fe87a..59c4438 100644 --- a/src/DataSegmentBuilder.ts +++ b/src/DataSegmentBuilder.ts @@ -1,14 +1,28 @@ import InitExpressionEmitter from './InitExpressionEmitter'; import BinaryWriter from './BinaryWriter'; import GlobalBuilder from './GlobalBuilder'; -import { InitExpressionType, ValueType } from './types'; +import { InitExpressionType, ValueType, WasmFeature } from './types'; export default class DataSegmentBuilder { _data: Uint8Array; _initExpressionEmitter: InitExpressionEmitter | null = null; + _passive: boolean = false; + _memoryIndex: number = 0; + _features: Set; - constructor(data: Uint8Array) { + constructor(data: Uint8Array, features?: Set) { this._data = data; + this._features = features || new Set(); + } + + passive(): this { + this._passive = true; + return this; + } + + memoryIndex(index: number): this { + this._memoryIndex = index; + return this; } createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter { @@ -18,7 +32,8 @@ export default class DataSegmentBuilder { this._initExpressionEmitter = new InitExpressionEmitter( InitExpressionType.Data, - ValueType.Int32 + ValueType.Int32, + this._features ); if (callback) { callback(this._initExpressionEmitter); @@ -45,11 +60,26 @@ export default class DataSegmentBuilder { } write(writer: BinaryWriter): void { + if (this._passive) { + // Passive segment: kind=1, no memory index, no offset expression + writer.writeVarUInt32(1); + writer.writeVarUInt32(this._data.length); + writer.writeBytes(this._data); + return; + } + if (!this._initExpressionEmitter) { throw new Error('The initialization expression was not defined.'); } - writer.writeVarUInt32(0); + if (this._memoryIndex !== 0) { + // Active segment with explicit memory index: kind=2 + writer.writeVarUInt32(2); + writer.writeVarUInt32(this._memoryIndex); + } else { + // Active segment with default memory 0: kind=0 + writer.writeVarUInt32(0); + } this._initExpressionEmitter.write(writer); writer.writeVarUInt32(this._data.length); writer.writeBytes(this._data); diff --git a/src/ElementSegmentBuilder.ts b/src/ElementSegmentBuilder.ts index 7256c47..7a6b4d0 100644 --- a/src/ElementSegmentBuilder.ts +++ b/src/ElementSegmentBuilder.ts @@ -4,17 +4,25 @@ import InitExpressionEmitter from './InitExpressionEmitter'; import TableBuilder from './TableBuilder'; import FunctionBuilder from './FunctionBuilder'; import ImportBuilder from './ImportBuilder'; -import { InitExpressionType, ValueType } from './types'; +import { InitExpressionType, ValueType, WasmFeature } from './types'; import BinaryWriter from './BinaryWriter'; export default class ElementSegmentBuilder { - _table: TableBuilder; + _table: TableBuilder | null; _functions: (FunctionBuilder | ImportBuilder)[] = []; _initExpressionEmitter: InitExpressionEmitter | null = null; + _passive: boolean = false; + _features: Set; - constructor(table: TableBuilder, functions: (FunctionBuilder | ImportBuilder)[]) { + constructor(table: TableBuilder | null, functions: (FunctionBuilder | ImportBuilder)[], features?: Set) { this._table = table; this._functions = functions; + this._features = features || new Set(); + } + + passive(): this { + this._passive = true; + return this; } createInitEmitter(callback?: (asm: InitExpressionEmitter) => void): InitExpressionEmitter { @@ -24,7 +32,8 @@ export default class ElementSegmentBuilder { this._initExpressionEmitter = new InitExpressionEmitter( InitExpressionType.Element, - ValueType.Int32 + ValueType.Int32, + this._features ); if (callback) { callback(this._initExpressionEmitter); @@ -50,21 +59,45 @@ export default class ElementSegmentBuilder { } } + private _writeFuncIndex(writer: BinaryWriter, func: FunctionBuilder | ImportBuilder): void { + if (func instanceof FunctionBuilder) { + writer.writeVarUInt32(func._index); + } else if (func instanceof ImportBuilder) { + writer.writeVarUInt32(func.index); + } + } + write(writer: BinaryWriter): void { + if (this._passive) { + // Passive segment: kind=1, elemkind=0x00 (funcref), vec of func indices + writer.writeVarUInt32(1); + writer.writeUInt8(0x00); // elemkind: funcref + writer.writeVarUInt32(this._functions.length); + this._functions.forEach((x) => this._writeFuncIndex(writer, x)); + return; + } + if (!this._initExpressionEmitter) { throw new Error('The initialization expression was not defined.'); } - writer.writeVarUInt32(this._table._index); - this._initExpressionEmitter.write(writer); - writer.writeVarUInt32(this._functions.length); - this._functions.forEach((x) => { - if (x instanceof FunctionBuilder) { - writer.writeVarUInt32(x._index); - } else if (x instanceof ImportBuilder) { - writer.writeVarUInt32(x.index); - } - }); + const tableIndex = this._table ? this._table._index : 0; + + if (tableIndex !== 0) { + // Active segment with explicit table index: kind=2 + writer.writeVarUInt32(2); + writer.writeVarUInt32(tableIndex); + this._initExpressionEmitter.write(writer); + writer.writeUInt8(0x00); // elemkind: funcref + writer.writeVarUInt32(this._functions.length); + this._functions.forEach((x) => this._writeFuncIndex(writer, x)); + } else { + // Active segment with default table 0: kind=0 + writer.writeVarUInt32(0); + this._initExpressionEmitter.write(writer); + writer.writeVarUInt32(this._functions.length); + this._functions.forEach((x) => this._writeFuncIndex(writer, x)); + } } toBytes(): Uint8Array { diff --git a/src/FuncTypeBuilder.ts b/src/FuncTypeBuilder.ts index 4297a4b..6c7f1bd 100644 --- a/src/FuncTypeBuilder.ts +++ b/src/FuncTypeBuilder.ts @@ -52,7 +52,7 @@ export default class FuncTypeBuilder { writer.writeVarInt7(x.value); }); - writer.writeVarUInt1(this.returnTypes.length); + writer.writeVarUInt32(this.returnTypes.length); this.returnTypes.forEach((x) => { writer.writeVarInt7(x.value); }); diff --git a/src/GlobalBuilder.ts b/src/GlobalBuilder.ts index 6e15035..5702a3e 100644 --- a/src/GlobalBuilder.ts +++ b/src/GlobalBuilder.ts @@ -42,7 +42,8 @@ export default class GlobalBuilder { this._initExpressionEmitter = new InitExpressionEmitter( InitExpressionType.Global, - this.valueType + this.valueType, + this._moduleBuilder.features ); if (callback) { callback(this._initExpressionEmitter); diff --git a/src/InitExpressionEmitter.ts b/src/InitExpressionEmitter.ts index 2dc3a0e..cf37d07 100644 --- a/src/InitExpressionEmitter.ts +++ b/src/InitExpressionEmitter.ts @@ -1,16 +1,18 @@ import AssemblyEmitter from './AssemblyEmitter'; import GlobalBuilder from './GlobalBuilder'; -import { InitExpressionType, ValueTypeDescriptor, OpCodeDef } from './types'; +import { InitExpressionType, ValueTypeDescriptor, OpCodeDef, WasmFeature } from './types'; import OpCodes from './OpCodes'; import FuncTypeSignature from './FuncTypeSignature'; import BinaryWriter from './BinaryWriter'; export default class InitExpressionEmitter extends AssemblyEmitter { _initExpressionType: InitExpressionType; + _features: Set; - constructor(initExpressionType: InitExpressionType, valueType: ValueTypeDescriptor) { + constructor(initExpressionType: InitExpressionType, valueType: ValueTypeDescriptor, features?: Set) { super(new FuncTypeSignature([valueType], [])); this._initExpressionType = initExpressionType; + this._features = features || new Set(); } getParameter(_index: number): never { @@ -33,17 +35,26 @@ export default class InitExpressionEmitter extends AssemblyEmitter { } _isValidateOp(opCode: OpCodeDef, args?: any[]): void { - if (this._instructions.length === 2) { + // Extended-const allows multiple instructions in init expressions + const hasExtendedConst = this._features.has('extended-const'); + const maxInstructions = hasExtendedConst ? Infinity : 2; + + if (this._instructions.length >= maxInstructions) { return; } - if (this._instructions.length === 1) { + if (!hasExtendedConst && this._instructions.length === 1) { if (opCode !== OpCodes.end) { throw new Error(`Opcode ${opCode.mnemonic} is not valid after init expression value.`); } return; } + // With extended-const, end is always valid + if (opCode === OpCodes.end) { + return; + } + switch (opCode) { case OpCodes.f32_const: case OpCodes.f64_const: @@ -53,7 +64,7 @@ export default class InitExpressionEmitter extends AssemblyEmitter { case OpCodes.get_global: { const globalBuilder = args?.[0]; - if (this._initExpressionType === InitExpressionType.Element) { + if (this._initExpressionType === InitExpressionType.Element && !hasExtendedConst) { throw new Error( 'The only valid instruction for an element initializer expression is a constant i32, ' + 'global not supported.' @@ -64,7 +75,7 @@ export default class InitExpressionEmitter extends AssemblyEmitter { throw new Error('A global builder was expected.'); } - if (globalBuilder.globalType.mutable) { + if (globalBuilder.globalType.mutable && !hasExtendedConst) { throw new Error( 'An initializer expression cannot reference a mutable global.' ); @@ -73,6 +84,21 @@ export default class InitExpressionEmitter extends AssemblyEmitter { break; } + // Extended-const: allow arithmetic in init expressions + case OpCodes.i32_add: + case OpCodes.i32_sub: + case OpCodes.i32_mul: + case OpCodes.i64_add: + case OpCodes.i64_sub: + case OpCodes.i64_mul: { + if (!hasExtendedConst) { + throw new Error( + `Opcode ${opCode.mnemonic} is not supported in an initializer expression. Enable the extended-const feature to allow arithmetic in init expressions.` + ); + } + break; + } + default: throw new Error( `Opcode ${opCode.mnemonic} is not supported in an initializer expression.` diff --git a/src/MemoryBuilder.ts b/src/MemoryBuilder.ts index 6096efc..0753bbf 100644 --- a/src/MemoryBuilder.ts +++ b/src/MemoryBuilder.ts @@ -8,9 +8,9 @@ export default class MemoryBuilder { _memoryType: MemoryType; _index: number; - constructor(moduleBuilder: ModuleBuilder, resizableLimits: ResizableLimits, index: number) { + constructor(moduleBuilder: ModuleBuilder, resizableLimits: ResizableLimits, index: number, shared: boolean = false, memory64: boolean = false) { this._moduleBuilder = moduleBuilder; - this._memoryType = new MemoryType(resizableLimits); + this._memoryType = new MemoryType(resizableLimits, shared, memory64); this._index = index; } @@ -19,6 +19,14 @@ export default class MemoryBuilder { return this; } + get isShared(): boolean { + return this._memoryType.shared; + } + + get isMemory64(): boolean { + return this._memoryType.memory64; + } + write(writer: BinaryWriter): void { this._memoryType.write(writer); } diff --git a/src/MemoryType.ts b/src/MemoryType.ts index d272d38..85d762c 100644 --- a/src/MemoryType.ts +++ b/src/MemoryType.ts @@ -4,14 +4,36 @@ import ResizableLimits from './ResizableLimits'; export default class MemoryType { resizableLimits: ResizableLimits; + shared: boolean; + memory64: boolean; - constructor(resizableLimits: ResizableLimits) { + constructor(resizableLimits: ResizableLimits, shared: boolean = false, memory64: boolean = false) { Arg.instanceOf('resizableLimits', resizableLimits, ResizableLimits); + if (shared && resizableLimits.maximum === null) { + throw new Error('Shared memory requires a maximum size.'); + } this.resizableLimits = resizableLimits; + this.shared = shared; + this.memory64 = memory64; } write(writer: BinaryWriter): void { - this.resizableLimits.write(writer); + if (this.shared || this.memory64) { + // Extended flags byte: + // bit 0: has maximum + // bit 1: shared + // bit 2: memory64 + let flags = this.resizableLimits.maximum !== null ? 0b001 : 0; + if (this.shared) flags |= 0b010; + if (this.memory64) flags |= 0b100; + writer.writeVarUInt7(flags); + writer.writeVarUInt32(this.resizableLimits.initial); + if (this.resizableLimits.maximum !== null) { + writer.writeVarUInt32(this.resizableLimits.maximum); + } + } else { + this.resizableLimits.write(writer); + } } toBytes(): Uint8Array { diff --git a/src/ModuleBuilder.ts b/src/ModuleBuilder.ts index 9c46512..3b314a0 100644 --- a/src/ModuleBuilder.ts +++ b/src/ModuleBuilder.ts @@ -22,6 +22,7 @@ import ResizableLimits from './ResizableLimits'; import TableBuilder from './TableBuilder'; import TableType from './TableType'; import TextModuleWriter from './TextModuleWriter'; +import TagBuilder from './TagBuilder'; import CustomSectionBuilder from './CustomSectionBuilder'; import FunctionEmitter from './FunctionEmitter'; import VerificationError from './verification/VerificationError'; @@ -34,8 +35,12 @@ export default class ModuleBuilder { static readonly targetFeatures: Record = { 'mvp': [], - '2.0': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'multi-value'], - 'latest': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'simd', 'multi-value'], + '2.0': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'multi-value', 'mutable-globals'], + '3.0': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'multi-value', 'mutable-globals', + 'simd', 'tail-call', 'exception-handling', 'threads', 'multi-memory', 'multi-table', 'memory64', 'extended-const'], + 'latest': ['sign-extend', 'sat-trunc', 'bulk-memory', 'reference-types', 'multi-value', 'mutable-globals', + 'simd', 'tail-call', 'exception-handling', 'threads', 'multi-memory', 'multi-table', 'memory64', 'extended-const', + 'relaxed-simd', 'gc'], }; _name: string; @@ -48,6 +53,7 @@ export default class ModuleBuilder { _exports: ExportBuilder[] = []; _elements: ElementSegmentBuilder[] = []; _data: DataSegmentBuilder[] = []; + _tags: TagBuilder[] = []; _customSections: CustomSectionBuilder[] = []; _startFunction: FunctionBuilder | null = null; _importsIndexSpace = { @@ -101,8 +107,8 @@ export default class ModuleBuilder { normalizedReturnTypes = returnTypes; } - if (normalizedReturnTypes.length > 1) { - throw new Error('A method can only return zero to one values.'); + if (normalizedReturnTypes.length > 1 && !this._resolvedFeatures.has('multi-value')) { + throw new Error('A method can only return zero to one values. Enable the multi-value feature to allow multiple return values.'); } const funcTypeKey = FuncTypeBuilder.createKey(normalizedReturnTypes, parameters); @@ -194,7 +200,8 @@ export default class ModuleBuilder { moduleName: string, name: string, initialSize: number, - maximumSize: number | null = null + maximumSize: number | null = null, + shared: boolean = false ): ImportBuilder { Arg.string('moduleName', moduleName); Arg.string('name', name); @@ -211,11 +218,11 @@ export default class ModuleBuilder { throw new Error(`An import already existing for ${moduleName}.${name}`); } - if (this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) { - throw new VerificationError('Only one memory is allowed per module.'); + if ((this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) && !this._resolvedFeatures.has('multi-memory')) { + throw new VerificationError('Only one memory is allowed per module. Enable the multi-memory feature to allow multiple memories.'); } - const memoryType = new MemoryType(new ResizableLimits(initialSize, maximumSize)); + const memoryType = new MemoryType(new ResizableLimits(initialSize, maximumSize), shared); const importBuilder = new ImportBuilder( moduleName, name, @@ -295,8 +302,8 @@ export default class ModuleBuilder { initialSize: number, maximumSize: number | null = null ): TableBuilder { - if (this._tables.length === 1) { - throw new Error('Only one table can be created per module.'); + if (this._tables.length >= 1 && !this._resolvedFeatures.has('multi-table')) { + throw new Error('Only one table can be created per module. Enable the multi-table feature to allow multiple tables.'); } const table = new TableBuilder( @@ -309,15 +316,17 @@ export default class ModuleBuilder { return table; } - defineMemory(initialSize: number, maximumSize: number | null = null): MemoryBuilder { - if (this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) { - throw new VerificationError('Only one memory is allowed per module.'); + defineMemory(initialSize: number, maximumSize: number | null = null, shared: boolean = false, memory64: boolean = false): MemoryBuilder { + if ((this._memories.length !== 0 || this._importsIndexSpace.memory !== 0) && !this._resolvedFeatures.has('multi-memory')) { + throw new VerificationError('Only one memory is allowed per module. Enable the multi-memory feature to allow multiple memories.'); } const memory = new MemoryBuilder( this, new ResizableLimits(initialSize, maximumSize), - this._memories.length + this._importsIndexSpace.memory + this._memories.length + this._importsIndexSpace.memory, + shared, + memory64 ); this._memories.push(memory); return memory; @@ -342,6 +351,20 @@ export default class ModuleBuilder { return globalBuilder; } + defineTag( + parameters: ValueTypeDescriptor[] + ): TagBuilder { + // Tags have no return types — they describe the exception payload + const funcType = this.defineFuncType(null, parameters); + const tagBuilder = new TagBuilder( + this, + funcType, + this._tags.length + ); + this._tags.push(tagBuilder); + return tagBuilder; + } + setStartFunction(functionBuilder: FunctionBuilder): void { Arg.instanceOf('functionBuilder', functionBuilder, FunctionBuilder); this._startFunction = functionBuilder; @@ -407,8 +430,8 @@ export default class ModuleBuilder { exportGlobal(globalBuilder: GlobalBuilder, name: string): ExportBuilder { Arg.notEmptyString('name', name); Arg.instanceOf('globalBuilder', globalBuilder, GlobalBuilder); - if (globalBuilder.globalType.mutable && !this.disableVerification) { - throw new VerificationError('Cannot export a mutable global.'); + if (globalBuilder.globalType.mutable && !this.disableVerification && !this._resolvedFeatures.has('mutable-globals')) { + throw new VerificationError('Cannot export a mutable global. Enable the mutable-globals feature to allow this.'); } if ( @@ -428,13 +451,23 @@ export default class ModuleBuilder { table: TableBuilder, elements: (FunctionBuilder | ImportBuilder)[], offset?: number | GlobalBuilder | ((asm: any) => void) - ): void { - const segment = new ElementSegmentBuilder(table, elements); + ): ElementSegmentBuilder { + const segment = new ElementSegmentBuilder(table, elements, this._resolvedFeatures); if (offset !== undefined) { segment.offset(offset as any); } this._elements.push(segment); + return segment; + } + + definePassiveElementSegment( + elements: (FunctionBuilder | ImportBuilder)[] + ): ElementSegmentBuilder { + const segment = new ElementSegmentBuilder(null, elements, this._resolvedFeatures); + segment.passive(); + this._elements.push(segment); + return segment; } defineData( @@ -443,7 +476,7 @@ export default class ModuleBuilder { ): DataSegmentBuilder { Arg.instanceOf('data', data, Uint8Array); - const dataSegmentBuilder = new DataSegmentBuilder(data); + const dataSegmentBuilder = new DataSegmentBuilder(data, this._resolvedFeatures); if (offset !== undefined) { dataSegmentBuilder.offset(offset as any); } diff --git a/src/OpCodeEmitter.ts b/src/OpCodeEmitter.ts index b34f709..c0ce765 100644 --- a/src/OpCodeEmitter.ts +++ b/src/OpCodeEmitter.ts @@ -25,6 +25,22 @@ export default abstract class OpCodeEmitter { return this.emit(OpCodes.else); } + try(blockType: any, label?: any): any { + return this.emit(OpCodes.try, blockType, label); + } + + catch(varUInt32: number): any { + return this.emit(OpCodes.catch, varUInt32); + } + + throw(varUInt32: number): any { + return this.emit(OpCodes.throw, varUInt32); + } + + rethrow(varUInt32: number): any { + return this.emit(OpCodes.rethrow, varUInt32); + } + end(): any { return this.emit(OpCodes.end); } @@ -53,6 +69,22 @@ export default abstract class OpCodeEmitter { return this.emit(OpCodes.call_indirect, funcTypeBuilder); } + return_call(functionBuilder: any): any { + return this.emit(OpCodes.return_call, functionBuilder); + } + + return_call_indirect(funcTypeBuilder: any): any { + return this.emit(OpCodes.return_call_indirect, funcTypeBuilder); + } + + delegate(varUInt32: number): any { + return this.emit(OpCodes.delegate, varUInt32); + } + + catch_all(): any { + return this.emit(OpCodes.catch_all); + } + drop(): any { return this.emit(OpCodes.drop); } @@ -1745,5 +1777,353 @@ export default abstract class OpCodeEmitter { return this.emit(OpCodes.f64x2_promote_low_f32x4); } + atomic_notify(alignment: number, offset: number): any { + return this.emit(OpCodes.memory_atomic_notify, alignment, offset); + } + + atomic_wait32(alignment: number, offset: number): any { + return this.emit(OpCodes.memory_atomic_wait32, alignment, offset); + } + + atomic_wait64(alignment: number, offset: number): any { + return this.emit(OpCodes.memory_atomic_wait64, alignment, offset); + } + + atomic_fence(varUInt1: number): any { + return this.emit(OpCodes.atomic_fence, varUInt1); + } + + atomic_load_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_load, alignment, offset); + } + + atomic_load_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_load, alignment, offset); + } + + atomic_load8_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_load8_u, alignment, offset); + } + + atomic_load16_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_load16_u, alignment, offset); + } + + atomic_load8_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_load8_u, alignment, offset); + } + + atomic_load16_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_load16_u, alignment, offset); + } + + atomic_load32_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_load32_u, alignment, offset); + } + + atomic_store_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_store, alignment, offset); + } + + atomic_store_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_store, alignment, offset); + } + + atomic_store8_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_store8, alignment, offset); + } + + atomic_store16_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_store16, alignment, offset); + } + + atomic_store8_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_store8, alignment, offset); + } + + atomic_store16_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_store16, alignment, offset); + } + + atomic_store32_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_store32, alignment, offset); + } + + atomic_rmw_add_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw_add, alignment, offset); + } + + atomic_rmw_add_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw_add, alignment, offset); + } + + atomic_rmw8_add_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw8_add_u, alignment, offset); + } + + atomic_rmw16_add_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw16_add_u, alignment, offset); + } + + atomic_rmw8_add_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw8_add_u, alignment, offset); + } + + atomic_rmw16_add_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw16_add_u, alignment, offset); + } + + atomic_rmw32_add_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw32_add_u, alignment, offset); + } + + atomic_rmw_sub_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw_sub, alignment, offset); + } + + atomic_rmw_sub_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw_sub, alignment, offset); + } + + atomic_rmw8_sub_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw8_sub_u, alignment, offset); + } + + atomic_rmw16_sub_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw16_sub_u, alignment, offset); + } + + atomic_rmw8_sub_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw8_sub_u, alignment, offset); + } + + atomic_rmw16_sub_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw16_sub_u, alignment, offset); + } + + atomic_rmw32_sub_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw32_sub_u, alignment, offset); + } + + atomic_rmw_and_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw_and, alignment, offset); + } + + atomic_rmw_and_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw_and, alignment, offset); + } + + atomic_rmw8_and_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw8_and_u, alignment, offset); + } + + atomic_rmw16_and_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw16_and_u, alignment, offset); + } + + atomic_rmw8_and_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw8_and_u, alignment, offset); + } + + atomic_rmw16_and_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw16_and_u, alignment, offset); + } + + atomic_rmw32_and_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw32_and_u, alignment, offset); + } + + atomic_rmw_or_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw_or, alignment, offset); + } + + atomic_rmw_or_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw_or, alignment, offset); + } + + atomic_rmw8_or_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw8_or_u, alignment, offset); + } + + atomic_rmw16_or_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw16_or_u, alignment, offset); + } + + atomic_rmw8_or_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw8_or_u, alignment, offset); + } + + atomic_rmw16_or_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw16_or_u, alignment, offset); + } + + atomic_rmw32_or_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw32_or_u, alignment, offset); + } + + atomic_rmw_xor_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw_xor, alignment, offset); + } + + atomic_rmw_xor_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw_xor, alignment, offset); + } + + atomic_rmw8_xor_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw8_xor_u, alignment, offset); + } + + atomic_rmw16_xor_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw16_xor_u, alignment, offset); + } + + atomic_rmw8_xor_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw8_xor_u, alignment, offset); + } + + atomic_rmw16_xor_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw16_xor_u, alignment, offset); + } + + atomic_rmw32_xor_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw32_xor_u, alignment, offset); + } + + atomic_rmw_xchg_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw_xchg, alignment, offset); + } + + atomic_rmw_xchg_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw_xchg, alignment, offset); + } + + atomic_rmw8_xchg_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw8_xchg_u, alignment, offset); + } + + atomic_rmw16_xchg_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw16_xchg_u, alignment, offset); + } + + atomic_rmw8_xchg_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw8_xchg_u, alignment, offset); + } + + atomic_rmw16_xchg_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw16_xchg_u, alignment, offset); + } + + atomic_rmw32_xchg_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw32_xchg_u, alignment, offset); + } + + atomic_rmw_cmpxchg_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw_cmpxchg, alignment, offset); + } + + atomic_rmw_cmpxchg_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw_cmpxchg, alignment, offset); + } + + atomic_rmw8_cmpxchg_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw8_cmpxchg_u, alignment, offset); + } + + atomic_rmw16_cmpxchg_u_i32(alignment: number, offset: number): any { + return this.emit(OpCodes.i32_atomic_rmw16_cmpxchg_u, alignment, offset); + } + + atomic_rmw8_cmpxchg_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw8_cmpxchg_u, alignment, offset); + } + + atomic_rmw16_cmpxchg_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw16_cmpxchg_u, alignment, offset); + } + + atomic_rmw32_cmpxchg_u_i64(alignment: number, offset: number): any { + return this.emit(OpCodes.i64_atomic_rmw32_cmpxchg_u, alignment, offset); + } + + relaxed_swizzle_i8x16(): any { + return this.emit(OpCodes.i8x16_relaxed_swizzle); + } + + relaxed_trunc_f32x4_s_i32x4(): any { + return this.emit(OpCodes.i32x4_relaxed_trunc_f32x4_s); + } + + relaxed_trunc_f32x4_u_i32x4(): any { + return this.emit(OpCodes.i32x4_relaxed_trunc_f32x4_u); + } + + relaxed_trunc_f64x2_s_zero_i32x4(): any { + return this.emit(OpCodes.i32x4_relaxed_trunc_f64x2_s_zero); + } + + relaxed_trunc_f64x2_u_zero_i32x4(): any { + return this.emit(OpCodes.i32x4_relaxed_trunc_f64x2_u_zero); + } + + relaxed_madd_f32x4(): any { + return this.emit(OpCodes.f32x4_relaxed_madd); + } + + relaxed_nmadd_f32x4(): any { + return this.emit(OpCodes.f32x4_relaxed_nmadd); + } + + relaxed_madd_f64x2(): any { + return this.emit(OpCodes.f64x2_relaxed_madd); + } + + relaxed_nmadd_f64x2(): any { + return this.emit(OpCodes.f64x2_relaxed_nmadd); + } + + relaxed_laneselect_i8x16(): any { + return this.emit(OpCodes.i8x16_relaxed_laneselect); + } + + relaxed_laneselect_i16x8(): any { + return this.emit(OpCodes.i16x8_relaxed_laneselect); + } + + relaxed_laneselect_i32x4(): any { + return this.emit(OpCodes.i32x4_relaxed_laneselect); + } + + relaxed_laneselect_i64x2(): any { + return this.emit(OpCodes.i64x2_relaxed_laneselect); + } + + relaxed_min_f32x4(): any { + return this.emit(OpCodes.f32x4_relaxed_min); + } + + relaxed_max_f32x4(): any { + return this.emit(OpCodes.f32x4_relaxed_max); + } + + relaxed_min_f64x2(): any { + return this.emit(OpCodes.f64x2_relaxed_min); + } + + relaxed_max_f64x2(): any { + return this.emit(OpCodes.f64x2_relaxed_max); + } + + relaxed_q15mulr_s_i16x8(): any { + return this.emit(OpCodes.i16x8_relaxed_q15mulr_s); + } + + relaxed_dot_i8x16_i7x16_s_i16x8(): any { + return this.emit(OpCodes.i16x8_relaxed_dot_i8x16_i7x16_s); + } + + relaxed_dot_i8x16_i7x16_add_s_i32x4(): any { + return this.emit(OpCodes.i32x4_relaxed_dot_i8x16_i7x16_add_s); + } + abstract emit(opCode: any, ...args: any[]): any; } diff --git a/src/OpCodes.ts b/src/OpCodes.ts index 8ea3a07..1a41c32 100644 --- a/src/OpCodes.ts +++ b/src/OpCodes.ts @@ -38,6 +38,35 @@ const OpCodes = { mnemonic: "else", stackBehavior: "None", }, + "try": { + value: 6, + mnemonic: "try", + immediate: "BlockSignature", + controlFlow: "Push", + stackBehavior: "None", + feature: "exception-handling", + }, + "catch": { + value: 7, + mnemonic: "catch", + immediate: "VarUInt32", + stackBehavior: "None", + feature: "exception-handling", + }, + "throw": { + value: 8, + mnemonic: "throw", + immediate: "VarUInt32", + stackBehavior: "None", + feature: "exception-handling", + }, + "rethrow": { + value: 9, + mnemonic: "rethrow", + immediate: "VarUInt32", + stackBehavior: "None", + feature: "exception-handling", + }, "end": { value: 11, mnemonic: "end", @@ -74,8 +103,6 @@ const OpCodes = { mnemonic: "call", immediate: "Function", stackBehavior: "PopPush", - popOperands: [] as const, - pushOperands: [] as const, }, "call_indirect": { value: 17, @@ -83,7 +110,34 @@ const OpCodes = { immediate: "IndirectFunction", stackBehavior: "PopPush", popOperands: ["Int32"] as const, - pushOperands: [] as const, + }, + "return_call": { + value: 18, + mnemonic: "return_call", + immediate: "Function", + stackBehavior: "PopPush", + feature: "tail-call", + }, + "return_call_indirect": { + value: 19, + mnemonic: "return_call_indirect", + immediate: "IndirectFunction", + stackBehavior: "PopPush", + popOperands: ["Int32"] as const, + feature: "tail-call", + }, + "delegate": { + value: 24, + mnemonic: "delegate", + immediate: "VarUInt32", + stackBehavior: "None", + feature: "exception-handling", + }, + "catch_all": { + value: 25, + mnemonic: "catch_all", + stackBehavior: "None", + feature: "exception-handling", }, "drop": { value: 26, @@ -3611,6 +3665,847 @@ const OpCodes = { prefix: 253, feature: "simd", }, + "memory_atomic_notify": { + value: 0, + mnemonic: "memory.atomic.notify", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "memory_atomic_wait32": { + value: 1, + mnemonic: "memory.atomic.wait32", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32","Int64"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "memory_atomic_wait64": { + value: 2, + mnemonic: "memory.atomic.wait64", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64","Int64"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "atomic_fence": { + value: 3, + mnemonic: "atomic.fence", + immediate: "VarUInt1", + stackBehavior: "None", + prefix: 254, + feature: "threads", + }, + "i32_atomic_load": { + value: 16, + mnemonic: "i32.atomic.load", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_load": { + value: 17, + mnemonic: "i64.atomic.load", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_load8_u": { + value: 18, + mnemonic: "i32.atomic.load8_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_load16_u": { + value: 19, + mnemonic: "i32.atomic.load16_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_load8_u": { + value: 20, + mnemonic: "i64.atomic.load8_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_load16_u": { + value: 21, + mnemonic: "i64.atomic.load16_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_load32_u": { + value: 22, + mnemonic: "i64.atomic.load32_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_store": { + value: 23, + mnemonic: "i32.atomic.store", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32","Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_store": { + value: 24, + mnemonic: "i64.atomic.store", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32","Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_store8": { + value: 25, + mnemonic: "i32.atomic.store8", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32","Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_store16": { + value: 26, + mnemonic: "i32.atomic.store16", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32","Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_store8": { + value: 27, + mnemonic: "i64.atomic.store8", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32","Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_store16": { + value: 28, + mnemonic: "i64.atomic.store16", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32","Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_store32": { + value: 29, + mnemonic: "i64.atomic.store32", + immediate: "MemoryImmediate", + stackBehavior: "Pop", + popOperands: ["Int32","Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw_add": { + value: 30, + mnemonic: "i32.atomic.rmw.add", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw_add": { + value: 31, + mnemonic: "i64.atomic.rmw.add", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw8_add_u": { + value: 32, + mnemonic: "i32.atomic.rmw8.add_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw16_add_u": { + value: 33, + mnemonic: "i32.atomic.rmw16.add_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw8_add_u": { + value: 34, + mnemonic: "i64.atomic.rmw8.add_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw16_add_u": { + value: 35, + mnemonic: "i64.atomic.rmw16.add_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw32_add_u": { + value: 36, + mnemonic: "i64.atomic.rmw32.add_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw_sub": { + value: 37, + mnemonic: "i32.atomic.rmw.sub", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw_sub": { + value: 38, + mnemonic: "i64.atomic.rmw.sub", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw8_sub_u": { + value: 39, + mnemonic: "i32.atomic.rmw8.sub_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw16_sub_u": { + value: 40, + mnemonic: "i32.atomic.rmw16.sub_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw8_sub_u": { + value: 41, + mnemonic: "i64.atomic.rmw8.sub_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw16_sub_u": { + value: 42, + mnemonic: "i64.atomic.rmw16.sub_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw32_sub_u": { + value: 43, + mnemonic: "i64.atomic.rmw32.sub_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw_and": { + value: 44, + mnemonic: "i32.atomic.rmw.and", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw_and": { + value: 45, + mnemonic: "i64.atomic.rmw.and", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw8_and_u": { + value: 46, + mnemonic: "i32.atomic.rmw8.and_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw16_and_u": { + value: 47, + mnemonic: "i32.atomic.rmw16.and_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw8_and_u": { + value: 48, + mnemonic: "i64.atomic.rmw8.and_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw16_and_u": { + value: 49, + mnemonic: "i64.atomic.rmw16.and_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw32_and_u": { + value: 50, + mnemonic: "i64.atomic.rmw32.and_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw_or": { + value: 51, + mnemonic: "i32.atomic.rmw.or", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw_or": { + value: 52, + mnemonic: "i64.atomic.rmw.or", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw8_or_u": { + value: 53, + mnemonic: "i32.atomic.rmw8.or_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw16_or_u": { + value: 54, + mnemonic: "i32.atomic.rmw16.or_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw8_or_u": { + value: 55, + mnemonic: "i64.atomic.rmw8.or_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw16_or_u": { + value: 56, + mnemonic: "i64.atomic.rmw16.or_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw32_or_u": { + value: 57, + mnemonic: "i64.atomic.rmw32.or_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw_xor": { + value: 58, + mnemonic: "i32.atomic.rmw.xor", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw_xor": { + value: 59, + mnemonic: "i64.atomic.rmw.xor", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw8_xor_u": { + value: 60, + mnemonic: "i32.atomic.rmw8.xor_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw16_xor_u": { + value: 61, + mnemonic: "i32.atomic.rmw16.xor_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw8_xor_u": { + value: 62, + mnemonic: "i64.atomic.rmw8.xor_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw16_xor_u": { + value: 63, + mnemonic: "i64.atomic.rmw16.xor_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw32_xor_u": { + value: 64, + mnemonic: "i64.atomic.rmw32.xor_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw_xchg": { + value: 65, + mnemonic: "i32.atomic.rmw.xchg", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw_xchg": { + value: 66, + mnemonic: "i64.atomic.rmw.xchg", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw8_xchg_u": { + value: 67, + mnemonic: "i32.atomic.rmw8.xchg_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw16_xchg_u": { + value: 68, + mnemonic: "i32.atomic.rmw16.xchg_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw8_xchg_u": { + value: 69, + mnemonic: "i64.atomic.rmw8.xchg_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw16_xchg_u": { + value: 70, + mnemonic: "i64.atomic.rmw16.xchg_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw32_xchg_u": { + value: 71, + mnemonic: "i64.atomic.rmw32.xchg_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw_cmpxchg": { + value: 72, + mnemonic: "i32.atomic.rmw.cmpxchg", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw_cmpxchg": { + value: 73, + mnemonic: "i64.atomic.rmw.cmpxchg", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw8_cmpxchg_u": { + value: 74, + mnemonic: "i32.atomic.rmw8.cmpxchg_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i32_atomic_rmw16_cmpxchg_u": { + value: 75, + mnemonic: "i32.atomic.rmw16.cmpxchg_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int32","Int32"] as const, + pushOperands: ["Int32"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw8_cmpxchg_u": { + value: 76, + mnemonic: "i64.atomic.rmw8.cmpxchg_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw16_cmpxchg_u": { + value: 77, + mnemonic: "i64.atomic.rmw16.cmpxchg_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i64_atomic_rmw32_cmpxchg_u": { + value: 78, + mnemonic: "i64.atomic.rmw32.cmpxchg_u", + immediate: "MemoryImmediate", + stackBehavior: "PopPush", + popOperands: ["Int32","Int64","Int64"] as const, + pushOperands: ["Int64"] as const, + prefix: 254, + feature: "threads", + }, + "i8x16_relaxed_swizzle": { + value: 256, + mnemonic: "i8x16.relaxed_swizzle", + stackBehavior: "PopPush", + popOperands: ["V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "i32x4_relaxed_trunc_f32x4_s": { + value: 257, + mnemonic: "i32x4.relaxed_trunc_f32x4_s", + stackBehavior: "PopPush", + popOperands: ["V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "i32x4_relaxed_trunc_f32x4_u": { + value: 258, + mnemonic: "i32x4.relaxed_trunc_f32x4_u", + stackBehavior: "PopPush", + popOperands: ["V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "i32x4_relaxed_trunc_f64x2_s_zero": { + value: 259, + mnemonic: "i32x4.relaxed_trunc_f64x2_s_zero", + stackBehavior: "PopPush", + popOperands: ["V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "i32x4_relaxed_trunc_f64x2_u_zero": { + value: 260, + mnemonic: "i32x4.relaxed_trunc_f64x2_u_zero", + stackBehavior: "PopPush", + popOperands: ["V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "f32x4_relaxed_madd": { + value: 261, + mnemonic: "f32x4.relaxed_madd", + stackBehavior: "PopPush", + popOperands: ["V128","V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "f32x4_relaxed_nmadd": { + value: 262, + mnemonic: "f32x4.relaxed_nmadd", + stackBehavior: "PopPush", + popOperands: ["V128","V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "f64x2_relaxed_madd": { + value: 263, + mnemonic: "f64x2.relaxed_madd", + stackBehavior: "PopPush", + popOperands: ["V128","V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "f64x2_relaxed_nmadd": { + value: 264, + mnemonic: "f64x2.relaxed_nmadd", + stackBehavior: "PopPush", + popOperands: ["V128","V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "i8x16_relaxed_laneselect": { + value: 265, + mnemonic: "i8x16.relaxed_laneselect", + stackBehavior: "PopPush", + popOperands: ["V128","V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "i16x8_relaxed_laneselect": { + value: 266, + mnemonic: "i16x8.relaxed_laneselect", + stackBehavior: "PopPush", + popOperands: ["V128","V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "i32x4_relaxed_laneselect": { + value: 267, + mnemonic: "i32x4.relaxed_laneselect", + stackBehavior: "PopPush", + popOperands: ["V128","V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "i64x2_relaxed_laneselect": { + value: 268, + mnemonic: "i64x2.relaxed_laneselect", + stackBehavior: "PopPush", + popOperands: ["V128","V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "f32x4_relaxed_min": { + value: 269, + mnemonic: "f32x4.relaxed_min", + stackBehavior: "PopPush", + popOperands: ["V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "f32x4_relaxed_max": { + value: 270, + mnemonic: "f32x4.relaxed_max", + stackBehavior: "PopPush", + popOperands: ["V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "f64x2_relaxed_min": { + value: 271, + mnemonic: "f64x2.relaxed_min", + stackBehavior: "PopPush", + popOperands: ["V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "f64x2_relaxed_max": { + value: 272, + mnemonic: "f64x2.relaxed_max", + stackBehavior: "PopPush", + popOperands: ["V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "i16x8_relaxed_q15mulr_s": { + value: 273, + mnemonic: "i16x8.relaxed_q15mulr_s", + stackBehavior: "PopPush", + popOperands: ["V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "i16x8_relaxed_dot_i8x16_i7x16_s": { + value: 274, + mnemonic: "i16x8.relaxed_dot_i8x16_i7x16_s", + stackBehavior: "PopPush", + popOperands: ["V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, + "i32x4_relaxed_dot_i8x16_i7x16_add_s": { + value: 275, + mnemonic: "i32x4.relaxed_dot_i8x16_i7x16_add_s", + stackBehavior: "PopPush", + popOperands: ["V128","V128","V128"] as const, + pushOperands: ["V128"] as const, + prefix: 253, + feature: "relaxed-simd", + }, } as const satisfies Record; export default OpCodes; diff --git a/src/TagBuilder.ts b/src/TagBuilder.ts new file mode 100644 index 0000000..49f311c --- /dev/null +++ b/src/TagBuilder.ts @@ -0,0 +1,37 @@ +import BinaryWriter from './BinaryWriter'; +import FuncTypeBuilder from './FuncTypeBuilder'; +import type ModuleBuilder from './ModuleBuilder'; + +/** + * Represents a WebAssembly exception tag (used with exception-handling proposal). + * A tag is essentially a typed label for exceptions — it has a function type + * describing the parameters it carries. + */ +export default class TagBuilder { + _moduleBuilder: ModuleBuilder; + _funcType: FuncTypeBuilder; + _index: number; + + constructor(moduleBuilder: ModuleBuilder, funcType: FuncTypeBuilder, index: number) { + this._moduleBuilder = moduleBuilder; + this._funcType = funcType; + this._index = index; + } + + get funcType(): FuncTypeBuilder { + return this._funcType; + } + + write(writer: BinaryWriter): void { + // Tag attribute: 0 = exception (only supported kind) + writer.writeVarUInt32(0); + // Type index + writer.writeVarUInt32(this._funcType.index); + } + + toBytes(): Uint8Array { + const buffer = new BinaryWriter(); + this.write(buffer); + return buffer.toArray(); + } +} diff --git a/src/TextModuleWriter.ts b/src/TextModuleWriter.ts index 45351f1..9f54484 100644 --- a/src/TextModuleWriter.ts +++ b/src/TextModuleWriter.ts @@ -31,6 +31,7 @@ export default class TextModuleWriter { this.writeTables(lines, mod); this.writeMemories(lines, mod); this.writeGlobals(lines, mod); + this.writeTags(lines, mod); this.writeExports(lines, mod); this.writeStart(lines, mod); this.writeElements(lines, mod); @@ -248,7 +249,9 @@ export default class TextModuleWriter { mod._memories.forEach((mem) => { const limits = mem._memoryType.resizableLimits; const max = limits.maximum !== null ? ` ${limits.maximum}` : ''; - lines.push(` (memory (;${mem._index};) ${limits.initial}${max})`); + const shared = mem._memoryType.shared ? ' shared' : ''; + const m64 = mem._memoryType.memory64 ? ' i64' : ''; + lines.push(` (memory (;${mem._index};)${m64} ${limits.initial}${max}${shared})`); }); } @@ -275,6 +278,15 @@ export default class TextModuleWriter { }); } + private writeTags(lines: string[], mod: ModuleBuilder): void { + mod._tags.forEach((tag, i) => { + const params = tag._funcType.parameterTypes.map((p) => p.name).join(' '); + let sig = ''; + if (params.length > 0) sig = ` (param ${params})`; + lines.push(` (tag (;${i};) (type ${tag._funcType.index})${sig})`); + }); + } + private writeExports(lines: string[], mod: ModuleBuilder): void { mod._exports.forEach((exp) => { let kindName = ''; @@ -305,6 +317,19 @@ export default class TextModuleWriter { private writeElements(lines: string[], mod: ModuleBuilder): void { mod._elements.forEach((elem, i) => { + const funcIndices = elem._functions + .map((f) => { + if (f instanceof FunctionBuilder) return f._index; + if (f instanceof ImportBuilder) return f.index; + return 0; + }) + .join(' '); + + if (elem._passive) { + lines.push(` (elem (;${i};) func ${funcIndices})`); + return; + } + let offsetExpr = ''; if (elem._initExpressionEmitter) { const instrs = elem._initExpressionEmitter._instructions; @@ -318,20 +343,24 @@ export default class TextModuleWriter { } } - const funcIndices = elem._functions - .map((f) => { - if (f instanceof FunctionBuilder) return f._index; - if (f instanceof ImportBuilder) return f.index; - return 0; - }) - .join(' '); - - lines.push(` (elem (;${i};) (${offsetExpr}) func ${funcIndices})`); + const tableIndex = elem._table ? elem._table._index : 0; + if (tableIndex !== 0) { + lines.push(` (elem (;${i};) (table ${tableIndex}) (${offsetExpr}) func ${funcIndices})`); + } else { + lines.push(` (elem (;${i};) (${offsetExpr}) func ${funcIndices})`); + } }); } private writeData(lines: string[], mod: ModuleBuilder): void { mod._data.forEach((seg, i) => { + const dataStr = this.bytesToWatString(seg._data); + + if (seg._passive) { + lines.push(` (data (;${i};) "${dataStr}")`); + return; + } + let offsetExpr = ''; if (seg._initExpressionEmitter) { const instrs = seg._initExpressionEmitter._instructions; @@ -345,8 +374,11 @@ export default class TextModuleWriter { } } - const dataStr = this.bytesToWatString(seg._data); - lines.push(` (data (;${i};) (${offsetExpr}) "${dataStr}")`); + if (seg._memoryIndex !== 0) { + lines.push(` (data (;${i};) (memory ${seg._memoryIndex}) (${offsetExpr}) "${dataStr}")`); + } else { + lines.push(` (data (;${i};) (${offsetExpr}) "${dataStr}")`); + } }); } diff --git a/src/types.ts b/src/types.ts index 4e91355..122eeea 100644 --- a/src/types.ts +++ b/src/types.ts @@ -94,6 +94,8 @@ export const SectionType = { Element: { name: 'Element', value: 9 } as const, Code: { name: 'Code', value: 10 } as const, Data: { name: 'Data', value: 11 } as const, + DataCount: { name: 'DataCount', value: 12 } as const, + Tag: { name: 'Tag', value: 13 } as const, createCustom(name: string): SectionTypeDescriptor { return { name, value: 0 }; }, @@ -148,12 +150,22 @@ export type WasmFeature = | 'bulk-memory' | 'reference-types' | 'simd' - | 'multi-value'; + | 'multi-value' + | 'mutable-globals' + | 'tail-call' + | 'extended-const' + | 'threads' + | 'exception-handling' + | 'multi-memory' + | 'multi-table' + | 'relaxed-simd' + | 'memory64' + | 'gc'; /** * WASM version targets. Each target enables a set of features. */ -export type WasmTarget = 'mvp' | '2.0' | 'latest'; +export type WasmTarget = 'mvp' | '2.0' | '3.0' | 'latest'; /** * Options for module building. diff --git a/src/verification/OperandStackVerifier.ts b/src/verification/OperandStackVerifier.ts index 5a75025..163c42a 100644 --- a/src/verification/OperandStackVerifier.ts +++ b/src/verification/OperandStackVerifier.ts @@ -285,7 +285,7 @@ export default class OperandStackVerifier { _getFuncType(opCode: OpCodeDef, immediate: Immediate | null): FuncTypeBuilder | null { let funcType: FuncTypeBuilder | null = null; - if (opCode === (OpCodes as any).call) { + if (opCode === (OpCodes as any).call || opCode === (OpCodes as any).return_call) { if (immediate!.values[0] instanceof ImportBuilder) { funcType = immediate!.values[0].data as FuncTypeBuilder; } else if (immediate!.values[0] && 'funcTypeBuilder' in immediate!.values[0]) { @@ -293,7 +293,7 @@ export default class OperandStackVerifier { } else { throw new VerificationError('Error getting funcType for call, invalid immediate.'); } - } else if (opCode === (OpCodes as any).call_indirect) { + } else if (opCode === (OpCodes as any).call_indirect || opCode === (OpCodes as any).return_call_indirect) { if (immediate!.values[0] instanceof FuncTypeBuilder) { funcType = immediate!.values[0]; } else { diff --git a/tests/AdvancedOps.test.ts b/tests/AdvancedOps.test.ts new file mode 100644 index 0000000..7cadd3c --- /dev/null +++ b/tests/AdvancedOps.test.ts @@ -0,0 +1,348 @@ +import { BlockType, ModuleBuilder, ValueType } from '../src/index'; +import TestHelper from './TestHelper'; + +describe('tee_local', () => { + test('stores value and leaves it on stack', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Int32, [], (asm) => { + const local = asm.declareLocal(ValueType.Int32, 'x'); + asm.const_i32(42); + asm.tee_local(local); // stores 42 to local, leaves 42 on stack + // stack has 42, local has 42 — drop the stack value, push local + asm.drop(); + asm.get_local(local); + asm.end(); + }); + expect(fn()).toBe(42); + }); + + test('in loop — increment and use in same expression', async () => { + // sum = 0; for i=1..5: sum += i using tee_local + const mod = new ModuleBuilder('test'); + mod.defineFunction('test', [ValueType.Int32], [], (f, a) => { + const sum = a.declareLocal(ValueType.Int32, 'sum'); + const i = a.declareLocal(ValueType.Int32, 'i'); + + a.const_i32(0); + a.set_local(sum); + a.const_i32(1); + a.set_local(i); + + a.loop(BlockType.Void, (cont) => { + a.block(BlockType.Void, (brk) => { + a.get_local(i); + a.const_i32(5); + a.gt_i32(); + a.br_if(brk); + + a.get_local(sum); + a.get_local(i); + a.tee_local(i); // tee to use i in add AND keep for increment + a.add_i32(); + a.set_local(sum); + + a.get_local(i); + a.const_i32(1); + a.add_i32(); + a.set_local(i); + a.br(cont); + }); + }); + + a.get_local(sum); + }).withExport(); + + const instance = await mod.instantiate(); + const test = instance.instance.exports.test as CallableFunction; + expect(test()).toBe(15); // 1+2+3+4+5 + }); + + test('with f64 type', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Float64, [], (asm) => { + const local = asm.declareLocal(ValueType.Float64, 'x'); + asm.const_f64(3.14); + asm.tee_local(local); + asm.end(); + }); + expect(fn()).toBeCloseTo(3.14); + }); +}); + +describe('drop', () => { + test('discards top of stack', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Int32, [], (asm) => { + asm.const_i32(100); // this stays + asm.const_i32(999); // this gets dropped + asm.drop(); + asm.end(); + }); + expect(fn()).toBe(100); + }); + + test('after call that returns unwanted value', async () => { + const mod = new ModuleBuilder('test'); + const helper = mod.defineFunction('helper', [ValueType.Int32], [], (f, a) => { + a.const_i32(999); + }); + + mod.defineFunction('test', [ValueType.Int32], [], (f, a) => { + a.call(helper); + a.drop(); + a.const_i32(42); + }).withExport(); + + const instance = await mod.instantiate(); + const test = instance.instance.exports.test as CallableFunction; + expect(test()).toBe(42); + }); +}); + +describe('mem_grow / mem_size', () => { + test('mem_size returns initial page count', async () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(2); + mod.defineFunction('test', [ValueType.Int32], [], (f, a) => { + a.mem_size(0); + }).withExport(); + + const instance = await mod.instantiate(); + const test = instance.instance.exports.test as CallableFunction; + expect(test()).toBe(2); + }); + + test('mem_grow adds pages and returns previous size', async () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + mod.defineFunction('grow', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.mem_grow(0); + }).withExport(); + + mod.defineFunction('size', [ValueType.Int32], [], (f, a) => { + a.mem_size(0); + }).withExport(); + + const instance = await mod.instantiate(); + const { grow, size } = instance.instance.exports as any; + expect(size()).toBe(1); + expect(grow(3)).toBe(1); // returns previous size + expect(size()).toBe(4); + }); + + test('mem_grow returns -1 on failure', async () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 2); // max 2 pages + mod.defineFunction('grow', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.mem_grow(0); + }).withExport(); + + const instance = await mod.instantiate(); + const grow = instance.instance.exports.grow as CallableFunction; + expect(grow(10)).toBe(-1); // exceeds maximum + }); + + test('read/write to newly grown memory', async () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + mod.defineFunction('grow', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.mem_grow(0); + }).withExport(); + + mod.defineFunction('store', null, [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0); + }).withExport(); + + mod.defineFunction('load', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0); + }).withExport(); + + const instance = await mod.instantiate(); + const { grow, store, load } = instance.instance.exports as any; + grow(1); + // Write to second page (offset 65536) + store(65536, 12345); + expect(load(65536)).toBe(12345); + }); +}); + +describe('unreachable', () => { + test('traps at runtime', async () => { + const fn = await TestHelper.compileFunction('test', null, [], (asm) => { + asm.unreachable(); + asm.end(); + }); + expect(() => fn()).toThrow(); + }); + + test('does not trap when branch skips it', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('test', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.eqz_i32(); + a.if(BlockType.Void, () => { + a.unreachable(); + }); + a.const_i32(42); + }).withExport(); + + const instance = await mod.instantiate(); + const test = instance.instance.exports.test as CallableFunction; + expect(test(1)).toBe(42); // doesn't trap — branch not taken + expect(() => test(0)).toThrow(); // traps — branch taken + }); +}); + +describe('reinterpret', () => { + test('f32 to i32 (known pattern: 1.0f = 0x3F800000)', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Int32, [], (asm) => { + asm.const_f32(1.0); + asm.reinterpret_f32_i32(); + asm.end(); + }); + expect(fn() >>> 0).toBe(0x3F800000); + }); + + test('i32 to f32 (known pattern: 0x3F800000 = 1.0f)', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Float32, [], (asm) => { + asm.const_i32(0x3F800000); + asm.reinterpret_i32_f32(); + asm.end(); + }); + expect(fn()).toBe(1.0); + }); + + test('f64 to i64 and back (round-trip)', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Float64, [], (asm) => { + asm.const_f64(3.14); + asm.reinterpret_f64_i64(); + asm.reinterpret_i64_f64(); + asm.end(); + }); + expect(fn()).toBeCloseTo(3.14); + }); + + test('preserves zero exactly', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Int32, [], (asm) => { + asm.const_f32(0.0); + asm.reinterpret_f32_i32(); + asm.end(); + }); + expect(fn()).toBe(0); + }); +}); + +describe('copysign', () => { + test('f64 copies sign from second to first', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Float64, + [ValueType.Float64, ValueType.Float64], (asm) => { + asm.get_local(0); + asm.get_local(1); + asm.copysign_f64(); + asm.end(); + }); + expect(fn(5.0, -1.0)).toBe(-5.0); + expect(fn(-5.0, 1.0)).toBe(5.0); + expect(fn(3.0, 3.0)).toBe(3.0); + }); + + test('f32 with negative/positive combinations', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Float32, + [ValueType.Float32, ValueType.Float32], (asm) => { + asm.get_local(0); + asm.get_local(1); + asm.copysign_f32(); + asm.end(); + }); + expect(fn(5.0, -1.0)).toBeCloseTo(-5.0); + expect(fn(-5.0, 1.0)).toBeCloseTo(5.0); + }); +}); + +describe('nearest', () => { + test('f64 rounds to nearest even', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Float64, + [ValueType.Float64], (asm) => { + asm.get_local(0); + asm.nearest_f64(); + asm.end(); + }); + expect(fn(0.5)).toBe(0.0); // banker's rounding: 0.5 → 0 + expect(fn(1.5)).toBe(2.0); // 1.5 → 2 + expect(fn(2.5)).toBe(2.0); // 2.5 → 2 + expect(fn(3.5)).toBe(4.0); // 3.5 → 4 + expect(fn(2.3)).toBe(2.0); + expect(fn(-1.7)).toBe(-2.0); + }); +}); + +describe('bitwise rotation', () => { + test('rotl_i32 rotates bits left', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Int32, + [ValueType.Int32, ValueType.Int32], (asm) => { + asm.get_local(0); + asm.get_local(1); + asm.rotl_i32(); + asm.end(); + }); + expect(fn(1, 1)).toBe(2); + expect(fn(1, 10)).toBe(1024); + expect(fn(0x80000000 | 0, 1) >>> 0).toBe(1); // high bit wraps to low + }); + + test('rotr_i32 rotates bits right', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Int32, + [ValueType.Int32, ValueType.Int32], (asm) => { + asm.get_local(0); + asm.get_local(1); + asm.rotr_i32(); + asm.end(); + }); + expect(fn(2, 1)).toBe(1); + expect(fn(1, 1) >>> 0).toBe(0x80000000); // low bit wraps to high + }); +}); + +describe('bit counting', () => { + test('clz_i32 counts leading zeros', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Int32, + [ValueType.Int32], (asm) => { + asm.get_local(0); + asm.clz_i32(); + asm.end(); + }); + expect(fn(1)).toBe(31); + expect(fn(0)).toBe(32); + expect(fn(256)).toBe(23); + expect(fn(0x80000000 | 0)).toBe(0); + }); + + test('ctz_i32 counts trailing zeros', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Int32, + [ValueType.Int32], (asm) => { + asm.get_local(0); + asm.ctz_i32(); + asm.end(); + }); + expect(fn(1)).toBe(0); + expect(fn(256)).toBe(8); + expect(fn(0)).toBe(32); + expect(fn(0x80000000 | 0)).toBe(31); + }); + + test('popcnt_i32 counts set bits', async () => { + const fn = await TestHelper.compileFunction('test', ValueType.Int32, + [ValueType.Int32], (asm) => { + asm.get_local(0); + asm.popcnt_i32(); + asm.end(); + }); + expect(fn(0)).toBe(0); + expect(fn(0xFF)).toBe(8); + expect(fn(0x55555555)).toBe(16); + expect(fn(-1)).toBe(32); // all bits set + }); +}); diff --git a/tests/BinaryFormat.test.ts b/tests/BinaryFormat.test.ts index 8e58860..d86f41a 100644 --- a/tests/BinaryFormat.test.ts +++ b/tests/BinaryFormat.test.ts @@ -1,4 +1,19 @@ -import { ModuleBuilder, BinaryReader, ValueType, ElementType } from '../src/index'; +import { + ModuleBuilder, + BinaryReader, + ValueType, + ElementType, + ElementSegmentBuilder, + Instruction, + LocalBuilder, + LabelBuilder, + ResizableLimits, + GlobalType, + MemoryType, + TableType, +} from '../src/index'; +import BinaryWriter from '../src/BinaryWriter'; +import OpCodes from '../src/OpCodes'; test('Binary Format - magic header and version', () => { const mod = new ModuleBuilder('empty'); @@ -149,3 +164,184 @@ test('Binary Format - section ordering', () => { expect(standardSections).toContain(7); // Export expect(standardSections).toContain(10); // Code }); + +describe('ElementSegmentBuilder', () => { + test('unsupported offset type throws', () => { + const mod = new ModuleBuilder('test'); + const table = mod.defineTable(ElementType.AnyFunc, 1); + const fn = mod.defineFunction('f', null, [], (f, a) => {}); + const seg = new ElementSegmentBuilder(table, [fn]); + expect(() => (seg as any).offset(true)).toThrow('Unsupported offset'); + }); + + test('write() without init expression throws', () => { + const mod = new ModuleBuilder('test'); + const table = mod.defineTable(ElementType.AnyFunc, 1); + const fn = mod.defineFunction('f', null, [], (f, a) => {}); + const seg = new ElementSegmentBuilder(table, [fn]); + const writer = new BinaryWriter(); + expect(() => seg.write(writer)).toThrow('initialization expression was not defined'); + }); + + test('toBytes() with ImportBuilder function entries', () => { + const mod = new ModuleBuilder('test'); + const table = mod.defineTable(ElementType.AnyFunc, 2); + const imp = mod.importFunction('env', 'log', null, [ValueType.Int32]); + const fn = mod.defineFunction('f', null, [], (f, a) => {}); + const seg = new ElementSegmentBuilder(table, [imp, fn]); + seg.offset(0); + const bytes = seg.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(bytes.length).toBeGreaterThan(0); + }); +}); + +describe('Builder toBytes()', () => { + test('ExportBuilder toBytes()', () => { + const mod = new ModuleBuilder('test'); + const fn = mod.defineFunction('f', null, [], (f, a) => {}); + const exp = mod.exportFunction(fn, 'f'); + const bytes = exp.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(bytes.length).toBeGreaterThan(0); + }); + + test('ImportBuilder toBytes()', () => { + const mod = new ModuleBuilder('test'); + const imp = mod.importFunction('env', 'log', null, [ValueType.Int32]); + const bytes = imp.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(bytes.length).toBeGreaterThan(0); + }); + + test('CustomSectionBuilder toBytes()', () => { + const mod = new ModuleBuilder('test'); + const cs = mod.defineCustomSection('mySection', new Uint8Array([0xDE, 0xAD])); + const bytes = cs.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(bytes.length).toBeGreaterThan(0); + }); + + test('Instruction toBytes()', () => { + const instr = new Instruction(OpCodes.nop, null); + const bytes = instr.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(bytes.length).toBeGreaterThan(0); + }); + + test('LocalBuilder toBytes()', () => { + const local = new LocalBuilder(ValueType.Int32, null, 0, 1); + const bytes = local.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + }); + + test('LabelBuilder properties', () => { + const label = new LabelBuilder(); + expect(label.isResolved).toBe(false); + expect(label.block).toBeNull(); + }); + + test('ResizableLimits toBytes()', () => { + const limits = new ResizableLimits(1, 10); + const bytes = limits.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(bytes.length).toBeGreaterThan(0); + }); + + test('GlobalType toBytes()', () => { + const gt = new GlobalType(ValueType.Int32, true); + const bytes = gt.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(gt.mutable).toBe(true); + expect(gt.valueType).toBe(ValueType.Int32); + }); + + test('MemoryType toBytes()', () => { + const mt = new MemoryType(new ResizableLimits(1, 16)); + const bytes = mt.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + }); + + test('TableType toBytes()', () => { + const tt = new TableType(ElementType.AnyFunc, new ResizableLimits(1, 10)); + const bytes = tt.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + }); +}); + +describe('ElementSegmentBuilder offsets', () => { + test('Callback offset for element segment', async () => { + const mod = new ModuleBuilder('test'); + const fn1 = mod.defineFunction('fn1', [ValueType.Int32], [], (f, a) => { + a.const_i32(10); + }); + const fn2 = mod.defineFunction('fn2', [ValueType.Int32], [], (f, a) => { + a.const_i32(20); + }); + const table = mod.defineTable(ElementType.AnyFunc, 4, 4); + // Use callback to set offset to 1 + mod.defineTableSegment(table, [fn1, fn2], (asm: any) => { + asm.const_i32(1); + }); + const funcType = mod.defineFuncType([ValueType.Int32], []); + mod.defineFunction('dispatch', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(0); + a.call_indirect(funcType); + }).withExport(); + + const instance = await mod.instantiate(); + const exports = instance.instance.exports as any; + // fn1 is at table index 1, fn2 at table index 2 + expect(exports.dispatch(1)).toBe(10); + expect(exports.dispatch(2)).toBe(20); + }); + + test('createInitEmitter called twice throws', () => { + const mod = new ModuleBuilder('test'); + const fn = mod.defineFunction('fn', null, [], (f, a) => {}); + const table = mod.defineTable(ElementType.AnyFunc, 1, 1); + const seg = new ElementSegmentBuilder(table, [fn]); + seg.createInitEmitter((asm) => { + asm.const_i32(0); + }); + expect(() => { + seg.createInitEmitter((asm) => { + asm.const_i32(0); + }); + }).toThrow('Initialization expression emitter has already been created.'); + }); + + test('Element segment runtime verification - table.get to read back entries', async () => { + const mod = new ModuleBuilder('test'); + const fn1 = mod.defineFunction('fn1', [ValueType.Int32], [], (f, a) => { + a.const_i32(100); + }); + const fn2 = mod.defineFunction('fn2', [ValueType.Int32], [], (f, a) => { + a.const_i32(200); + }); + const table = mod.defineTable(ElementType.AnyFunc, 2, 2); + table.withExport('tbl'); + table.defineTableSegment([fn1, fn2], 0); + + // Also export functions so we can verify via indirect call + const funcType = mod.defineFuncType([ValueType.Int32], []); + mod.defineFunction('callAt', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(0); + a.call_indirect(funcType); + }).withExport(); + + const instance = await mod.instantiate(); + const exports = instance.instance.exports as any; + // Verify via indirect call + expect(exports.callAt(0)).toBe(100); + expect(exports.callAt(1)).toBe(200); + + // Verify table export exists + const tbl = exports.tbl as WebAssembly.Table; + expect(tbl).toBeDefined(); + expect(tbl.length).toBe(2); + // table.get returns a wrapped function + expect(tbl.get(0)!()).toBe(100); + expect(tbl.get(1)!()).toBe(200); + }); +}); diff --git a/tests/BinaryReader.test.ts b/tests/BinaryReader.test.ts index 2ec514d..bedb8ca 100644 --- a/tests/BinaryReader.test.ts +++ b/tests/BinaryReader.test.ts @@ -156,3 +156,202 @@ test('BinaryReader - roundtrip validates', async () => { expect(info.globals.length).toBe(1); expect(info.exports.length).toBe(2); }); + +describe('BinaryReader validation', () => { + test('invalid magic header throws', () => { + const buf = new Uint8Array([0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00]); + const reader = new BinaryReader(buf); + expect(() => reader.read()).toThrow('Invalid WASM magic header'); + }); + + test('table section roundtrip', () => { + const mod = new ModuleBuilder('test'); + mod.defineTable(ElementType.AnyFunc, 1, 10); + const bytes = mod.toBytes(); + const reader = new BinaryReader(bytes); + const info = reader.read(); + expect(info.tables.length).toBe(1); + expect(info.tables[0].initial).toBe(1); + expect(info.tables[0].maximum).toBe(10); + }); + + test('data section roundtrip', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + mod.defineData(new Uint8Array([0x48, 0x65, 0x6C, 0x6C, 0x6F]), 0); + const bytes = mod.toBytes(); + const reader = new BinaryReader(bytes); + const info = reader.read(); + expect(info.data.length).toBe(1); + expect(info.data[0].data).toEqual(new Uint8Array([0x48, 0x65, 0x6C, 0x6C, 0x6F])); + }); + + test('custom section roundtrip', () => { + const mod = new ModuleBuilder('test', { generateNameSection: false }); + mod.defineCustomSection('mydata', new Uint8Array([0xCA, 0xFE])); + const bytes = mod.toBytes(); + const reader = new BinaryReader(bytes); + const info = reader.read(); + const custom = info.customSections.find(s => s.name === 'mydata'); + expect(custom).toBeDefined(); + expect(custom!.data).toEqual(new Uint8Array([0xCA, 0xFE])); + }); + + test('start section roundtrip', () => { + const mod = new ModuleBuilder('test'); + const fn = mod.defineFunction('init', null, [], (f, a) => {}); + mod.setStartFunction(fn); + const bytes = mod.toBytes(); + const reader = new BinaryReader(bytes); + const info = reader.read(); + expect(info.start).toBe(fn._index); + }); +}); + +describe('BinaryReader roundtrips', () => { + test('Unsupported WASM version throws', () => { + // WASM magic: 0x00 0x61 0x73 0x6d (little-endian: 0x6d736100) + // Version 2 (little-endian): 0x02 0x00 0x00 0x00 + const bytes = new Uint8Array([0x00, 0x61, 0x73, 0x6d, 0x02, 0x00, 0x00, 0x00]); + const reader = new BinaryReader(bytes); + expect(() => reader.read()).toThrow('Unsupported WASM version: 2'); + }); + + test('Import section with table kind roundtrip', () => { + const mod = new ModuleBuilder('test'); + mod.importTable('env', 'tbl', ElementType.AnyFunc, 2, 8); + mod.defineFunction('noop', null, [], (f, a) => {}).withExport(); + const bytes = mod.toBytes(); + + const reader = new BinaryReader(bytes); + const info = reader.read(); + const tableImport = info.imports.find((i) => i.kind === 1); + expect(tableImport).toBeDefined(); + expect(tableImport!.moduleName).toBe('env'); + expect(tableImport!.fieldName).toBe('tbl'); + expect(tableImport!.tableType).toBeDefined(); + expect(tableImport!.tableType!.initial).toBe(2); + expect(tableImport!.tableType!.maximum).toBe(8); + // elementType for anyfunc is 0x70, which is -16 when read as signed varint7 + expect(tableImport!.tableType!.elementType).toBe(-16); + }); + + test('Import section with memory kind roundtrip', () => { + const mod = new ModuleBuilder('test'); + mod.importMemory('env', 'mem', 1, 16); + mod.defineFunction('noop', null, [], (f, a) => {}).withExport(); + const bytes = mod.toBytes(); + + const reader = new BinaryReader(bytes); + const info = reader.read(); + const memImport = info.imports.find((i) => i.kind === 2); + expect(memImport).toBeDefined(); + expect(memImport!.moduleName).toBe('env'); + expect(memImport!.fieldName).toBe('mem'); + expect(memImport!.memoryType).toBeDefined(); + expect(memImport!.memoryType!.initial).toBe(1); + expect(memImport!.memoryType!.maximum).toBe(16); + }); + + test('Import section with global kind roundtrip', () => { + const mod = new ModuleBuilder('test'); + mod.importGlobal('env', 'g', ValueType.Int32, true); + mod.defineFunction('noop', null, [], (f, a) => {}).withExport(); + const bytes = mod.toBytes(); + + const reader = new BinaryReader(bytes); + const info = reader.read(); + const globalImport = info.imports.find((i) => i.kind === 3); + expect(globalImport).toBeDefined(); + expect(globalImport!.moduleName).toBe('env'); + expect(globalImport!.fieldName).toBe('g'); + expect(globalImport!.globalType).toBeDefined(); + // i32 is encoded as 0x7f (or signed -1) + expect(globalImport!.globalType!.valueType).toBe(-1); + expect(globalImport!.globalType!.mutable).toBe(true); + }); + + test('Element section roundtrip', () => { + const mod = new ModuleBuilder('test'); + const fn1 = mod.defineFunction('fn1', [ValueType.Int32], [], (f, a) => { + a.const_i32(1); + }); + const fn2 = mod.defineFunction('fn2', [ValueType.Int32], [], (f, a) => { + a.const_i32(2); + }); + const fn3 = mod.defineFunction('fn3', [ValueType.Int32], [], (f, a) => { + a.const_i32(3); + }); + const table = mod.defineTable(ElementType.AnyFunc, 3, 3); + table.defineTableSegment([fn1, fn2, fn3], 0); + mod.defineFunction('noop', null, [], (f, a) => {}).withExport(); + const bytes = mod.toBytes(); + + const reader = new BinaryReader(bytes); + const info = reader.read(); + expect(info.elements).toHaveLength(1); + expect(info.elements[0].tableIndex).toBe(0); + expect(info.elements[0].functionIndices).toEqual([ + fn1._index, + fn2._index, + fn3._index, + ]); + }); + + test('Name section with local names roundtrip', () => { + const mod = new ModuleBuilder('localMod'); + const fn = mod.defineFunction( + 'myFunc', + ValueType.Int32, + [ValueType.Int32, ValueType.Int32], + (f, a) => { + a.const_i32(0); + } + ); + fn.parameters[0].withName('x'); + fn.parameters[1].withName('y'); + + // Also add a named local + const fn2 = mod.defineFunction('myFunc2', null, []); + const asm = fn2.createEmitter(); + asm.declareLocal(ValueType.Int32, 'counter'); + asm.end(); + + const bytes = mod.toBytes(); + const reader = new BinaryReader(bytes); + const info = reader.read(); + + expect(info.nameSection).toBeDefined(); + expect(info.nameSection!.localNames).toBeDefined(); + const localNames = info.nameSection!.localNames!; + + // fn has params x and y + const fnLocals = localNames.get(fn._index); + expect(fnLocals).toBeDefined(); + expect(fnLocals!.get(0)).toBe('x'); + expect(fnLocals!.get(1)).toBe('y'); + + // fn2 has local 'counter' + const fn2Locals = localNames.get(fn2._index); + expect(fn2Locals).toBeDefined(); + expect(fn2Locals!.get(0)).toBe('counter'); + }); + + test('Name section with global names roundtrip', () => { + const mod = new ModuleBuilder('globalMod'); + const g1 = mod.defineGlobal(ValueType.Int32, false, 10); + g1.withName('alpha'); + const g2 = mod.defineGlobal(ValueType.Float64, false, 3.14); + g2.withName('beta'); + + const bytes = mod.toBytes(); + const reader = new BinaryReader(bytes); + const info = reader.read(); + + expect(info.nameSection).toBeDefined(); + expect(info.nameSection!.globalNames).toBeDefined(); + const globalNames = info.nameSection!.globalNames!; + expect(globalNames.get(g1._index)).toBe('alpha'); + expect(globalNames.get(g2._index)).toBe('beta'); + }); +}); diff --git a/tests/BinaryWriter.test.ts b/tests/BinaryWriter.test.ts index 86e47d1..3ad4f05 100644 --- a/tests/BinaryWriter.test.ts +++ b/tests/BinaryWriter.test.ts @@ -117,3 +117,33 @@ test('writeBytes from Uint8Array', () => { w.writeBytes(new Uint8Array([10, 20, 30])); expect(Array.from(w.toArray())).toEqual([10, 20, 30]); }); + +describe('BinaryWriter encoding', () => { + test('writeString with UTF-8 characters', () => { + const writer = new BinaryWriter(); + writer.writeString('café'); + const bytes = writer.toArray(); + expect(bytes.length).toBeGreaterThan(4); // UTF-8 'é' is 2 bytes + }); + + test('writeVarInt64 with negative bigint', () => { + const writer = new BinaryWriter(); + writer.writeVarInt64(-1n); + const bytes = writer.toArray(); + expect(bytes.length).toBeGreaterThan(0); + }); + + test('writeVarInt64 with large positive bigint', () => { + const writer = new BinaryWriter(); + writer.writeVarInt64(0x7FFFFFFFFFFFFFFFn); + const bytes = writer.toArray(); + expect(bytes.length).toBeGreaterThan(0); + }); + + test('writeVarUInt32 with max safe value', () => { + const writer = new BinaryWriter(); + writer.writeVarUInt32(0xFFFFFFFF); + const bytes = writer.toArray(); + expect(bytes.length).toBe(5); // Max 5 bytes for 32-bit varuint + }); +}); diff --git a/tests/ControlVerification.test.ts b/tests/ControlVerification.test.ts index 47404f0..206148b 100644 --- a/tests/ControlVerification.test.ts +++ b/tests/ControlVerification.test.ts @@ -93,3 +93,599 @@ test('Control Verification - if/else with non-void block', async () => { expect(fn(1)).toBe(1); expect(fn(0)).toBe(0); }); + +describe('ControlFlowVerifier label paths', () => { + test('defineLabel used with block', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('labelBlock', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.if(BlockType.Int32); + a.const_i32(1); + a.else(); + a.const_i32(0); + a.end(); + }).withExport(); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); + + test('unresolved labels cause verification error', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('bad', null, [], (f, a) => { + // Access private verifier to define a label that never gets used + const cfv = (a as any)._controlFlowVerifier; + cfv.defineLabel(); + // label is unresolved but has been given a block reference by defineLabel + // Actually: defineLabel just creates an unresolved label, no block + // verify() should NOT throw because x.block is null for plain defineLabel + }); + }).not.toThrow(); + }); +}); + +describe('Multiple unclosed blocks', () => { + test('opening 3 blocks and only closing 1 should throw about multiple unclosed structures', () => { + // With 3 inner blocks, closing 1 + function end leaves stack length 2, + // which triggers the "control structures" error message. + expect(() => { + const mod = new ModuleBuilder('test'); + const fn = mod.defineFunction('fn', null, []); + const asm = fn.createEmitter(); + + asm.block(BlockType.Void); + asm.block(BlockType.Void); + asm.block(BlockType.Void); + // Only close 1 of the 3 inner blocks + asm.end(); + // Close function body + asm.end(); + mod.toBytes(); + }).toThrow(/control structures/i); + }); + + test('opening 2 blocks with none closed triggers missing end error', () => { + // With 2 inner blocks, closing 0 inner + function end leaves stack length 2, + // which triggers the "control structures" error message. + expect(() => { + const mod = new ModuleBuilder('test'); + const fn = mod.defineFunction('fn', null, []); + const asm = fn.createEmitter(); + + asm.block(BlockType.Void); + asm.block(BlockType.Void); + // Close only the function body, no inner blocks closed + asm.end(); + mod.toBytes(); + }).toThrow(/control structures/i); + }); + + test('single unclosed block reports missing closing end', () => { + // With 1 inner block, closing 0 inner + function end leaves stack length 1, + // which triggers "missing closing end instruction". + expect(() => { + const mod = new ModuleBuilder('test'); + const fn = mod.defineFunction('fn', null, []); + const asm = fn.createEmitter(); + + asm.block(BlockType.Void); + asm.end(); // closes function body only + mod.toBytes(); + }).toThrow(/missing closing end/i); + }); +}); + +describe('Control flow stack empty on end', () => { + test('calling end when there is no open block should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + const fn = mod.defineFunction('fn', null, []); + const asm = fn.createEmitter(); + asm.end(); // close function body (control flow stack now empty) + asm.end(); // nothing left to close + }).toThrow(); + }); + + test('extra end after closing all blocks should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + const fn = mod.defineFunction('fn', null, []); + const asm = fn.createEmitter(); + asm.block(BlockType.Void); + asm.end(); // close block + asm.end(); // close function body + asm.end(); // nothing left -- should throw + }).toThrow(); + }); +}); + +describe('if/else type mismatch', () => { + test('if branch leaves wrong type for block result should throw at else', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', null, [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.if(BlockType.Int32); + a.const_f64(3.14); // f64 instead of expected i32 + a.else(); + a.const_i32(0); + a.end(); + a.drop(); + }); + mod.toBytes(); + }).toThrow(); + }); + + test('if branch with empty stack for non-void block should throw at else', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', null, [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.if(BlockType.Int32); + // nothing pushed in if-branch but block expects i32 + a.else(); + a.const_i32(0); + a.end(); + a.drop(); + }); + mod.toBytes(); + }).toThrow(); + }); + + test('valid if/else with matching types should pass', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.if(BlockType.Int32); + a.const_i32(1); + a.else(); + a.const_i32(0); + a.end(); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); + + test('valid if/else with f64 result type', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Float64], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.if(BlockType.Float64); + a.const_f64(1.5); + a.else(); + a.const_f64(2.5); + a.end(); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn(1)).toBe(1.5); + expect(fn(0)).toBe(2.5); + }); +}); + +describe('br with value for non-void block', () => { + test('br from inside a block with result type carrying a value should validate', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.block(BlockType.Int32, (label) => { + a.const_i32(99); + a.br(label); // branch carries i32 value + }); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBe(99); + }); + + test('br_if from inside block with result type should validate when value on stack', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.block(BlockType.Int32, (label) => { + a.const_i32(77); + a.get_local(f.getParameter(0)); + a.br_if(label); // conditional branch, carries i32 if taken + a.drop(); + a.const_i32(42); + }); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn(1)).toBe(77); + expect(fn(0)).toBe(42); + }); + + test('br with wrong value type for block result should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.block(BlockType.Int32, (label) => { + a.const_f64(3.14); // f64 instead of i32 + a.br(label); + }); + }); + mod.toBytes(); + }).toThrow(); + }); +}); + +describe('br_table with verification', () => { + test('br_table should verify properly with multiple targets', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.block(BlockType.Void, (outerLabel) => { + a.block(BlockType.Void, (case0Label) => { + a.block(BlockType.Void, (case1Label) => { + a.get_local(f.getParameter(0)); + a.br_table(outerLabel, case0Label, case1Label); + }); + // case1: set to 200 + a.const_i32(200); + a.set_local(f.getParameter(0)); + a.br(outerLabel); + }); + // case0: set to 100 + a.const_i32(100); + a.set_local(f.getParameter(0)); + }); + a.get_local(f.getParameter(0)); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn(0)).toBe(100); + expect(fn(1)).toBe(200); + expect(fn(99)).toBe(99); // default: falls through with original value + }); + + test('br_table with single default target verifies', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', null, [ValueType.Int32], (f, a) => { + a.block(BlockType.Void, (label) => { + a.get_local(f.getParameter(0)); + a.br_table(label); // only default label, no case labels + }); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); + + test('br_table with four case labels', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.block(BlockType.Void, (main) => { + a.block(BlockType.Void, (c0) => { + a.block(BlockType.Void, (c1) => { + a.block(BlockType.Void, (c2) => { + a.block(BlockType.Void, (c3) => { + a.get_local(f.getParameter(0)); + a.br_table(main, c0, c1, c2, c3); + }); + // c3 + a.const_i32(33); + a.set_local(f.getParameter(0)); + a.br(main); + }); + // c2 + a.const_i32(22); + a.set_local(f.getParameter(0)); + a.br(main); + }); + // c1 + a.const_i32(11); + a.set_local(f.getParameter(0)); + a.br(main); + }); + // c0 + a.const_i32(0); + a.set_local(f.getParameter(0)); + }); + a.get_local(f.getParameter(0)); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn(0)).toBe(0); + expect(fn(1)).toBe(11); + expect(fn(2)).toBe(22); + expect(fn(3)).toBe(33); + }); +}); + +describe('Loop with result type', () => { + test('loop with result type i32 must leave a value on the stack', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.loop(BlockType.Int32, () => { + a.const_i32(42); + }); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBe(42); + }); + + test('loop with void type that iterates via br', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [ValueType.Int32], (f, a) => { + const counter = a.declareLocal(ValueType.Int32, 'counter'); + a.get_local(f.getParameter(0)); + a.set_local(counter); + + a.block(BlockType.Void, (exitLabel) => { + a.loop(BlockType.Void, (loopLabel) => { + // Check exit condition + a.get_local(counter); + a.const_i32(10); + a.ge_i32(); + a.br_if(exitLabel); + + // Increment counter + a.get_local(counter); + a.const_i32(1); + a.add_i32(); + a.set_local(counter); + a.br(loopLabel); + }); + }); + + a.get_local(counter); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn(0)).toBe(10); + expect(fn(5)).toBe(10); + expect(fn(15)).toBe(15); + }); + + test('loop with f64 result type', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Float64], [], (f, a) => { + a.loop(BlockType.Float64, () => { + a.const_f64(2.718); + }); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBeCloseTo(2.718); + }); +}); + +describe('Nested blocks with correct stack', () => { + test('three levels of nested blocks each with result type i32', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.block(BlockType.Int32, () => { + a.block(BlockType.Int32, () => { + a.block(BlockType.Int32, () => { + a.const_i32(10); + }); + // innermost block leaves 10 on stack + a.const_i32(20); + a.add_i32(); + }); + // middle block leaves 30 on stack + a.const_i32(5); + a.add_i32(); + }); + // outer block leaves 35 on stack + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBe(35); + }); + + test('deeply nested blocks with mixed result types', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Float64], [], (f, a) => { + a.block(BlockType.Float64, () => { + a.block(BlockType.Int32, () => { + a.block(BlockType.Int32, () => { + a.const_i32(7); + }); + a.const_i32(3); + a.add_i32(); + }); + // i32 block leaves 10; convert to f64 + a.convert_i32_s_f64(); + a.const_f64(0.5); + a.add_f64(); + }); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBeCloseTo(10.5); + }); + + test('four levels deep with void inner blocks', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + const result = a.declareLocal(ValueType.Int32, 'result'); + a.const_i32(0); + a.set_local(result); + + a.block(BlockType.Void, () => { + a.block(BlockType.Void, () => { + a.block(BlockType.Void, () => { + a.block(BlockType.Void, () => { + a.const_i32(42); + a.set_local(result); + }); + }); + }); + }); + + a.get_local(result); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBe(42); + }); + + test('nested blocks with branches and result values', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.block(BlockType.Int32, (outer) => { + a.block(BlockType.Int32, (middle) => { + a.block(BlockType.Int32, (inner) => { + a.const_i32(10); + a.get_local(f.getParameter(0)); + a.add_i32(); + }); + // inner block result is on the stack + a.const_i32(100); + a.add_i32(); + }); + // middle block result is on the stack + a.const_i32(1000); + a.add_i32(); + }); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + // Result: (10 + param) + 100 + 1000 + expect(fn(5)).toBe(1115); + expect(fn(0)).toBe(1110); + }); +}); + +describe('Block returning wrong type', () => { + test('block (result i32) that leaves f32 on stack should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.block(BlockType.Int32, () => { + a.const_f32(1.0); // f32 instead of i32 + }); + }); + mod.toBytes(); + }).toThrow(); + }); + + test('block (result f64) that leaves i32 on stack should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Float64], [], (f, a) => { + a.block(BlockType.Float64, () => { + a.const_i32(42); // i32 instead of f64 + }); + }); + mod.toBytes(); + }).toThrow(); + }); + + test('block (result i32) that leaves i64 on stack should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.block(BlockType.Int32, () => { + a.const_i64(42n); // i64 instead of i32 + }); + }); + mod.toBytes(); + }).toThrow(); + }); + + test('block (result i32) that leaves i32 on stack should pass', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.block(BlockType.Int32, () => { + a.const_i32(42); + }); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBe(42); + }); + + test('void block that leaves nothing on stack should pass', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', null, [], (f, a) => { + a.block(BlockType.Void, () => { + a.nop(); + }); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); + + test('void block that unexpectedly leaves a value on stack should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', null, [], (f, a) => { + a.block(BlockType.Void, () => { + a.const_i32(42); // leftover value on void block + }); + }); + mod.toBytes(); + }).toThrow(); + }); + + test('block (result f32) with correct f32 value should pass', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Float32], [], (f, a) => { + a.block(BlockType.Float32, () => { + a.const_f32(9.99); + }); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBeCloseTo(9.99, 2); + }); +}); diff --git a/tests/Data.test.ts b/tests/Data.test.ts index 04c6f30..549236c 100644 --- a/tests/Data.test.ts +++ b/tests/Data.test.ts @@ -1,4 +1,5 @@ -import { ModuleBuilder, ValueType } from '../src/index'; +import { ModuleBuilder, ValueType, BinaryReader, DataSegmentBuilder } from '../src/index'; +import BinaryWriter from '../src/BinaryWriter'; test('Data - read data segment', async () => { const moduleBuilder = new ModuleBuilder('testModule'); @@ -71,3 +72,75 @@ test('Data - string data', async () => { expect(read(1)).toBe(101); // 'e' expect(read(4)).toBe(111); // 'o' }); + +describe('DataSegmentBuilder', () => { + test('toBytes() returns valid bytes', () => { + const seg = new DataSegmentBuilder(new Uint8Array([1, 2, 3])); + seg.offset(0); + const bytes = seg.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(bytes.length).toBeGreaterThan(0); + }); + + test('unsupported offset type throws', () => { + const seg = new DataSegmentBuilder(new Uint8Array([1])); + expect(() => (seg as any).offset(true)).toThrow('Unsupported offset'); + }); +}); + +describe('DataSegmentBuilder offsets', () => { + test('GlobalBuilder as data segment offset', () => { + const mod = new ModuleBuilder('test'); + // Use a defined immutable global as the data segment offset via the + // GlobalBuilder overload of DataSegmentBuilder.offset(). + const g = mod.defineGlobal(ValueType.Int32, false, 0); + mod.defineMemory(1); + mod.defineData(new Uint8Array([42]), g); + mod.defineFunction('noop', null, [], (f, a) => {}).withExport(); + + // Verify the binary roundtrip encodes a global.get init expression + const bytes = mod.toBytes(); + const reader = new BinaryReader(bytes); + const info = reader.read(); + expect(info.data).toHaveLength(1); + expect(Array.from(info.data[0].data)).toEqual([42]); + // The offset expression should contain a global.get (opcode 0x23) + expect(info.data[0].offsetExpr[0]).toBe(0x23); + }); + + test('Callback offset for data segment', async () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + mod.defineData(new Uint8Array([99]), (asm: any) => { + asm.const_i32(10); + }); + mod.defineFunction('read', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(0); + a.load8_i32_u(0, 0); + }).withExport(); + + const instance = await mod.instantiate(); + const exports = instance.instance.exports as any; + expect(exports.read(10)).toBe(99); + }); + + test('createInitEmitter called twice throws', () => { + const seg = new DataSegmentBuilder(new Uint8Array([1, 2, 3])); + seg.createInitEmitter((asm) => { + asm.const_i32(0); + }); + expect(() => { + seg.createInitEmitter((asm) => { + asm.const_i32(0); + }); + }).toThrow('Initialization expression emitter has already been created.'); + }); + + test('write() without init expression throws', () => { + const seg = new DataSegmentBuilder(new Uint8Array([1, 2, 3])); + const writer = new BinaryWriter(); + expect(() => seg.write(writer)).toThrow( + 'The initialization expression was not defined.' + ); + }); +}); diff --git a/tests/ErrorPaths.test.ts b/tests/ErrorPaths.test.ts index e3b234f..aaee6b3 100644 --- a/tests/ErrorPaths.test.ts +++ b/tests/ErrorPaths.test.ts @@ -1,4 +1,4 @@ -import { ModuleBuilder, ValueType, ElementType, VerificationError } from '../src/index'; +import { BlockType, ModuleBuilder, ValueType, ElementType, VerificationError } from '../src/index'; test('Duplicate function name throws', () => { const mod = new ModuleBuilder('test'); @@ -14,14 +14,14 @@ test('Duplicate function export throws', () => { expect(() => mod.exportFunction(f2, 'myFunc')).toThrow(/already existing/); }); -test('Duplicate memory definition throws', () => { - const mod = new ModuleBuilder('test'); +test('Duplicate memory definition throws (mvp)', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); mod.defineMemory(1); expect(() => mod.defineMemory(1)).toThrow(); }); -test('Duplicate table throws', () => { - const mod = new ModuleBuilder('test'); +test('Duplicate table throws (mvp)', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); mod.defineTable(ElementType.AnyFunc, 10); expect(() => mod.defineTable(ElementType.AnyFunc, 10)).toThrow(); }); @@ -43,8 +43,8 @@ test('Reserved name custom section throws', () => { expect(() => mod.defineCustomSection('name')).toThrow(/reserved/); }); -test('Multiple return types throws', () => { - const mod = new ModuleBuilder('test'); +test('Multiple return types throws (mvp)', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); expect(() => mod.defineFuncType([ValueType.Int32, ValueType.Int32], [])).toThrow(); }); @@ -55,8 +55,8 @@ test('Global - init expression not defined throws', () => { expect(() => mod.toBytes()).toThrow(/initialization expression/i); }); -test('Export mutable global throws with verification', () => { - const mod = new ModuleBuilder('test'); +test('Export mutable global throws with verification (mvp)', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); const g = mod.defineGlobal(ValueType.Int32, true, 0); expect(() => mod.exportGlobal(g, 'g')).toThrow(VerificationError); }); @@ -80,3 +80,98 @@ test('Feature gating - latest allows sign-extend', async () => { const fn = instance.instance.exports.test as CallableFunction; expect(fn()).toBe(-128); }); + +describe('table error conditions', () => { + test('table_grow beyond maximum returns -1', async () => { + const mod = new ModuleBuilder('test', { target: 'latest', disableVerification: true, generateNameSection: true }); + const table = mod.defineTable(ElementType.AnyFunc, 1, 3); + + mod.defineFunction('grow', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.ref_null(0x70); // funcref null + a.get_local(f.getParameter(0)); + a.table_grow(0); + }).withExport(); + + mod.defineFunction('size', [ValueType.Int32], [], (f, a) => { + a.table_size(0); + }).withExport(); + + const instance = await mod.instantiate(); + const { grow, size } = instance.instance.exports as any; + + expect(size()).toBe(1); + expect(grow(2)).toBe(1); // success, returns old size + expect(size()).toBe(3); + expect(grow(1)).toBe(-1); // exceeds max=3 + expect(size()).toBe(3); + }); + + test('call_indirect with wrong type traps', async () => { + const mod = new ModuleBuilder('test', { disableVerification: true }); + + // Function type: () -> i32 + const fn1 = mod.defineFunction('retI32', [ValueType.Int32], [], (f, a) => { + a.const_i32(42); + }); + + // Function type: (i32) -> i32 (different signature) + const fn2Type = mod.defineFuncType([ValueType.Int32], [ValueType.Int32]); + + const table = mod.defineTable(ElementType.AnyFunc, 1); + table.defineTableSegment([fn1], 0); + + // Try to call fn1 with fn2's type signature + mod.defineFunction('test', [ValueType.Int32], [], (f, a) => { + a.const_i32(0); // dummy arg (for fn2's param) + a.const_i32(0); // table index + a.call_indirect(fn2Type); + }).withExport(); + + const instance = await mod.instantiate(); + const test = instance.instance.exports.test as CallableFunction; + expect(() => test()).toThrow(); // signature mismatch trap + }); +}); + +describe('verification edge cases', () => { + test('deep nesting (30+ levels) verifies without error', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('test', null, [], (f, a) => { + // 30 nested blocks + const labels: any[] = []; + for (let i = 0; i < 30; i++) { + const label = a.block(BlockType.Void); + labels.push(label); + } + // Close all 30 blocks + for (let i = 29; i >= 0; i--) { + a.end(); + } + }).withExport(); + + // Should not throw + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); + + test('empty function body is valid', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('test', null, [], (f, a) => { + // empty body — just end + }).withExport(); + + const instance = await mod.instantiate(); + const test = instance.instance.exports.test as CallableFunction; + expect(() => test()).not.toThrow(); + }); + + test('function with only unreachable is valid', () => { + const mod = new ModuleBuilder('test', { disableVerification: true }); + mod.defineFunction('test', [ValueType.Int32], [], (f, a) => { + a.unreachable(); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); +}); diff --git a/tests/Example.test.ts b/tests/Example.test.ts index e9164de..ebf902a 100644 --- a/tests/Example.test.ts +++ b/tests/Example.test.ts @@ -1,4 +1,4 @@ -import { BlockType, ModuleBuilder, ValueType } from '../src/index'; +import { BlockType, ModuleBuilder, ValueType, ElementType } from '../src/index'; test('Example - Factorial', async () => { const moduleBuilder = new ModuleBuilder('factorialExample'); @@ -142,3 +142,208 @@ test('Example - Fibonacci', async () => { expect(fib(5)).toBe(5); expect(fib(10)).toBe(55); }); + +describe('Integration', () => { + test('Fibonacci iterative', async () => { + const mod = new ModuleBuilder('test', { disableVerification: true }); + + const fib = mod.defineFunction( + 'fib', + [ValueType.Int32], + [ValueType.Int32] + ); + const asm = fib.createEmitter(); + const n = fib.getParameter(0); + const prev = asm.declareLocal(ValueType.Int32, 'prev'); + const curr = asm.declareLocal(ValueType.Int32, 'curr'); + const temp = asm.declareLocal(ValueType.Int32, 'temp'); + const i = asm.declareLocal(ValueType.Int32, 'i'); + + // if n <= 1, return n; else compute iteratively + asm.get_local(n); + asm.const_i32(1); + asm.le_i32(); + asm.if(BlockType.Int32); + asm.get_local(n); + asm.else(); + + // prev = 0, curr = 1 + asm.const_i32(0); + asm.set_local(prev); + asm.const_i32(1); + asm.set_local(curr); + asm.const_i32(2); + asm.set_local(i); + + // loop + asm.block(BlockType.Void, (brk) => { + asm.loop(BlockType.Void, (cont) => { + // if i > n, break + asm.get_local(i); + asm.get_local(n); + asm.gt_i32(); + asm.br_if(brk); + + // temp = curr + asm.get_local(curr); + asm.set_local(temp); + // curr = prev + curr + asm.get_local(prev); + asm.get_local(curr); + asm.add_i32(); + asm.set_local(curr); + // prev = temp + asm.get_local(temp); + asm.set_local(prev); + // i++ + asm.get_local(i); + asm.const_i32(1); + asm.add_i32(); + asm.set_local(i); + + asm.br(cont); + }); + }); + + asm.get_local(curr); + asm.end(); // end else + asm.end(); // end function + + fib.withExport(); + + const instance = await mod.instantiate(); + const exports = instance.instance.exports as any; + expect(exports.fib(0)).toBe(0); + expect(exports.fib(1)).toBe(1); + expect(exports.fib(2)).toBe(1); + expect(exports.fib(3)).toBe(2); + expect(exports.fib(4)).toBe(3); + expect(exports.fib(5)).toBe(5); + expect(exports.fib(6)).toBe(8); + expect(exports.fib(7)).toBe(13); + expect(exports.fib(10)).toBe(55); + expect(exports.fib(20)).toBe(6765); + }); + + test('Mutual recursion - is_even / is_odd', async () => { + const mod = new ModuleBuilder('test', { disableVerification: true }); + + // Define both functions first (forward declarations) + const isEven = mod.defineFunction( + 'is_even', + [ValueType.Int32], + [ValueType.Int32] + ); + const isOdd = mod.defineFunction( + 'is_odd', + [ValueType.Int32], + [ValueType.Int32] + ); + + // is_even(n) = n == 0 ? 1 : is_odd(n - 1) + { + const a = isEven.createEmitter(); + const n = isEven.getParameter(0); + a.get_local(n); + a.eqz_i32(); + a.if(BlockType.Int32); + a.const_i32(1); // true + a.else(); + a.get_local(n); + a.const_i32(1); + a.sub_i32(); + a.call(isOdd); + a.end(); // end if/else + a.end(); // end function + } + + // is_odd(n) = n == 0 ? 0 : is_even(n - 1) + { + const a = isOdd.createEmitter(); + const n = isOdd.getParameter(0); + a.get_local(n); + a.eqz_i32(); + a.if(BlockType.Int32); + a.const_i32(0); // false + a.else(); + a.get_local(n); + a.const_i32(1); + a.sub_i32(); + a.call(isEven); + a.end(); // end if/else + a.end(); // end function + } + + isEven.withExport(); + isOdd.withExport(); + + const instance = await mod.instantiate(); + const exports = instance.instance.exports as any; + + expect(exports.is_even(0)).toBe(1); + expect(exports.is_even(1)).toBe(0); + expect(exports.is_even(2)).toBe(1); + expect(exports.is_even(3)).toBe(0); + expect(exports.is_even(10)).toBe(1); + + expect(exports.is_odd(0)).toBe(0); + expect(exports.is_odd(1)).toBe(1); + expect(exports.is_odd(2)).toBe(0); + expect(exports.is_odd(3)).toBe(1); + expect(exports.is_odd(7)).toBe(1); + }); + + test('Table dispatch - indirect call through table', async () => { + const mod = new ModuleBuilder('test'); + + // Three different functions that return distinct values + const add10 = mod.defineFunction('add10', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(0); + a.const_i32(10); + a.add_i32(); + }); + const mul2 = mod.defineFunction('mul2', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(0); + a.const_i32(2); + a.mul_i32(); + }); + const sub5 = mod.defineFunction('sub5', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(0); + a.const_i32(5); + a.sub_i32(); + }); + + const table = mod.defineTable(ElementType.AnyFunc, 3, 3); + table.defineTableSegment([add10, mul2, sub5], 0); + + const funcType = mod.defineFuncType([ValueType.Int32], [ValueType.Int32]); + + // dispatch(tableIndex, arg) -> result + mod.defineFunction( + 'dispatch', + [ValueType.Int32], + [ValueType.Int32, ValueType.Int32], + (f, a) => { + // Push the argument (second param) for the indirect call + a.get_local(f.getParameter(1)); + // Push the table index (first param) + a.get_local(f.getParameter(0)); + a.call_indirect(funcType); + } + ).withExport(); + + const instance = await mod.instantiate(); + const exports = instance.instance.exports as any; + + // dispatch(0, 5) -> add10(5) = 15 + expect(exports.dispatch(0, 5)).toBe(15); + // dispatch(1, 5) -> mul2(5) = 10 + expect(exports.dispatch(1, 5)).toBe(10); + // dispatch(2, 5) -> sub5(5) = 0 + expect(exports.dispatch(2, 5)).toBe(0); + // dispatch(0, 100) -> add10(100) = 110 + expect(exports.dispatch(0, 100)).toBe(110); + // dispatch(1, 7) -> mul2(7) = 14 + expect(exports.dispatch(1, 7)).toBe(14); + }); +}); diff --git a/tests/ExceptionHandling.test.ts b/tests/ExceptionHandling.test.ts new file mode 100644 index 0000000..68c23c4 --- /dev/null +++ b/tests/ExceptionHandling.test.ts @@ -0,0 +1,70 @@ +import ModuleBuilder from '../src/ModuleBuilder'; +import { ValueType } from '../src/types'; + +describe('Tag section', () => { + test('defineTag creates a tag', () => { + const mod = new ModuleBuilder('test'); + const tag = mod.defineTag([ValueType.Int32]); + expect(tag).toBeDefined(); + expect(tag._index).toBe(0); + expect(tag.funcType).toBeDefined(); + }); + + test('tag binary encoding', () => { + const mod = new ModuleBuilder('test'); + mod.defineTag([ValueType.Int32]); + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + expect(bytes.length).toBeGreaterThan(8); + }); + + test('tag WAT output', () => { + const mod = new ModuleBuilder('test'); + mod.defineTag([ValueType.Int32]); + const wat = mod.toString(); + expect(wat).toContain('(tag'); + expect(wat).toContain('(param i32)'); + }); + + test('multiple tags', () => { + const mod = new ModuleBuilder('test'); + const tag1 = mod.defineTag([ValueType.Int32]); + const tag2 = mod.defineTag([ValueType.Int32, ValueType.Float64]); + expect(tag1._index).toBe(0); + expect(tag2._index).toBe(1); + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + }); + + test('tag with no parameters', () => { + const mod = new ModuleBuilder('test'); + mod.defineTag([]); + const wat = mod.toString(); + expect(wat).toContain('(tag'); + }); +}); + +describe('Exception handling emitter', () => { + test('throw emits correctly', () => { + const mod = new ModuleBuilder('test', { disableVerification: true }); + const tag = mod.defineTag([ValueType.Int32]); + const fn = mod.defineFunction('test', null, [], (f, asm) => { + asm.const_i32(42); + asm.throw(tag._index); + }); + mod.exportFunction(fn); + expect(() => mod.toBytes()).not.toThrow(); + }); + + test('throw WAT output', () => { + const mod = new ModuleBuilder('test', { disableVerification: true }); + const tag = mod.defineTag([ValueType.Int32]); + const fn = mod.defineFunction('test', null, [], (f, asm) => { + asm.const_i32(42); + asm.throw(tag._index); + }); + mod.exportFunction(fn); + const wat = mod.toString(); + expect(wat).toContain('throw'); + }); +}); diff --git a/tests/Features.test.ts b/tests/Features.test.ts new file mode 100644 index 0000000..1bf31f7 --- /dev/null +++ b/tests/Features.test.ts @@ -0,0 +1,372 @@ +import ModuleBuilder from '../src/ModuleBuilder'; +import { ValueType, ElementType } from '../src/types'; +import VerificationError from '../src/verification/VerificationError'; + +// ─── Target System ─────────────────────────────────────────────────── + +describe('Target system', () => { + test('default target is latest with all features', () => { + const mod = new ModuleBuilder('test'); + expect(mod.hasFeature('multi-value')).toBe(true); + expect(mod.hasFeature('mutable-globals')).toBe(true); + expect(mod.hasFeature('multi-memory')).toBe(true); + expect(mod.hasFeature('multi-table')).toBe(true); + expect(mod.hasFeature('tail-call')).toBe(true); + expect(mod.hasFeature('extended-const')).toBe(true); + expect(mod.hasFeature('simd')).toBe(true); + expect(mod.hasFeature('relaxed-simd')).toBe(true); + expect(mod.hasFeature('gc')).toBe(true); + }); + + test('mvp target has no features', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + expect(mod.hasFeature('multi-value')).toBe(false); + expect(mod.hasFeature('mutable-globals')).toBe(false); + expect(mod.hasFeature('simd')).toBe(false); + }); + + test('2.0 target has correct feature set', () => { + const mod = new ModuleBuilder('test', { target: '2.0' }); + expect(mod.hasFeature('sign-extend')).toBe(true); + expect(mod.hasFeature('sat-trunc')).toBe(true); + expect(mod.hasFeature('bulk-memory')).toBe(true); + expect(mod.hasFeature('reference-types')).toBe(true); + expect(mod.hasFeature('multi-value')).toBe(true); + expect(mod.hasFeature('mutable-globals')).toBe(true); + // 3.0+ features NOT present + expect(mod.hasFeature('simd')).toBe(false); + expect(mod.hasFeature('tail-call')).toBe(false); + expect(mod.hasFeature('threads')).toBe(false); + }); + + test('3.0 target has simd but not relaxed-simd', () => { + const mod = new ModuleBuilder('test', { target: '3.0' }); + expect(mod.hasFeature('simd')).toBe(true); + expect(mod.hasFeature('tail-call')).toBe(true); + expect(mod.hasFeature('threads')).toBe(true); + expect(mod.hasFeature('multi-memory')).toBe(true); + expect(mod.hasFeature('relaxed-simd')).toBe(false); + expect(mod.hasFeature('gc')).toBe(false); + }); + + test('explicit features merge with target', () => { + const mod = new ModuleBuilder('test', { target: 'mvp', features: ['multi-value'] }); + expect(mod.hasFeature('multi-value')).toBe(true); + expect(mod.hasFeature('simd')).toBe(false); + }); +}); + +// ─── Multi-value Returns ───────────────────────────────────────────── + +describe('Multi-value returns', () => { + test('allows multiple return types with multi-value feature', () => { + const mod = new ModuleBuilder('test'); + expect(() => { + mod.defineFuncType([ValueType.Int32, ValueType.Float32], []); + }).not.toThrow(); + }); + + test('blocks multiple returns without multi-value feature', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + expect(() => { + mod.defineFuncType([ValueType.Int32, ValueType.Float32], []); + }).toThrow(/multi-value/i); + }); + + test('multi-value function compiles and runs', async () => { + const mod = new ModuleBuilder('test'); + const fn = mod.defineFunction('swap', [ValueType.Int32, ValueType.Int32], [ValueType.Int32, ValueType.Int32], (f, asm) => { + asm.get_local(f.getParameter(1)); + asm.get_local(f.getParameter(0)); + }); + mod.exportFunction(fn); + const result = await mod.instantiate(); + const swap = result.instance.exports.swap as CallableFunction; + const [a, b] = swap(10, 20); + expect(a).toBe(20); + expect(b).toBe(10); + }); +}); + +// ─── Mutable Global Exports ────────────────────────────────────────── + +describe('Mutable global exports', () => { + test('allows mutable global export with mutable-globals feature', () => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Int32, true, 42); + expect(() => mod.exportGlobal(g, 'g')).not.toThrow(); + }); + + test('blocks mutable global export without feature', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + const g = mod.defineGlobal(ValueType.Int32, true, 42); + expect(() => mod.exportGlobal(g, 'g')).toThrow(VerificationError); + }); + + test('mutable global export compiles and runs', async () => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Int32, true, 42).withExport('counter'); + const fn = mod.defineFunction('increment', null, [], (f, asm) => { + asm.get_global(g); + asm.const_i32(1); + asm.add_i32(); + asm.set_global(g); + }); + mod.exportFunction(fn); + const result = await mod.instantiate(); + const counter = result.instance.exports.counter as WebAssembly.Global; + expect(counter.value).toBe(42); + (result.instance.exports.increment as CallableFunction)(); + expect(counter.value).toBe(43); + }); +}); + +// ─── Multi-memory ──────────────────────────────────────────────────── + +describe('Multi-memory', () => { + test('allows multiple memories with multi-memory feature', () => { + const mod = new ModuleBuilder('test', { features: ['multi-memory'] }); + mod.defineMemory(1); + expect(() => mod.defineMemory(1)).not.toThrow(); + }); + + test('blocks multiple memories without feature', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + mod.defineMemory(1); + expect(() => mod.defineMemory(1)).toThrow(VerificationError); + }); + + test('blocks multiple imported memories without feature', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + mod.importMemory('env', 'mem1', 1); + expect(() => mod.importMemory('env', 'mem2', 1)).toThrow(VerificationError); + }); + + test('allows multiple imported memories with feature', () => { + const mod = new ModuleBuilder('test', { features: ['multi-memory'] }); + mod.importMemory('env', 'mem1', 1); + expect(() => mod.importMemory('env', 'mem2', 1)).not.toThrow(); + }); +}); + +// ─── Multi-table ───────────────────────────────────────────────────── + +describe('Multi-table', () => { + test('allows multiple tables with multi-table feature', () => { + const mod = new ModuleBuilder('test', { features: ['multi-table'] }); + mod.defineTable(ElementType.AnyFunc, 1); + expect(() => mod.defineTable(ElementType.AnyFunc, 1)).not.toThrow(); + }); + + test('blocks multiple tables without feature', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + mod.defineTable(ElementType.AnyFunc, 1); + expect(() => mod.defineTable(ElementType.AnyFunc, 1)).toThrow(); + }); +}); + +// ─── Tail Calls ────────────────────────────────────────────────────── + +describe('Tail calls', () => { + test('return_call opcode exists', () => { + const mod = new ModuleBuilder('test'); + const fn = mod.defineFunction('target', ValueType.Int32, [], (f, asm) => { + asm.const_i32(42); + }); + const caller = mod.defineFunction('caller', ValueType.Int32, [], (f, asm) => { + asm.return_call(fn); + }); + mod.exportFunction(caller); + // Just verify it compiles to bytes without error + expect(() => mod.toBytes()).not.toThrow(); + }); + + test('return_call WAT output', () => { + const mod = new ModuleBuilder('test'); + const fn = mod.defineFunction('target', ValueType.Int32, [], (f, asm) => { + asm.const_i32(42); + }); + const caller = mod.defineFunction('caller', ValueType.Int32, [], (f, asm) => { + asm.return_call(fn); + }); + mod.exportFunction(caller); + const wat = mod.toString(); + expect(wat).toContain('return_call'); + }); + + test('return_call_indirect opcode exists', () => { + const mod = new ModuleBuilder('test'); + const funcType = mod.defineFuncType(ValueType.Int32, []); + const table = mod.defineTable(ElementType.AnyFunc, 10); + const fn = mod.defineFunction('caller', ValueType.Int32, [ValueType.Int32], (f, asm) => { + asm.get_local(f.getParameter(0)); + asm.return_call_indirect(funcType); + }); + mod.exportFunction(fn); + expect(() => mod.toBytes()).not.toThrow(); + }); +}); + +// ─── Passive Data Segments ─────────────────────────────────────────── + +describe('Passive data segments', () => { + test('passive data segment binary encoding', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + const data = new Uint8Array([1, 2, 3, 4]); + mod.defineData(data).passive(); + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + expect(bytes.length).toBeGreaterThan(0); + }); + + test('passive data segment WAT output', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + mod.defineData(new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f])).passive(); + const wat = mod.toString(); + // Passive: no offset expression + expect(wat).toContain('(data (;0;) "Hello")'); + }); + + test('active data segment with memory index', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + const data = new Uint8Array([1, 2, 3]); + const seg = mod.defineData(data, 0); + seg.memoryIndex(0); + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + }); + + test('mixed active and passive data segments', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + mod.defineData(new Uint8Array([1, 2, 3]), 0); // active + mod.defineData(new Uint8Array([4, 5, 6])).passive(); // passive + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + }); +}); + +// ─── Passive Element Segments ──────────────────────────────────────── + +describe('Passive element segments', () => { + test('passive element segment binary encoding', () => { + const mod = new ModuleBuilder('test'); + const table = mod.defineTable(ElementType.AnyFunc, 10); + const fn = mod.defineFunction('fn', null, [], (f, asm) => { + asm.nop(); + }); + mod.definePassiveElementSegment([fn]); + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + }); + + test('passive element segment WAT output', () => { + const mod = new ModuleBuilder('test'); + const table = mod.defineTable(ElementType.AnyFunc, 10); + const fn = mod.defineFunction('fn', null, [], (f, asm) => { + asm.nop(); + }); + mod.definePassiveElementSegment([fn]); + const wat = mod.toString(); + // Passive: no offset, just func indices + expect(wat).toContain('(elem (;0;) func'); + expect(wat).not.toContain('i32.const'); + }); + + test('active element segment with table index', () => { + const mod = new ModuleBuilder('test'); + const table = mod.defineTable(ElementType.AnyFunc, 10); + const fn = mod.defineFunction('fn', null, [], (f, asm) => { + asm.nop(); + }); + mod.defineTableSegment(table, [fn], 0); + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + }); +}); + +// ─── Extended Const Expressions ────────────────────────────────────── + +describe('Extended const expressions', () => { + test('i32.add in init expression with extended-const', () => { + const mod = new ModuleBuilder('test', { features: ['extended-const'] }); + const g = mod.defineGlobal(ValueType.Int32, false); + g.createInitEmitter((asm) => { + asm.const_i32(10); + asm.const_i32(20); + asm.add_i32(); + }); + expect(() => mod.toBytes()).not.toThrow(); + }); + + test('i32.sub in init expression with extended-const', () => { + const mod = new ModuleBuilder('test', { features: ['extended-const'] }); + const g = mod.defineGlobal(ValueType.Int32, false); + g.createInitEmitter((asm) => { + asm.const_i32(30); + asm.const_i32(10); + asm.sub_i32(); + }); + expect(() => mod.toBytes()).not.toThrow(); + }); + + test('i32.mul in init expression with extended-const', () => { + const mod = new ModuleBuilder('test', { features: ['extended-const'] }); + const g = mod.defineGlobal(ValueType.Int32, false); + g.createInitEmitter((asm) => { + asm.const_i32(5); + asm.const_i32(6); + asm.mul_i32(); + }); + expect(() => mod.toBytes()).not.toThrow(); + }); + + test('i64 arithmetic in init expression with extended-const', () => { + const mod = new ModuleBuilder('test', { features: ['extended-const'] }); + const g = mod.defineGlobal(ValueType.Int64, false); + g.createInitEmitter((asm) => { + asm.const_i64(100n); + asm.const_i64(200n); + asm.add_i64(); + }); + expect(() => mod.toBytes()).not.toThrow(); + }); + + test('arithmetic in init expression blocked without feature', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + const g = mod.defineGlobal(ValueType.Int32, false); + // Without extended-const, only one const + end allowed + // The second const triggers "not valid after init expression value" + expect(() => { + g.createInitEmitter((asm) => { + asm.const_i32(10); + asm.const_i32(20); + asm.add_i32(); + }); + }).toThrow(/not valid after init expression/i); + }); + + test('add_i32 in init expression blocked without feature', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + const g = mod.defineGlobal(ValueType.Int32, false); + // At instructions.length=0, add_i32 hits the extended-const guard + const emitter = g.createInitEmitter(); + expect(() => emitter.add_i32()).toThrow(/extended-const/i); + }); + + test('extended-const global init compiles and runs', async () => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Int32, false); + g.createInitEmitter((asm) => { + asm.const_i32(10); + asm.const_i32(32); + asm.add_i32(); + }); + mod.exportGlobal(g, 'result'); + const result = await mod.instantiate(); + expect((result.instance.exports.result as WebAssembly.Global).value).toBe(42); + }); +}); diff --git a/tests/Global.test.ts b/tests/Global.test.ts index 2932761..52cc727 100644 --- a/tests/Global.test.ts +++ b/tests/Global.test.ts @@ -1,4 +1,5 @@ import { ModuleBuilder, ValueType, VerificationError } from '../src/index'; +import BinaryWriter from '../src/BinaryWriter'; test('Global - Read', async () => { const moduleBuilder = new ModuleBuilder('testModule'); @@ -65,8 +66,8 @@ test('Global Export - Read', async () => { expect((module.instance.exports.global1 as WebAssembly.Global).value).toBe(124); }); -test('Global Export - Mutable not allowed', () => { - const moduleBuilder = new ModuleBuilder('testModule'); +test('Global Export - Mutable not allowed (mvp)', () => { + const moduleBuilder = new ModuleBuilder('testModule', { target: 'mvp' }); const mutableGlobal = moduleBuilder.defineGlobal(ValueType.Int32, true, 0); expect(() => moduleBuilder.exportGlobal(mutableGlobal, 'g')).toThrow(VerificationError); }); @@ -97,3 +98,71 @@ test('Global Import - Duplicate throws', () => { moduleBuilder.importGlobal('mod', 'g1', ValueType.Int32, false); expect(() => moduleBuilder.importGlobal('mod', 'g1', ValueType.Int32, false)).toThrow(); }); + +describe('GlobalBuilder init expressions', () => { + test('value() with unsupported type throws', () => { + const mod = new ModuleBuilder('test', { disableVerification: true }); + const g = mod.defineGlobal(ValueType.V128, false); + expect(() => g.value(0)).toThrow('Unsupported global value type'); + }); + + test('value() with invalid argument type throws', () => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Int32, false); + expect(() => (g as any).value(true)).toThrow('Unsupported global value'); + }); + + test('write() without init expression throws', () => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Int32, false); + const writer = new BinaryWriter(); + expect(() => g.write(writer)).toThrow('initialization expression was not defined'); + }); + + test('toBytes() standalone', () => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Int32, false, 42); + const bytes = g.toBytes(); + expect(bytes).toBeInstanceOf(Uint8Array); + expect(bytes.length).toBeGreaterThan(0); + }); +}); + +describe('GlobalBuilder types', () => { + test('value() with callback', async () => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Int32, false); + g.value((asm: any) => { + asm.const_i32(42); + }); + g.withExport('myGlobal'); + + const instance = await mod.instantiate(); + const exports = instance.instance.exports as any; + expect((exports.myGlobal as WebAssembly.Global).value).toBe(42); + }); + + test('createInitEmitter called twice throws', () => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Int32, false); + g.createInitEmitter((asm) => { + asm.const_i32(0); + }); + expect(() => { + g.createInitEmitter((asm) => { + asm.const_i32(0); + }); + }).toThrow('Initialization expression emitter has already been created.'); + }); + + test('i64 global with bigint', async () => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Int64, false); + g.value(100n); + g.withExport('g64'); + + const instance = await mod.instantiate(); + const exports = instance.instance.exports as any; + expect((exports.g64 as WebAssembly.Global).value).toBe(100n); + }); +}); diff --git a/tests/ImmediateEncoder.test.ts b/tests/ImmediateEncoder.test.ts index 5211590..6fa7fc1 100644 --- a/tests/ImmediateEncoder.test.ts +++ b/tests/ImmediateEncoder.test.ts @@ -1,6 +1,6 @@ import ImmediateEncoder from '../src/ImmediateEncoder'; import BinaryWriter from '../src/BinaryWriter'; -import { BlockType, ValueType } from '../src/index'; +import { BlockType, ValueType, ModuleBuilder } from '../src/index'; test('ImmediateEncoder - block signature void', () => { const writer = new BinaryWriter(); @@ -104,3 +104,42 @@ test('ImmediateEncoder - memory immediate', () => { expect(bytes[0]).toBe(0x02); expect(bytes[1]).toBe(0x10); }); + +describe('f64 special values', () => { + test('f64 Infinity', () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('infF64', [ValueType.Float64], [], (f, a) => { + a.const_f64(Infinity); + }).withExport(); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); + + test('f64 -Infinity', () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('negInfF64', [ValueType.Float64], [], (f, a) => { + a.const_f64(-Infinity); + }).withExport(); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); + + test('f64 NaN', () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('nanF64', [ValueType.Float64], [], (f, a) => { + a.const_f64(NaN); + }).withExport(); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); + + test('f64 0.0', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('zeroF64', [ValueType.Float64], [], (f, a) => { + a.const_f64(0.0); + }).withExport(); + const instance = await mod.instantiate(); + const { zeroF64 } = instance.instance.exports as any; + expect(zeroF64()).toBe(0.0); + }); +}); diff --git a/tests/Import.test.ts b/tests/Import.test.ts index a74451e..76d35f5 100644 --- a/tests/Import.test.ts +++ b/tests/Import.test.ts @@ -45,8 +45,8 @@ test('Import Memory', async () => { expect((module.instance.exports.readMemory as CallableFunction)(0)).toBe(77); }); -test('Import Memory - Only one allowed', () => { - const moduleBuilder = new ModuleBuilder('test'); +test('Import Memory - Only one allowed (mvp)', () => { + const moduleBuilder = new ModuleBuilder('test', { target: 'mvp' }); moduleBuilder.importMemory('mod', 'mem1', 1); expect(() => moduleBuilder.importMemory('mod', 'mem2', 1)).toThrow(); }); diff --git a/tests/InitExpressionEmitter.test.ts b/tests/InitExpressionEmitter.test.ts new file mode 100644 index 0000000..6f80f38 --- /dev/null +++ b/tests/InitExpressionEmitter.test.ts @@ -0,0 +1,57 @@ +import { + ModuleBuilder, + ValueType, +} from '../src/index'; +import InitExpressionEmitter from '../src/InitExpressionEmitter'; +import { InitExpressionType } from '../src/types'; +import OpCodes from '../src/OpCodes'; + +describe('InitExpressionEmitter', () => { + test('getParameter throws', () => { + const emitter = new InitExpressionEmitter(InitExpressionType.Global, ValueType.Int32); + expect(() => emitter.getParameter(0)).toThrow('does not have any parameters'); + }); + + test('declareLocal throws', () => { + const emitter = new InitExpressionEmitter(InitExpressionType.Global, ValueType.Int32); + expect(() => emitter.declareLocal()).toThrow('cannot have locals'); + }); + + test('unsupported opcode in init expression throws', () => { + const emitter = new InitExpressionEmitter(InitExpressionType.Global, ValueType.Int32); + expect(() => emitter.emit(OpCodes.i32_add)).toThrow('is not supported in an initializer expression'); + }); + + test('second instruction after const must be end', () => { + const emitter = new InitExpressionEmitter(InitExpressionType.Global, ValueType.Int32); + emitter.emit(OpCodes.i32_const, 42); + expect(() => emitter.emit(OpCodes.i32_const, 99)).toThrow('is not valid after init expression value'); + }); + + test('get_global in element init expression throws', () => { + const mod = new ModuleBuilder('test', { disableVerification: true }); + const g = mod.defineGlobal(ValueType.Int32, false, 0); + const emitter = new InitExpressionEmitter(InitExpressionType.Element, ValueType.Int32); + expect(() => emitter.emit(OpCodes.get_global, g)).toThrow('global not supported'); + }); + + test('get_global with non-GlobalBuilder throws', () => { + const emitter = new InitExpressionEmitter(InitExpressionType.Global, ValueType.Int32); + expect(() => emitter.emit(OpCodes.get_global, 'not a global')).toThrow('A global builder was expected'); + }); + + test('get_global with mutable global throws', () => { + const mod = new ModuleBuilder('test', { disableVerification: true }); + const g = mod.defineGlobal(ValueType.Int32, true, 0); + const emitter = new InitExpressionEmitter(InitExpressionType.Global, ValueType.Int32); + expect(() => emitter.emit(OpCodes.get_global, g)).toThrow('mutable global'); + }); + + test('third instruction throws from base class (control enclosure closed)', () => { + const emitter = new InitExpressionEmitter(InitExpressionType.Global, ValueType.Int32); + emitter.emit(OpCodes.i32_const, 42); + emitter.emit(OpCodes.end); + // After end, the base class AssemblyEmitter throws + expect(() => emitter.emit(OpCodes.nop)).toThrow('control enclosure has been closed'); + }); +}); diff --git a/tests/Memory.test.ts b/tests/Memory.test.ts index ffca4eb..279cc5c 100644 --- a/tests/Memory.test.ts +++ b/tests/Memory.test.ts @@ -85,12 +85,18 @@ test('Memory - Export', async () => { } }); -test('Memory - Only one allowed', () => { - const moduleBuilder = new ModuleBuilder('test'); +test('Memory - Only one allowed (mvp)', () => { + const moduleBuilder = new ModuleBuilder('test', { target: 'mvp' }); moduleBuilder.defineMemory(1, 1); expect(() => moduleBuilder.defineMemory(1, 1)).toThrow(VerificationError); }); +test('Memory - Multiple allowed with multi-memory feature', () => { + const moduleBuilder = new ModuleBuilder('test', { features: ['multi-memory'] }); + moduleBuilder.defineMemory(1, 1); + expect(() => moduleBuilder.defineMemory(1, 1)).not.toThrow(); +}); + test('Memory - i32 load/store', async () => { const moduleBuilder = new ModuleBuilder('testModule'); moduleBuilder diff --git a/tests/Memory64.test.ts b/tests/Memory64.test.ts new file mode 100644 index 0000000..e208fb9 --- /dev/null +++ b/tests/Memory64.test.ts @@ -0,0 +1,49 @@ +import ModuleBuilder from '../src/ModuleBuilder'; +import { ValueType } from '../src/types'; + +describe('Memory64', () => { + test('memory64 flag in binary encoding', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 100, false, true); + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + // Flag byte should have bit 2 set (0b100 = 4) plus bit 0 for max (0b101 = 5) + const bytesArray = Array.from(bytes); + expect(bytesArray).toContain(5); // has_max | memory64 + }); + + test('memory64 WAT output shows i64', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 100, false, true); + const wat = mod.toString(); + expect(wat).toContain('i64'); + expect(wat).toContain('1 100'); + }); + + test('memory64 without max', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, null, false, true); + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + // Flag byte: only memory64 bit (0b100 = 4) + const bytesArray = Array.from(bytes); + expect(bytesArray).toContain(4); + }); + + test('shared + memory64 combined', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 100, true, true); + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + // Flag byte: has_max | shared | memory64 = 0b111 = 7 + const bytesArray = Array.from(bytes); + expect(bytesArray).toContain(7); + }); + + test('non-memory64 does not show i64', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 100); + const wat = mod.toString(); + expect(wat).not.toContain('i64'); + }); +}); diff --git a/tests/ModuleBuilder.test.ts b/tests/ModuleBuilder.test.ts index 8fb8061..ac581e7 100644 --- a/tests/ModuleBuilder.test.ts +++ b/tests/ModuleBuilder.test.ts @@ -20,8 +20,8 @@ test('ModuleBuilder - defineFuncType deduplicates', () => { expect(mod._types).toHaveLength(1); }); -test('ModuleBuilder - defineFuncType rejects multiple returns', () => { - const mod = new ModuleBuilder('test'); +test('ModuleBuilder - defineFuncType rejects multiple returns (mvp)', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); expect(() => mod.defineFuncType([ValueType.Int32, ValueType.Int32], [])).toThrow(); }); @@ -31,14 +31,14 @@ test('ModuleBuilder - defineFunction duplicate name throws', () => { expect(() => mod.defineFunction('fn', null, [])).toThrow(); }); -test('ModuleBuilder - defineTable only one allowed', () => { - const mod = new ModuleBuilder('test'); +test('ModuleBuilder - defineTable only one allowed (mvp)', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); mod.defineTable(ElementType.AnyFunc, 1); expect(() => mod.defineTable(ElementType.AnyFunc, 1)).toThrow(); }); -test('ModuleBuilder - defineMemory only one allowed', () => { - const mod = new ModuleBuilder('test'); +test('ModuleBuilder - defineMemory only one allowed (mvp)', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); mod.defineMemory(1); expect(() => mod.defineMemory(1)).toThrow(VerificationError); }); @@ -140,3 +140,42 @@ test('ModuleBuilder - import function indices are correct', async () => { (module.instance.exports.test as CallableFunction)(); expect(loggedValue).toBe(42); }); + +describe('ModuleBuilder options', () => { + test('defaultOptions exist', () => { + expect(ModuleBuilder.defaultOptions).toBeDefined(); + expect(ModuleBuilder.defaultOptions.generateNameSection).toBe(true); + expect(ModuleBuilder.defaultOptions.disableVerification).toBe(false); + }); + + test('targetFeatures has mvp, 2.0, latest', () => { + expect(ModuleBuilder.targetFeatures['mvp']).toEqual([]); + expect(ModuleBuilder.targetFeatures['2.0']).toContain('sign-extend'); + expect(ModuleBuilder.targetFeatures['latest']).toContain('simd'); + }); + + test('features getter returns resolved features', () => { + const mod = new ModuleBuilder('test'); + expect(mod.features).toBeInstanceOf(Set); + expect(mod.features.has('simd')).toBe(true); + }); + + test('hasFeature checks correctly', () => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + expect(mod.hasFeature('simd')).toBe(false); + expect(mod.hasFeature('sign-extend')).toBe(false); + }); + + test('custom features are merged', () => { + const mod = new ModuleBuilder('test', { target: 'mvp', features: ['simd'] }); + expect(mod.hasFeature('simd')).toBe(true); + expect(mod.hasFeature('sign-extend')).toBe(false); + }); + + test('disableVerification getter', () => { + const mod1 = new ModuleBuilder('test'); + expect(mod1.disableVerification).toBe(false); + const mod2 = new ModuleBuilder('test', { disableVerification: true }); + expect(mod2.disableVerification).toBe(true); + }); +}); diff --git a/tests/PackageBuilder.test.ts b/tests/PackageBuilder.test.ts index b73d037..45b0929 100644 --- a/tests/PackageBuilder.test.ts +++ b/tests/PackageBuilder.test.ts @@ -65,3 +65,85 @@ test('PackageBuilder - compile', async () => { const compiled = await pkg.compile(); expect(compiled.test).toBeInstanceOf(WebAssembly.Module); }); + +describe('PackageBuilder advanced', () => { + test('getModule returns module', () => { + const pkg = new PackageBuilder(); + const mod = pkg.defineModule('myMod'); + const result = pkg.getModule('myMod'); + expect(result).toBe(mod); + }); + + test('getModule returns undefined for nonexistent name', () => { + const pkg = new PackageBuilder(); + pkg.defineModule('exists'); + const result = pkg.getModule('doesNotExist'); + expect(result).toBeUndefined(); + }); + + test('addDependency with nonexistent module throws', () => { + const pkg = new PackageBuilder(); + pkg.defineModule('b'); + expect(() => pkg.addDependency('nonexistent', 'b')).toThrow( + 'Module "nonexistent" not found.' + ); + }); + + test('addDependency with nonexistent dependency throws', () => { + const pkg = new PackageBuilder(); + pkg.defineModule('a'); + expect(() => pkg.addDependency('a', 'nonexistent')).toThrow( + 'Dependency module "nonexistent" not found.' + ); + }); + + test('Duplicate addDependency is idempotent', () => { + const pkg = new PackageBuilder(); + pkg.defineModule('a'); + pkg.defineModule('b'); + pkg.addDependency('a', 'b'); + pkg.addDependency('a', 'b'); // second call should not duplicate + + // Verify by checking internal state: only one dependency entry + const entry = pkg._modules.find((m) => m.name === 'a'); + expect(entry).toBeDefined(); + expect(entry!.dependencies).toEqual(['b']); + expect(entry!.dependencies.length).toBe(1); + }); + + test('3+ module dependency chain - A depends on B depends on C', async () => { + const pkg = new PackageBuilder(); + + // Module C: provides a base value + const modC = pkg.defineModule('c'); + modC.defineFunction('base', [ValueType.Int32], [], (f, a) => { + a.const_i32(10); + }).withExport(); + + // Module B: imports from C, doubles the value + const modB = pkg.defineModule('b'); + const baseFn = modB.importFunction('c', 'base', [ValueType.Int32], []); + modB.defineFunction('doubled', [ValueType.Int32], [], (f, a) => { + a.call(baseFn); + a.const_i32(2); + a.mul_i32(); + }).withExport(); + + // Module A: imports from B, adds 1 + const modA = pkg.defineModule('a'); + const doubledFn = modA.importFunction('b', 'doubled', [ValueType.Int32], []); + modA.defineFunction('result', [ValueType.Int32], [], (f, a) => { + a.call(doubledFn); + a.const_i32(1); + a.add_i32(); + }).withExport(); + + pkg.addDependency('a', 'b'); + pkg.addDependency('b', 'c'); + + const result = await pkg.instantiate(); + const aResult = result.a.exports.result as CallableFunction; + // base=10, doubled=20, result=21 + expect(aResult()).toBe(21); + }); +}); diff --git a/tests/RelaxedSimd.test.ts b/tests/RelaxedSimd.test.ts new file mode 100644 index 0000000..f19fa5b --- /dev/null +++ b/tests/RelaxedSimd.test.ts @@ -0,0 +1,16 @@ +import ModuleBuilder from '../src/ModuleBuilder'; +import { ValueType } from '../src/types'; + +describe('Relaxed SIMD integration', () => { + test('relaxed SIMD emitter method works', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + const fn = mod.defineFunction('test', ValueType.V128, [ValueType.V128, ValueType.V128], (f, asm) => { + asm.get_local(f.getParameter(0)); + asm.get_local(f.getParameter(1)); + asm.relaxed_min_f32x4(); + }); + mod.exportFunction(fn); + expect(() => mod.toBytes()).not.toThrow(); + }); +}); diff --git a/tests/SimdLaneOps.test.ts b/tests/SimdLaneOps.test.ts new file mode 100644 index 0000000..6d613db --- /dev/null +++ b/tests/SimdLaneOps.test.ts @@ -0,0 +1,374 @@ +import { ModuleBuilder, ValueType } from '../src/index'; + +const latestOpts = { generateNameSection: true, disableVerification: true, target: 'latest' as const }; + +describe('extract_lane', () => { + test('extract_lane_i32x4 for each lane', async () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + // Store 4 i32 values then extract each lane + mod.defineFunction('setI32', null, [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0); + }).withExport(); + + mod.defineFunction('extractLane', [ValueType.Int32], [ValueType.Int32], (f, a) => { + // Load v128 from address 0 + a.const_i32(0); + a.load_v128(0, 0); + // Extract lane at given index — we need separate functions per lane + // So let's create one per lane + a.extract_lane_i32x4(0); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await WebAssembly.instantiate(bytes.buffer as ArrayBuffer); + const { setI32, extractLane } = instance.instance.exports as any; + setI32(0, 10); + setI32(4, 20); + setI32(8, 30); + setI32(12, 40); + expect(extractLane()).toBe(10); // lane 0 + }); + + test('extract_lane_f32x4 with float values', () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('test', [ValueType.Float32], [], (f, a) => { + a.const_i32(0); + a.load_v128(0, 0); + a.extract_lane_f32x4(2); + }).withExport(); + + expect(WebAssembly.validate(mod.toBytes().buffer as ArrayBuffer)).toBe(true); + }); + + test('extract_lane_s_i8x16 (signed) for value > 127', async () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + // Store 0xFF (255) at byte offset 0 + mod.defineFunction('setByte', null, [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store8_i32(0, 0); + }).withExport(); + + // Extract lane 0 as signed i8 → should be -1 for 0xFF + mod.defineFunction('extractSigned', [ValueType.Int32], [], (f, a) => { + a.const_i32(0); + a.load_v128(0, 0); + a.extract_lane_s_i8x16(0); + }).withExport(); + + // Extract lane 0 as unsigned i8 → should be 255 for 0xFF + mod.defineFunction('extractUnsigned', [ValueType.Int32], [], (f, a) => { + a.const_i32(0); + a.load_v128(0, 0); + a.extract_lane_u_i8x16(0); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await WebAssembly.instantiate(bytes.buffer as ArrayBuffer); + const { setByte, extractSigned, extractUnsigned } = instance.instance.exports as any; + setByte(0, 0xFF); + expect(extractSigned()).toBe(-1); + expect(extractUnsigned()).toBe(255); + }); + + test('extract_lane_i64x2 validates', () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('test', [ValueType.Int64], [], (f, a) => { + a.const_i32(0); + a.load_v128(0, 0); + a.extract_lane_i64x2(1); + }).withExport(); + + expect(WebAssembly.validate(mod.toBytes().buffer as ArrayBuffer)).toBe(true); + }); +}); + +describe('replace_lane', () => { + test('replace_lane_i32x4 replaces single lane', async () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('setI32', null, [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0); + }).withExport(); + + mod.defineFunction('replaceLane2', null, [ValueType.Int32], (f, a) => { + // Load v128 from addr 0, replace lane 2, store back at addr 0 + a.const_i32(0); + a.const_i32(0); + a.load_v128(0, 0); + a.get_local(f.getParameter(0)); + a.replace_lane_i32x4(2); + a.store_v128(0, 0); + }).withExport(); + + mod.defineFunction('getI32', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await WebAssembly.instantiate(bytes.buffer as ArrayBuffer); + const { setI32, replaceLane2, getI32 } = instance.instance.exports as any; + setI32(0, 10); + setI32(4, 20); + setI32(8, 30); + setI32(12, 40); + replaceLane2(99); + expect(getI32(0)).toBe(10); // lane 0 unchanged + expect(getI32(4)).toBe(20); // lane 1 unchanged + expect(getI32(8)).toBe(99); // lane 2 replaced + expect(getI32(12)).toBe(40); // lane 3 unchanged + }); + + test('replace_lane_f64x2 validates', () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('test', null, [], (f, a) => { + a.const_i32(0); + a.const_i32(0); + a.load_v128(0, 0); + a.const_f64(3.14); + a.replace_lane_f64x2(1); + a.store_v128(0, 0); + }).withExport(); + + expect(WebAssembly.validate(mod.toBytes().buffer as ArrayBuffer)).toBe(true); + }); + + test('replace_lane_i8x16 validates', () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('test', null, [], (f, a) => { + a.const_i32(0); + a.const_i32(0); + a.load_v128(0, 0); + a.const_i32(42); + a.replace_lane_i8x16(5); + a.store_v128(0, 0); + }).withExport(); + + expect(WebAssembly.validate(mod.toBytes().buffer as ArrayBuffer)).toBe(true); + }); +}); + +describe('splat', () => { + test('splat_i32x4 fills all 4 lanes', async () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('splatAndStore', null, [ValueType.Int32], (f, a) => { + a.const_i32(0); + a.get_local(f.getParameter(0)); + a.splat_i32x4(); + a.store_v128(0, 0); + }).withExport(); + + mod.defineFunction('getI32', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.load_i32(2, 0); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await WebAssembly.instantiate(bytes.buffer as ArrayBuffer); + const { splatAndStore, getI32 } = instance.instance.exports as any; + splatAndStore(42); + expect(getI32(0)).toBe(42); + expect(getI32(4)).toBe(42); + expect(getI32(8)).toBe(42); + expect(getI32(12)).toBe(42); + }); + + test('splat_f32x4 with float value', () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('test', null, [], (f, a) => { + a.const_i32(0); + a.const_f32(3.14); + a.splat_f32x4(); + a.store_v128(0, 0); + }).withExport(); + + expect(WebAssembly.validate(mod.toBytes().buffer as ArrayBuffer)).toBe(true); + }); + + test('splat_i8x16 fills all 16 lanes', async () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('splatAndStore', null, [ValueType.Int32], (f, a) => { + a.const_i32(0); + a.get_local(f.getParameter(0)); + a.splat_i8x16(); + a.store_v128(0, 0); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await WebAssembly.instantiate(bytes.buffer as ArrayBuffer); + const { splatAndStore } = instance.instance.exports as any; + splatAndStore(7); + const memory = instance.instance.exports.memory as WebAssembly.Memory | undefined; + // If memory not exported, just validate + if (!memory) return; + const view = new Uint8Array(memory.buffer); + for (let i = 0; i < 16; i++) { + expect(view[i]).toBe(7); + } + }); +}); + +describe('narrow / extend', () => { + test('narrow_i16x8_s_i8x16 signed narrow validates', () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('test', null, [], (f, a) => { + a.const_i32(0); + a.const_i32(0); + a.load_v128(0, 0); + a.const_i32(16); + a.load_v128(0, 0); + a.narrow_i16x8_s_i8x16(); + a.store_v128(0, 0); + }).withExport(); + + expect(WebAssembly.validate(mod.toBytes().buffer as ArrayBuffer)).toBe(true); + }); + + test('extend_low_i8x16_s_i16x8 validates', () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('test', null, [], (f, a) => { + a.const_i32(0); + a.const_i32(0); + a.load_v128(0, 0); + a.extend_low_i8x16_s_i16x8(); + a.store_v128(0, 0); + }).withExport(); + + expect(WebAssembly.validate(mod.toBytes().buffer as ArrayBuffer)).toBe(true); + }); + + test('narrow with saturation clamping', async () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + // Write i16 values to memory, narrow to i8, read back + mod.defineFunction('setI16', null, [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store16_i32(1, 0); + }).withExport(); + + mod.defineFunction('narrowAndStore', null, [], (f, a) => { + a.const_i32(64); + a.const_i32(0); + a.load_v128(0, 0); + a.const_i32(16); + a.load_v128(0, 0); + a.narrow_i16x8_u_i8x16(); + a.store_v128(0, 0); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); +}); + +describe('bitmask & all_true', () => { + test('bitmask_i32x4 returns bitmask of sign bits', async () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('setI32', null, [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0); + }).withExport(); + + mod.defineFunction('getBitmask', [ValueType.Int32], [], (f, a) => { + a.const_i32(0); + a.load_v128(0, 0); + a.bitmask_i32x4(); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await WebAssembly.instantiate(bytes.buffer as ArrayBuffer); + const { setI32, getBitmask } = instance.instance.exports as any; + + // All positive → bitmask = 0 + setI32(0, 1); setI32(4, 2); setI32(8, 3); setI32(12, 4); + expect(getBitmask()).toBe(0); + + // Lane 0 and 2 negative → bitmask = 0b0101 = 5 + setI32(0, -1); setI32(4, 2); setI32(8, -3); setI32(12, 4); + expect(getBitmask()).toBe(5); + + // All negative → bitmask = 0b1111 = 15 + setI32(0, -1); setI32(4, -1); setI32(8, -1); setI32(12, -1); + expect(getBitmask()).toBe(15); + }); + + test('all_true_i32x4 returns 1 when all lanes nonzero', async () => { + const mod = new ModuleBuilder('test', latestOpts); + mod.defineMemory(1); + + mod.defineFunction('setI32', null, [ValueType.Int32, ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.get_local(f.getParameter(1)); + a.store_i32(2, 0); + }).withExport(); + + mod.defineFunction('allTrue', [ValueType.Int32], [], (f, a) => { + a.const_i32(0); + a.load_v128(0, 0); + a.all_true_i32x4(); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await WebAssembly.instantiate(bytes.buffer as ArrayBuffer); + const { setI32, allTrue } = instance.instance.exports as any; + + // All nonzero → true + setI32(0, 1); setI32(4, 2); setI32(8, 3); setI32(12, 4); + expect(allTrue()).toBe(1); + + // One zero → false + setI32(0, 1); setI32(4, 0); setI32(8, 3); setI32(12, 4); + expect(allTrue()).toBe(0); + + // All zero → false + setI32(0, 0); setI32(4, 0); setI32(8, 0); setI32(12, 0); + expect(allTrue()).toBe(0); + }); +}); diff --git a/tests/StackVerification.test.ts b/tests/StackVerification.test.ts index 4b891f4..97fe8e5 100644 --- a/tests/StackVerification.test.ts +++ b/tests/StackVerification.test.ts @@ -1,4 +1,4 @@ -import { ValueType } from '../src/index'; +import { ValueType, ModuleBuilder, ElementType, BlockType } from '../src/index'; import VerificationTest from './VerificationTest'; test('Stack Verification - end with empty stack', async () => { @@ -69,3 +69,465 @@ test('Stack Verification - binary op with wrong type', async () => { } ); }); + +describe('call_indirect type mismatch', () => { + test('passing wrong argument types to call_indirect should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + // Define a function that takes i32 and returns i32 + const target = mod.defineFunction('target', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + }); + + const table = mod.defineTable(ElementType.AnyFunc, 1, 1); + table.defineTableSegment([target], 0); + + // Define func type expecting i32 param + const funcType = mod.defineFuncType([ValueType.Int32], [ValueType.Int32]); + + // Call with f64 on stack instead of i32 + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.const_f64(3.14); // wrong type: should be i32 + a.const_i32(0); // table index + a.call_indirect(funcType); + }); + + mod.toBytes(); + }).toThrow(); + }); + + test('valid call_indirect with correct argument types', async () => { + const mod = new ModuleBuilder('test'); + const target = mod.defineFunction('target', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(100); + a.add_i32(); + }); + + const table = mod.defineTable(ElementType.AnyFunc, 1, 1); + table.defineTableSegment([target], 0); + + const funcType = mod.defineFuncType([ValueType.Int32], [ValueType.Int32]); + + mod.defineFunction('fn', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); // i32 param + a.const_i32(0); // table index + a.call_indirect(funcType); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn(5)).toBe(105); + }); + + test('call_indirect with multiple params - wrong type on one param', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + const target = mod.defineFunction('target', [ValueType.Int32], + [ValueType.Int32, ValueType.Float64], (f, a) => { + a.get_local(f.getParameter(0)); + }); + + const table = mod.defineTable(ElementType.AnyFunc, 1, 1); + table.defineTableSegment([target], 0); + + const funcType = mod.defineFuncType([ValueType.Int32], [ValueType.Int32, ValueType.Float64]); + + // Push i32 then i32 -- but second param should be f64 + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.const_i32(1); // param 0: i32 (correct) + a.const_i32(2); // param 1: i32 (wrong, should be f64) + a.const_i32(0); // table index + a.call_indirect(funcType); + }); + + mod.toBytes(); + }).toThrow(); + }); +}); + +describe('select type mismatch', () => { + test('select pops Any, Any, Int32 - using wrong condition type should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.const_i32(1); + a.const_i32(2); + a.const_f32(1.0); // condition must be i32, not f32 + a.select(); + }); + mod.toBytes(); + }).toThrow(); + }); + + test('valid select with matching value types', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.const_i32(100); + a.const_i32(200); + a.get_local(f.getParameter(0)); + a.select(); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn(1)).toBe(100); + expect(fn(0)).toBe(200); + }); + + test('select with f64 values and i32 condition should validate', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Float64], [ValueType.Int32], (f, a) => { + a.const_f64(1.5); + a.const_f64(2.5); + a.get_local(f.getParameter(0)); + a.select(); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn(1)).toBe(1.5); + expect(fn(0)).toBe(2.5); + }); + + test('select with i64 values and i32 condition should validate', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int64], [ValueType.Int32], (f, a) => { + a.const_i64(100n); + a.const_i64(200n); + a.get_local(f.getParameter(0)); + a.select(); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn(1)).toBe(100n); + expect(fn(0)).toBe(200n); + }); +}); + +describe('Multiple return values not supported (mvp)', () => { + test('defining a function that returns 2 values should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + mod.defineFunction('fn', [ValueType.Int32, ValueType.Int32], [], (f, a) => { + a.const_i32(1); + a.const_i32(2); + }); + }).toThrow(/zero to one/i); + }); + + test('defineFuncType with 2 return values should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + mod.defineFuncType([ValueType.Int32, ValueType.Float32], []); + }).toThrow(/zero to one/i); + }); + + test('defineFuncType with 3 return values should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test', { target: 'mvp' }); + mod.defineFuncType([ValueType.Int32, ValueType.Float32, ValueType.Float64], []); + }).toThrow(/zero to one/i); + }); + + test('defining a function with exactly 1 return value is valid', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.const_i32(42); + }); + mod.toBytes(); + }).not.toThrow(); + }); + + test('defining a function with 0 return values is valid', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', null, [], (f, a) => { + a.nop(); + }); + mod.toBytes(); + }).not.toThrow(); + }); +}); + +describe('get_global type checking', () => { + test('using an f64 global where i32 is expected should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Float64, false, 3.14); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.get_global(g); // pushes f64 + a.const_i32(1); // pushes i32 + a.add_i32(); // expects two i32 values - should throw + }); + mod.toBytes(); + }).toThrow(); + }); + + test('using an i32 global where i32 is expected should pass', async () => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Int32, false, 10); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.get_global(g); // pushes i32 + a.const_i32(5); // pushes i32 + a.add_i32(); // expects two i32 values + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBe(15); + }); + + test('using an i64 global in an i32 operation should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Int64, false, 100); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.get_global(g); // pushes i64 + a.const_i32(1); // pushes i32 + a.add_i32(); // expects two i32 values - should throw + }); + mod.toBytes(); + }).toThrow(); + }); + + test('get_global followed by correct-type operation should pass', async () => { + const mod = new ModuleBuilder('test'); + const g = mod.defineGlobal(ValueType.Float64, false, 2.5); + mod.defineFunction('fn', [ValueType.Float64], [], (f, a) => { + a.get_global(g); // pushes f64 + a.const_f64(1.5); // pushes f64 + a.add_f64(); // expects two f64 values + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBeCloseTo(4.0); + }); + + test('imported global with wrong type in operation should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + const g = mod.importGlobal('env', 'myGlobal', ValueType.Float32, false); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.get_global(g); // pushes f32 + a.const_i32(1); // pushes i32 + a.add_i32(); // expects two i32 values - should throw + }); + mod.toBytes(); + }).toThrow(); + }); +}); + +describe('Instructions after unreachable', () => { + test('dead code after return should compile fine', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.const_i32(42); + a.return(); + // Dead code after return -- should not cause verification error + a.const_i32(99); + a.const_i32(100); + a.add_i32(); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBe(42); + }); + + test('unreachable opcode followed by nop in a void block should compile', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', null, [], (f, a) => { + a.block(BlockType.Void, () => { + a.unreachable(); + // After unreachable, the wasm stack is polymorphic + a.nop(); + }); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); + + test('return in void function should compile', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', null, [], (f, a) => { + a.return(); + a.nop(); // dead code + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + }); + + test('return with correct value in non-void function should compile', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.const_i32(10); + a.gt_i32(); + a.if(BlockType.Void, () => { + a.const_i32(999); + a.return(); + }); + a.get_local(f.getParameter(0)); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn(5)).toBe(5); + expect(fn(20)).toBe(999); + }); +}); + +describe('tee_local type', () => { + test('tee_local should preserve value on stack with correct type', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + const local = a.declareLocal(ValueType.Int32, 'x'); + a.const_i32(42); + a.tee_local(local); + // tee_local leaves the value on the stack; the stack now has i32 + // We can use it directly for the return value + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBe(42); + }); + + test('tee_local with f64 preserves f64 on stack', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Float64], [], (f, a) => { + const local = a.declareLocal(ValueType.Float64, 'x'); + a.const_f64(3.14); + a.tee_local(local); + // f64 should still be on the stack + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBeCloseTo(3.14); + }); + + test('tee_local followed by operation using that type should work', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + const local = a.declareLocal(ValueType.Int32, 'x'); + a.const_i32(21); + a.tee_local(local); + // i32 remains on stack after tee_local + a.get_local(local); // also i32 + a.add_i32(); // i32 + i32 = i32 + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBe(42); + }); + + test('tee_local preserves correct type through further operations', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [ValueType.Int32], (f, a) => { + const temp = a.declareLocal(ValueType.Int32, 'temp'); + a.get_local(f.getParameter(0)); + a.tee_local(temp); + // After tee_local, value is on stack AND in temp + a.get_local(temp); + a.mul_i32(); // param * param + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn(5)).toBe(25); + expect(fn(7)).toBe(49); + }); + + test('tee_local with i64 type', async () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int64], [], (f, a) => { + const local = a.declareLocal(ValueType.Int64, 'x'); + a.const_i64(12345n); + a.tee_local(local); + }).withExport(); + + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const fn = instance.instance.exports.fn as CallableFunction; + expect(fn()).toBe(12345n); + }); +}); + +describe('Function return type mismatch', () => { + test('function returning f32 instead of i32 should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + a.const_f32(3.14); // f32 instead of expected i32 + }); + mod.toBytes(); + }).toThrow(); + }); + + test('void function with leftover value on stack should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', null, [], (f, a) => { + a.const_i32(42); // leftover value + }); + mod.toBytes(); + }).toThrow(); + }); + + test('function expecting return value but stack is empty should throw', () => { + expect(() => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('fn', [ValueType.Int32], [], (f, a) => { + // nothing pushed + a.nop(); + }); + mod.toBytes(); + }).toThrow(); + }); +}); diff --git a/tests/TextModuleWriter.test.ts b/tests/TextModuleWriter.test.ts index aec6adb..d2e08ff 100644 --- a/tests/TextModuleWriter.test.ts +++ b/tests/TextModuleWriter.test.ts @@ -130,3 +130,154 @@ test('TextModuleWriter - block/loop indentation', () => { expect(text).toContain('loop'); expect(text).toContain('end'); }); + +describe('TextModuleWriter formatting', () => { + test('function with no body outputs single line', () => { + const mod = new ModuleBuilder('test', { disableVerification: true }); + mod.defineFunction('empty', null, []); + const wat = mod.toString(); + expect(wat).toContain('(func $empty'); + expect(wat).toContain(')'); + }); + + test('function with locals in WAT output', () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('withLocals', [ValueType.Int32], [], (f, a) => { + const x = a.declareLocal(ValueType.Int32); + a.const_i32(5); + a.set_local(x); + a.get_local(x); + }).withExport(); + const wat = mod.toString(); + expect(wat).toContain('(local i32)'); + }); + + test('block with result type in WAT output', () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('blockResult', [ValueType.Int32], [], (f, a) => { + const label = a.block(BlockType.Int32); + a.const_i32(42); + a.br(label); + a.end(); + }).withExport(); + const wat = mod.toString(); + expect(wat).toContain('block'); + expect(wat).toContain('(result i32)'); + }); + + test('if/else indentation in WAT output', () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('ifElse', [ValueType.Int32], [ValueType.Int32], (f, a) => { + a.get_local(f.getParameter(0)); + a.if(BlockType.Int32); + a.const_i32(1); + a.else(); + a.const_i32(0); + a.end(); + }).withExport(); + const wat = mod.toString(); + expect(wat).toContain('if'); + expect(wat).toContain('else'); + expect(wat).toContain('end'); + }); + + test('memory immediate offset/align in WAT output', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1); + mod.defineFunction('loadAligned', [ValueType.Int32], [], (f, a) => { + a.const_i32(8); + a.load_i32(2, 4); + }).withExport(); + const wat = mod.toString(); + expect(wat).toContain('offset='); + expect(wat).toContain('align='); + }); + + test('WAT output for start section', () => { + const mod = new ModuleBuilder('test'); + const init = mod.defineFunction('init', null, [], (f, a) => {}); + mod.setStartFunction(init); + const wat = mod.toString(); + expect(wat).toContain('(start'); + }); + + test('WAT global init expression with get_global', () => { + const mod = new ModuleBuilder('test', { disableVerification: true }); + const base = mod.defineGlobal(ValueType.Int32, false, 10); + const g = mod.defineGlobal(ValueType.Int32, false); + g.value(base); + const wat = mod.toString(); + expect(wat).toContain('global.get'); + }); +}); + +describe('TextModuleWriter sections', () => { + test('WAT output for imported table', () => { + const mod = new ModuleBuilder('test'); + mod.importTable('env', 'tbl', ElementType.AnyFunc, 2, 10); + mod.defineFunction('noop', null, [], (f, a) => {}).withExport(); + const text = mod.toString(); + + expect(text).toContain('(import "env" "tbl"'); + expect(text).toContain('(table'); + expect(text).toContain('anyfunc'); + expect(text).toContain('2 10'); + }); + + test('WAT output for imported memory', () => { + const mod = new ModuleBuilder('test'); + mod.importMemory('env', 'mem', 1, 16); + mod.defineFunction('noop', null, [], (f, a) => {}).withExport(); + const text = mod.toString(); + + expect(text).toContain('(import "env" "mem"'); + expect(text).toContain('(memory'); + expect(text).toContain('1 16'); + }); + + test('WAT output for imported global (mutable)', () => { + const mod = new ModuleBuilder('test'); + mod.importGlobal('env', 'g', ValueType.Int32, true); + mod.defineFunction('noop', null, [], (f, a) => {}).withExport(); + const text = mod.toString(); + + expect(text).toContain('(import "env" "g"'); + expect(text).toContain('(global'); + expect(text).toContain('(mut i32)'); + }); + + test('WAT output for element segment', () => { + const mod = new ModuleBuilder('test'); + const fn1 = mod.defineFunction('fn1', [ValueType.Int32], [], (f, a) => { + a.const_i32(1); + }); + const fn2 = mod.defineFunction('fn2', [ValueType.Int32], [], (f, a) => { + a.const_i32(2); + }); + const table = mod.defineTable(ElementType.AnyFunc, 2, 2); + table.defineTableSegment([fn1, fn2], 0); + mod.defineFunction('noop', null, [], (f, a) => {}).withExport(); + const text = mod.toString(); + + expect(text).toContain('(elem'); + expect(text).toContain('i32.const 0'); + expect(text).toContain('func'); + }); + + test('WAT output with non-ASCII data - bytes < 0x20 should be escaped', () => { + const mod = new ModuleBuilder('test'); + mod.defineFunction('noop', null, [], (f, a) => {}).withExport(); + // Data with bytes that need escaping: 0x00, 0x01, 0x0a (newline), 0x1f + mod.defineData(new Uint8Array([0x00, 0x01, 0x0a, 0x1f, 0x41]), 0); + mod.defineMemory(1); + const text = mod.toString(); + + // Bytes < 0x20 should be escaped as \XX hex + expect(text).toContain('\\00'); + expect(text).toContain('\\01'); + expect(text).toContain('\\0a'); + expect(text).toContain('\\1f'); + // 0x41 = 'A', should appear as literal + expect(text).toContain('A'); + }); +}); diff --git a/tests/ThreadsAndSharedMemory.test.ts b/tests/ThreadsAndSharedMemory.test.ts new file mode 100644 index 0000000..55a38be --- /dev/null +++ b/tests/ThreadsAndSharedMemory.test.ts @@ -0,0 +1,123 @@ +import ModuleBuilder from '../src/ModuleBuilder'; +import { ValueType } from '../src/types'; + +// ─── Shared Memory ────────────────────────────────────────────────── + +describe('Shared memory', () => { + test('shared memory requires maximum size', () => { + const mod = new ModuleBuilder('test'); + expect(() => mod.defineMemory(1, null, true)).toThrow(/maximum/i); + }); + + test('shared memory with max compiles', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 10, true); + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + }); + + test('shared memory WAT output', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 10, true); + const wat = mod.toString(); + expect(wat).toContain('shared'); + expect(wat).toContain('1 10'); + }); + + test('shared memory binary encoding has correct flag byte', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 10, true); + const bytes = mod.toBytes(); + const bytesArray = Array.from(bytes); + // Flag byte: has_max | shared = 0b11 = 3 + expect(bytesArray).toContain(3); + }); + + test('non-shared memory does not have shared flag', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 10); + const wat = mod.toString(); + expect(wat).not.toContain('shared'); + }); + + test('shared imported memory', () => { + const mod = new ModuleBuilder('test'); + mod.importMemory('env', 'memory', 1, 256, true); + const bytes = mod.toBytes(); + expect(bytes).toBeTruthy(); + }); +}); + +// ─── Atomic Emitter Integration ───────────────────────────────────── + +describe('Atomic emitter integration', () => { + test('atomic_load_i32 emits correctly', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 10, true); + const fn = mod.defineFunction('test', ValueType.Int32, [], (f, asm) => { + asm.const_i32(0); + asm.atomic_load_i32(2, 0); + }); + mod.exportFunction(fn); + expect(() => mod.toBytes()).not.toThrow(); + }); + + test('atomic_store_i32 emits correctly', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 10, true); + const fn = mod.defineFunction('test', null, [], (f, asm) => { + asm.const_i32(0); + asm.const_i32(42); + asm.atomic_store_i32(2, 0); + }); + mod.exportFunction(fn); + expect(() => mod.toBytes()).not.toThrow(); + }); + + test('atomic_rmw_add_i32 emits correctly', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 10, true); + const fn = mod.defineFunction('test', ValueType.Int32, [], (f, asm) => { + asm.const_i32(0); + asm.const_i32(1); + asm.atomic_rmw_add_i32(2, 0); + }); + mod.exportFunction(fn); + expect(() => mod.toBytes()).not.toThrow(); + }); + + test('atomic_rmw_cmpxchg_i32 emits correctly', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 10, true); + const fn = mod.defineFunction('test', ValueType.Int32, [], (f, asm) => { + asm.const_i32(0); + asm.const_i32(0); + asm.const_i32(1); + asm.atomic_rmw_cmpxchg_i32(2, 0); + }); + mod.exportFunction(fn); + expect(() => mod.toBytes()).not.toThrow(); + }); + + test('atomic_fence emits correctly', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 10, true); + const fn = mod.defineFunction('test', null, [], (f, asm) => { + asm.atomic_fence(0); + }); + mod.exportFunction(fn); + expect(() => mod.toBytes()).not.toThrow(); + }); + + test('atomic WAT output contains mnemonics', () => { + const mod = new ModuleBuilder('test'); + mod.defineMemory(1, 10, true); + const fn = mod.defineFunction('test', ValueType.Int32, [], (f, asm) => { + asm.const_i32(0); + asm.atomic_load_i32(2, 0); + }); + mod.exportFunction(fn); + const wat = mod.toString(); + expect(wat).toContain('i32.atomic.load'); + }); +}); diff --git a/tests/WatParser.test.ts b/tests/WatParser.test.ts index 1d1aa9e..54b58b3 100644 --- a/tests/WatParser.test.ts +++ b/tests/WatParser.test.ts @@ -1,4 +1,4 @@ -import { parseWat, ModuleBuilder, ValueType, TextModuleWriter, BinaryReader } from '../src/index'; +import { parseWat, ModuleBuilder, ValueType, TextModuleWriter, BinaryReader, ExternalKind } from '../src/index'; test('WAT Parser - simple add function', async () => { const wat = ` @@ -381,3 +381,932 @@ test('WAT Parser - param names preserved in name section', async () => { const myFunc = instance.instance.exports.myFunc as CallableFunction; expect(myFunc(3, 4)).toBe(7); }); + +test('WAT Parser - block comments are ignored', () => { + const wat = ` + (module $test + (; This is a block comment ;) + (func $f (result i32) + i32.const 77 + ) + (export "f" (func $f)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); +}); + +test('WAT Parser - nested block comments are handled', () => { + const wat = ` + (module $test + (; outer (; inner ;) still outer ;) + (func $f (result i32) + i32.const 55 + ) + (export "f" (func $f)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); +}); + +test('WAT Parser - block comment with nested block comment produces correct value', async () => { + const wat = ` + (module $test + (; a (; deeply ;) nested comment ;) + (func $f (result i32) + i32.const 123 + ) + (export "f" (func $f)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const f = instance.instance.exports.f as CallableFunction; + expect(f()).toBe(123); +}); + +test('WAT Parser - import table', () => { + const wat = ` + (module $test + (import "env" "tbl" (table 1 10 anyfunc)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + // Verify the import was registered + const tableImports = mod._imports.filter( + (imp) => imp.externalKind === ExternalKind.Table + ); + expect(tableImports.length).toBe(1); + expect(tableImports[0].moduleName).toBe('env'); + expect(tableImports[0].fieldName).toBe('tbl'); +}); + +test('WAT Parser - import table with no maximum', () => { + const wat = ` + (module $test + (import "env" "tbl" (table 1 funcref)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); +}); + +test('WAT Parser - import memory with min and max', () => { + const wat = ` + (module $test + (import "env" "mem" (memory 1 2)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const memImports = mod._imports.filter( + (imp) => imp.externalKind === ExternalKind.Memory + ); + expect(memImports.length).toBe(1); + expect(memImports[0].moduleName).toBe('env'); + expect(memImports[0].fieldName).toBe('mem'); +}); + +test('WAT Parser - import memory with min only', () => { + const wat = ` + (module $test + (import "env" "mem" (memory 1)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); +}); + +test('WAT Parser - import immutable global', () => { + const wat = ` + (module $test + (import "env" "g" (global i32)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const globalImports = mod._imports.filter( + (imp) => imp.externalKind === ExternalKind.Global + ); + expect(globalImports.length).toBe(1); + expect(globalImports[0].moduleName).toBe('env'); + expect(globalImports[0].fieldName).toBe('g'); +}); + +test('WAT Parser - import mutable global', () => { + const wat = ` + (module $test + (import "env" "g" (global (mut i32))) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const globalImports = mod._imports.filter( + (imp) => imp.externalKind === ExternalKind.Global + ); + expect(globalImports.length).toBe(1); +}); + +test('WAT Parser - import mutable global can be used by function', async () => { + const wat = ` + (module $test + (import "env" "g" (global (mut i32))) + (func $read (result i32) + global.get 0 + ) + (export "read" (func $read)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const g = new WebAssembly.Global({ value: 'i32', mutable: true }, 99); + const instance = await mod.instantiate({ env: { g } }); + const read = instance.instance.exports.read as CallableFunction; + expect(read()).toBe(99); +}); + +test('WAT Parser - export table', () => { + const wat = ` + (module $test + (table 2 funcref) + (export "tbl" (table 0)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const tableExports = mod._exports.filter( + (exp) => exp.externalKind === ExternalKind.Table + ); + expect(tableExports.length).toBe(1); + expect(tableExports[0].name).toBe('tbl'); +}); + +test('WAT Parser - export table is accessible at runtime', async () => { + const wat = ` + (module $test + (table 4 funcref) + (export "tbl" (table 0)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + expect(instance.instance.exports.tbl).toBeInstanceOf(WebAssembly.Table); +}); + +test('WAT Parser - export immutable global', () => { + const wat = ` + (module $test + (global i32 (i32.const 42)) + (export "g" (global 0)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const globalExports = mod._exports.filter( + (exp) => exp.externalKind === ExternalKind.Global + ); + expect(globalExports.length).toBe(1); + expect(globalExports[0].name).toBe('g'); +}); + +test('WAT Parser - export immutable global is accessible at runtime', async () => { + const wat = ` + (module $test + (global i32 (i32.const 42)) + (export "g" (global 0)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const g = instance.instance.exports.g as WebAssembly.Global; + expect(g.value).toBe(42); +}); + +test('WAT Parser - export named global by $name', async () => { + const wat = ` + (module $test + (global $myGlobal i32 (i32.const 7)) + (export "g" (global $myGlobal)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const g = instance.instance.exports.g as WebAssembly.Global; + expect(g.value).toBe(7); +}); + +test('WAT Parser - mutable global with get and set', async () => { + const wat = ` + (module $test + (global (mut i32) (i32.const 0)) + (func $inc (result i32) + global.get 0 + i32.const 10 + i32.add + global.set 0 + global.get 0 + ) + (export "inc" (func $inc)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const inc = instance.instance.exports.inc as CallableFunction; + expect(inc()).toBe(10); + expect(inc()).toBe(20); + expect(inc()).toBe(30); +}); + +test('WAT Parser - mutable global with $name', async () => { + const wat = ` + (module $test + (global $counter (mut i32) (i32.const 100)) + (func $get (result i32) + global.get $counter + ) + (export "get" (func $get)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const get = instance.instance.exports.get as CallableFunction; + expect(get()).toBe(100); +}); + +test('WAT Parser - f64 immutable global', async () => { + const wat = ` + (module $test + (global f64 (f64.const 3.14)) + (export "pi" (global 0)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const pi = instance.instance.exports.pi as WebAssembly.Global; + expect(pi.value).toBeCloseTo(3.14, 10); +}); + +test('WAT Parser - f64 global read from function', async () => { + const wat = ` + (module $test + (global $pi f64 (f64.const 3.14159)) + (func $getPi (result f64) + global.get $pi + ) + (export "getPi" (func $getPi)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const getPi = instance.instance.exports.getPi as CallableFunction; + expect(getPi()).toBeCloseTo(3.14159, 5); +}); + +test('WAT Parser - br_table with numeric depth targets', async () => { + const wat = ` + (module $test + (func $switch (param i32) (result i32) + (local i32) + block $case2 + block $case1 + block $case0 + local.get 0 + br_table 0 1 2 + end + i32.const 100 + local.set 1 + br $case2 + end + i32.const 200 + local.set 1 + br $case2 + end + local.get 1 + ) + (export "switch" (func $switch)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const sw = instance.instance.exports.switch as CallableFunction; + // br_table 0 1 2: targets=[0,1], default=2 + // index 0 -> br 0 (case0 end), sets 100 + expect(sw(0)).toBe(100); + // index 1 -> br 1 (case1 end), sets 200 + expect(sw(1)).toBe(200); + // index 2+ -> br 2 (case2 end), local stays 0 + expect(sw(2)).toBe(0); +}); + +test('WAT Parser - f32 hex float literal', async () => { + const wat = ` + (module $test + (func $getVal (result f32) + f32.const 0x1.8p+1 + ) + (export "getVal" (func $getVal)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const getVal = instance.instance.exports.getVal as CallableFunction; + // 0x1.8 = 1.5, p+1 means * 2^1 = 3.0 + expect(getVal()).toBeCloseTo(3.0, 5); +}); + +test('WAT Parser - f64 hex float literal', async () => { + const wat = ` + (module $test + (func $getVal (result f64) + f64.const 0x1.0p+4 + ) + (export "getVal" (func $getVal)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const getVal = instance.instance.exports.getVal as CallableFunction; + // 0x1.0 = 1.0, p+4 means * 2^4 = 16.0 + expect(getVal()).toBeCloseTo(16.0, 10); +}); + +test('WAT Parser - negative hex float literal', async () => { + const wat = ` + (module $test + (func $getVal (result f64) + f64.const -0x1.4p+3 + ) + (export "getVal" (func $getVal)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const getVal = instance.instance.exports.getVal as CallableFunction; + // 0x1.4 = 1.25, p+3 means * 2^3 = 10.0, negative = -10.0 + expect(getVal()).toBeCloseTo(-10.0, 10); +}); + +test('WAT Parser - named type used with call_indirect', async () => { + const wat = ` + (module $test + (type $sig (func (param i32) (result i32))) + (func $double (param i32) (result i32) + local.get 0 + i32.const 2 + i32.mul + ) + (table 1 funcref) + (elem (i32.const 0) func $double) + (func $callIt (param i32) (result i32) + local.get 0 + i32.const 0 + call_indirect (type $sig) + ) + (export "callIt" (func $callIt)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const callIt = instance.instance.exports.callIt as CallableFunction; + expect(callIt(7)).toBe(14); + expect(callIt(100)).toBe(200); +}); + +test('WAT Parser - named type defines type section entry', () => { + const wat = ` + (module $test + (type $sig (func (param i32) (result i32))) + ) + `; + + const mod = parseWat(wat); + expect(mod._types.length).toBeGreaterThanOrEqual(1); + expect(mod._types[0].parameterTypes).toEqual([ValueType.Int32]); + expect(mod._types[0].returnTypes).toEqual([ValueType.Int32]); +}); + +test('WAT Parser - multiple named types', () => { + const wat = ` + (module $test + (type $void_void (func)) + (type $i32_i32 (func (param i32) (result i32))) + (type $two_params (func (param i32) (param i32) (result i32))) + ) + `; + + const mod = parseWat(wat); + expect(mod._types.length).toBe(3); + expect(mod._types[0].parameterTypes).toEqual([]); + expect(mod._types[0].returnTypes).toEqual([]); + expect(mod._types[1].parameterTypes).toEqual([ValueType.Int32]); + expect(mod._types[1].returnTypes).toEqual([ValueType.Int32]); + expect(mod._types[2].parameterTypes).toEqual([ValueType.Int32, ValueType.Int32]); + expect(mod._types[2].returnTypes).toEqual([ValueType.Int32]); +}); + +test('WAT Parser - memory with initial and maximum', () => { + const wat = ` + (module $test + (memory 1 10) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + expect(mod._memories.length).toBe(1); +}); + +test('WAT Parser - memory with max can be instantiated', async () => { + const wat = ` + (module $test + (memory 1 10) + (export "mem" (memory 0)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const mem = instance.instance.exports.mem as WebAssembly.Memory; + expect(mem).toBeInstanceOf(WebAssembly.Memory); + expect(mem.buffer.byteLength).toBe(65536); // 1 page = 64KB +}); + +test('WAT Parser - data segment with escape sequences', async () => { + const wat = ` + (module $test + (memory 1) + (data (i32.const 0) "hello\\00\\n\\t") + (func $load (param i32) (result i32) + local.get 0 + i32.load8_u + ) + (export "load" (func $load)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const load = instance.instance.exports.load as CallableFunction; + + // 'h' = 104, 'e' = 101, 'l' = 108, 'l' = 108, 'o' = 111 + expect(load(0)).toBe(104); // h + expect(load(1)).toBe(101); // e + expect(load(2)).toBe(108); // l + expect(load(3)).toBe(108); // l + expect(load(4)).toBe(111); // o + expect(load(5)).toBe(0); // \00 + expect(load(6)).toBe(10); // \n + expect(load(7)).toBe(9); // \t +}); + +test('WAT Parser - data segment with hex escape bytes', async () => { + const wat = ` + (module $test + (memory 1) + (data (i32.const 0) "\\41\\42\\43") + (func $load (param i32) (result i32) + local.get 0 + i32.load8_u + ) + (export "load" (func $load)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const load = instance.instance.exports.load as CallableFunction; + + // \41 = 'A' (65), \42 = 'B' (66), \43 = 'C' (67) + expect(load(0)).toBe(65); + expect(load(1)).toBe(66); + expect(load(2)).toBe(67); +}); + +test('WAT Parser - multiple data segments', async () => { + const wat = ` + (module $test + (memory 1) + (data (i32.const 0) "abc") + (data (i32.const 100) "xyz") + (func $load (param i32) (result i32) + local.get 0 + i32.load8_u + ) + (export "load" (func $load)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + // Verify two data segments were created + expect(mod._data.length).toBe(2); + + const instance = await mod.instantiate(); + const load = instance.instance.exports.load as CallableFunction; + + // First segment at offset 0 + expect(load(0)).toBe(97); // 'a' + expect(load(1)).toBe(98); // 'b' + expect(load(2)).toBe(99); // 'c' + + // Second segment at offset 100 + expect(load(100)).toBe(120); // 'x' + expect(load(101)).toBe(121); // 'y' + expect(load(102)).toBe(122); // 'z' +}); + +test('WAT Parser - multiple data segments with different offsets', async () => { + const wat = ` + (module $test + (memory 1) + (data (i32.const 0) "first") + (data (i32.const 10) "second") + (data (i32.const 20) "third") + (func $load (param i32) (result i32) + local.get 0 + i32.load8_u + ) + (export "load" (func $load)) + ) + `; + + const mod = parseWat(wat); + expect(mod._data.length).toBe(3); + + const instance = await mod.instantiate(); + const load = instance.instance.exports.load as CallableFunction; + + // "first" at offset 0 + expect(load(0)).toBe(102); // 'f' + // "second" at offset 10 + expect(load(10)).toBe(115); // 's' + // "third" at offset 20 + expect(load(20)).toBe(116); // 't' +}); + +test('WAT Parser - i64 immutable global', () => { + const wat = ` + (module $test + (global i64 (i64.const 42)) + (export "g" (global 0)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + expect(mod._globals.length).toBe(1); + expect(mod._globals[0].valueType).toBe(ValueType.Int64); +}); + +test('WAT Parser - i64 global read from function', async () => { + const wat = ` + (module $test + (global i64 (i64.const 42)) + (func $getG (result i64) + global.get 0 + ) + (export "getG" (func $getG)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const getG = instance.instance.exports.getG as CallableFunction; + expect(getG()).toBe(42n); +}); + +test('WAT Parser - i64 mutable global', async () => { + const wat = ` + (module $test + (global (mut i64) (i64.const 0)) + (func $setAndGet (param i64) (result i64) + local.get 0 + global.set 0 + global.get 0 + ) + (export "setAndGet" (func $setAndGet)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const setAndGet = instance.instance.exports.setAndGet as CallableFunction; + expect(setAndGet(99n)).toBe(99n); +}); + +test('WAT Parser - unknown section is skipped without error', () => { + const wat = ` + (module $test + (custom "this is a custom section that should be skipped") + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); +}); + +test('WAT Parser - unknown section among valid sections', async () => { + const wat = ` + (module $test + (custom "metadata" "some value") + (func $f (result i32) + i32.const 42 + ) + (export "f" (func $f)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const f = instance.instance.exports.f as CallableFunction; + expect(f()).toBe(42); +}); + +test('WAT Parser - multiple unknown sections are skipped', () => { + const wat = ` + (module $test + (custom "one") + (custom "two" (nested "thing")) + (custom "three") + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); +}); + +test('WAT Parser - f32 global', async () => { + const wat = ` + (module $test + (global f32 (f32.const 2.5)) + (export "g" (global 0)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const instance = await mod.instantiate(); + const g = instance.instance.exports.g as WebAssembly.Global; + expect(g.value).toBeCloseTo(2.5, 5); +}); + +test('WAT Parser - import global f64 immutable', () => { + const wat = ` + (module $test + (import "env" "pi" (global f64)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + const globalImports = mod._imports.filter( + (imp) => imp.externalKind === ExternalKind.Global + ); + expect(globalImports.length).toBe(1); +}); + +test('WAT Parser - import global mutable i64', () => { + const wat = ` + (module $test + (import "env" "counter" (global (mut i64))) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); +}); + +test('WAT Parser - combined imports of different kinds', () => { + const wat = ` + (module $test + (import "env" "log" (func $log (param i32))) + (import "env" "mem" (memory 1 4)) + (import "env" "tbl" (table 1 anyfunc)) + (import "env" "g" (global i32)) + (import "env" "mg" (global (mut i32))) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + expect(mod._imports.length).toBe(5); + expect(mod._imports.filter((i) => i.externalKind === ExternalKind.Function).length).toBe(1); + expect(mod._imports.filter((i) => i.externalKind === ExternalKind.Memory).length).toBe(1); + expect(mod._imports.filter((i) => i.externalKind === ExternalKind.Table).length).toBe(1); + expect(mod._imports.filter((i) => i.externalKind === ExternalKind.Global).length).toBe(2); +}); + +test('WAT Parser - block comment inside a function body', async () => { + const wat = ` + (module $test + (func $f (result i32) + (; This comment is inside the function body ;) + i32.const 1 + i32.const 2 + (; Another block comment ;) + i32.add + ) + (export "f" (func $f)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const f = instance.instance.exports.f as CallableFunction; + expect(f()).toBe(3); +}); + +test('WAT Parser - multiple globals of different types', async () => { + const wat = ` + (module $test + (global $gi i32 (i32.const 10)) + (global $gl i64 (i64.const 20)) + (global $gf f32 (f32.const 1.5)) + (global $gd f64 (f64.const 2.5)) + (func $getI32 (result i32) + global.get $gi + ) + (func $getI64 (result i64) + global.get $gl + ) + (func $getF32 (result f32) + global.get $gf + ) + (func $getF64 (result f64) + global.get $gd + ) + (export "getI32" (func $getI32)) + (export "getI64" (func $getI64)) + (export "getF32" (func $getF32)) + (export "getF64" (func $getF64)) + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); + + expect(mod._globals.length).toBe(4); + expect(mod._globals[0].valueType).toBe(ValueType.Int32); + expect(mod._globals[1].valueType).toBe(ValueType.Int64); + expect(mod._globals[2].valueType).toBe(ValueType.Float32); + expect(mod._globals[3].valueType).toBe(ValueType.Float64); + + const instance = await mod.instantiate(); + const getI32 = instance.instance.exports.getI32 as CallableFunction; + const getI64 = instance.instance.exports.getI64 as CallableFunction; + const getF32 = instance.instance.exports.getF32 as CallableFunction; + const getF64 = instance.instance.exports.getF64 as CallableFunction; + + expect(getI32()).toBe(10); + expect(getI64()).toBe(20n); + expect(getF32()).toBeCloseTo(1.5, 5); + expect(getF64()).toBeCloseTo(2.5, 10); +}); + +test('WAT Parser - named type with func using type index', async () => { + const wat = ` + (module $test + (type $binop (func (param i32) (param i32) (result i32))) + (func $add (type 0) + local.get 0 + local.get 1 + i32.add + ) + (export "add" (func $add)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const add = instance.instance.exports.add as CallableFunction; + expect(add(3, 4)).toBe(7); +}); + +test('WAT Parser - data segment with empty string', () => { + const wat = ` + (module $test + (memory 1) + (data (i32.const 0) "") + ) + `; + + const mod = parseWat(wat); + const bytes = mod.toBytes(); + expect(WebAssembly.validate(bytes.buffer as ArrayBuffer)).toBe(true); +}); + +test('WAT Parser - memory with max and exported with store/load', async () => { + const wat = ` + (module $test + (memory 2 8) + (func $store (param i32) (param i32) + local.get 0 + local.get 1 + i32.store offset=0 align=4 + ) + (func $load (param i32) (result i32) + local.get 0 + i32.load offset=0 align=4 + ) + (export "store" (func $store)) + (export "load" (func $load)) + (export "mem" (memory 0)) + ) + `; + + const mod = parseWat(wat); + const instance = await mod.instantiate(); + const store = instance.instance.exports.store as CallableFunction; + const load = instance.instance.exports.load as CallableFunction; + const mem = instance.instance.exports.mem as WebAssembly.Memory; + + // 2 pages = 128KB + expect(mem.buffer.byteLength).toBe(131072); + + store(0, 12345); + expect(load(0)).toBe(12345); +}); diff --git a/tests/generated/OpCodes.test.ts b/tests/generated/OpCodes.test.ts new file mode 100644 index 0000000..05c915b --- /dev/null +++ b/tests/generated/OpCodes.test.ts @@ -0,0 +1,6756 @@ +// AUTO-GENERATED — do not edit. Run `npm run generate` to regenerate. +import OpCodes from '../../src/OpCodes'; +import OpCodeEmitter from '../../src/OpCodeEmitter'; + +describe('OpCode definitions', () => { + test('total opcode count is 531', () => { + expect(Object.keys(OpCodes).length).toBe(531); + }); + + describe('control-flow', () => { + test('unreachable', () => { + const op = (OpCodes as any).unreachable; + expect(op).toBeDefined(); + expect(op.value).toBe(0); + expect(op.mnemonic).toBe("unreachable"); + }); + + test('nop', () => { + const op = (OpCodes as any).nop; + expect(op).toBeDefined(); + expect(op.value).toBe(1); + expect(op.mnemonic).toBe("nop"); + }); + + test('block', () => { + const op = (OpCodes as any).block; + expect(op).toBeDefined(); + expect(op.value).toBe(2); + expect(op.mnemonic).toBe("block"); + }); + + test('loop', () => { + const op = (OpCodes as any).loop; + expect(op).toBeDefined(); + expect(op.value).toBe(3); + expect(op.mnemonic).toBe("loop"); + }); + + test('if', () => { + const op = (OpCodes as any).if; + expect(op).toBeDefined(); + expect(op.value).toBe(4); + expect(op.mnemonic).toBe("if"); + }); + + test('else', () => { + const op = (OpCodes as any).else; + expect(op).toBeDefined(); + expect(op.value).toBe(5); + expect(op.mnemonic).toBe("else"); + }); + + test('end', () => { + const op = (OpCodes as any).end; + expect(op).toBeDefined(); + expect(op.value).toBe(11); + expect(op.mnemonic).toBe("end"); + }); + + test('br', () => { + const op = (OpCodes as any).br; + expect(op).toBeDefined(); + expect(op.value).toBe(12); + expect(op.mnemonic).toBe("br"); + }); + + test('br_if', () => { + const op = (OpCodes as any).br_if; + expect(op).toBeDefined(); + expect(op.value).toBe(13); + expect(op.mnemonic).toBe("br_if"); + }); + + test('br_table', () => { + const op = (OpCodes as any).br_table; + expect(op).toBeDefined(); + expect(op.value).toBe(14); + expect(op.mnemonic).toBe("br_table"); + }); + + test('return', () => { + const op = (OpCodes as any).return; + expect(op).toBeDefined(); + expect(op.value).toBe(15); + expect(op.mnemonic).toBe("return"); + }); + + }); + + describe('exception-handling', () => { + test('try', () => { + const op = (OpCodes as any).try; + expect(op).toBeDefined(); + expect(op.value).toBe(6); + expect(op.mnemonic).toBe("try"); + expect(op.feature).toBe("exception-handling"); + }); + + test('catch', () => { + const op = (OpCodes as any).catch; + expect(op).toBeDefined(); + expect(op.value).toBe(7); + expect(op.mnemonic).toBe("catch"); + expect(op.feature).toBe("exception-handling"); + }); + + test('throw', () => { + const op = (OpCodes as any).throw; + expect(op).toBeDefined(); + expect(op.value).toBe(8); + expect(op.mnemonic).toBe("throw"); + expect(op.feature).toBe("exception-handling"); + }); + + test('rethrow', () => { + const op = (OpCodes as any).rethrow; + expect(op).toBeDefined(); + expect(op.value).toBe(9); + expect(op.mnemonic).toBe("rethrow"); + expect(op.feature).toBe("exception-handling"); + }); + + test('delegate', () => { + const op = (OpCodes as any).delegate; + expect(op).toBeDefined(); + expect(op.value).toBe(24); + expect(op.mnemonic).toBe("delegate"); + expect(op.feature).toBe("exception-handling"); + }); + + test('catch_all', () => { + const op = (OpCodes as any).catch_all; + expect(op).toBeDefined(); + expect(op.value).toBe(25); + expect(op.mnemonic).toBe("catch_all"); + expect(op.feature).toBe("exception-handling"); + }); + + }); + + describe('call', () => { + test('call', () => { + const op = (OpCodes as any).call; + expect(op).toBeDefined(); + expect(op.value).toBe(16); + expect(op.mnemonic).toBe("call"); + }); + + test('call_indirect', () => { + const op = (OpCodes as any).call_indirect; + expect(op).toBeDefined(); + expect(op.value).toBe(17); + expect(op.mnemonic).toBe("call_indirect"); + }); + + test('return_call', () => { + const op = (OpCodes as any).return_call; + expect(op).toBeDefined(); + expect(op.value).toBe(18); + expect(op.mnemonic).toBe("return_call"); + expect(op.feature).toBe("tail-call"); + }); + + test('return_call_indirect', () => { + const op = (OpCodes as any).return_call_indirect; + expect(op).toBeDefined(); + expect(op.value).toBe(19); + expect(op.mnemonic).toBe("return_call_indirect"); + expect(op.feature).toBe("tail-call"); + }); + + }); + + describe('parametric', () => { + test('drop', () => { + const op = (OpCodes as any).drop; + expect(op).toBeDefined(); + expect(op.value).toBe(26); + expect(op.mnemonic).toBe("drop"); + }); + + test('select', () => { + const op = (OpCodes as any).select; + expect(op).toBeDefined(); + expect(op.value).toBe(27); + expect(op.mnemonic).toBe("select"); + }); + + }); + + describe('variable', () => { + test('get_local', () => { + const op = (OpCodes as any).get_local; + expect(op).toBeDefined(); + expect(op.value).toBe(32); + expect(op.mnemonic).toBe("local.get"); + }); + + test('set_local', () => { + const op = (OpCodes as any).set_local; + expect(op).toBeDefined(); + expect(op.value).toBe(33); + expect(op.mnemonic).toBe("local.set"); + }); + + test('tee_local', () => { + const op = (OpCodes as any).tee_local; + expect(op).toBeDefined(); + expect(op.value).toBe(34); + expect(op.mnemonic).toBe("local.tee"); + }); + + test('get_global', () => { + const op = (OpCodes as any).get_global; + expect(op).toBeDefined(); + expect(op.value).toBe(35); + expect(op.mnemonic).toBe("global.get"); + }); + + test('set_global', () => { + const op = (OpCodes as any).set_global; + expect(op).toBeDefined(); + expect(op.value).toBe(36); + expect(op.mnemonic).toBe("global.set"); + }); + + }); + + describe('memory', () => { + test('i32_load', () => { + const op = (OpCodes as any).i32_load; + expect(op).toBeDefined(); + expect(op.value).toBe(40); + expect(op.mnemonic).toBe("i32.load"); + }); + + test('i64_load', () => { + const op = (OpCodes as any).i64_load; + expect(op).toBeDefined(); + expect(op.value).toBe(41); + expect(op.mnemonic).toBe("i64.load"); + }); + + test('f32_load', () => { + const op = (OpCodes as any).f32_load; + expect(op).toBeDefined(); + expect(op.value).toBe(42); + expect(op.mnemonic).toBe("f32.load"); + }); + + test('f64_load', () => { + const op = (OpCodes as any).f64_load; + expect(op).toBeDefined(); + expect(op.value).toBe(43); + expect(op.mnemonic).toBe("f64.load"); + }); + + test('i32_load8_s', () => { + const op = (OpCodes as any).i32_load8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(44); + expect(op.mnemonic).toBe("i32.load8_s"); + }); + + test('i32_load8_u', () => { + const op = (OpCodes as any).i32_load8_u; + expect(op).toBeDefined(); + expect(op.value).toBe(45); + expect(op.mnemonic).toBe("i32.load8_u"); + }); + + test('i32_load16_s', () => { + const op = (OpCodes as any).i32_load16_s; + expect(op).toBeDefined(); + expect(op.value).toBe(46); + expect(op.mnemonic).toBe("i32.load16_s"); + }); + + test('i32_load16_u', () => { + const op = (OpCodes as any).i32_load16_u; + expect(op).toBeDefined(); + expect(op.value).toBe(47); + expect(op.mnemonic).toBe("i32.load16_u"); + }); + + test('i64_load8_s', () => { + const op = (OpCodes as any).i64_load8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(48); + expect(op.mnemonic).toBe("i64.load8_s"); + }); + + test('i64_load8_u', () => { + const op = (OpCodes as any).i64_load8_u; + expect(op).toBeDefined(); + expect(op.value).toBe(49); + expect(op.mnemonic).toBe("i64.load8_u"); + }); + + test('i64_load16_s', () => { + const op = (OpCodes as any).i64_load16_s; + expect(op).toBeDefined(); + expect(op.value).toBe(50); + expect(op.mnemonic).toBe("i64.load16_s"); + }); + + test('i64_load16_u', () => { + const op = (OpCodes as any).i64_load16_u; + expect(op).toBeDefined(); + expect(op.value).toBe(51); + expect(op.mnemonic).toBe("i64.load16_u"); + }); + + test('i64_load32_s', () => { + const op = (OpCodes as any).i64_load32_s; + expect(op).toBeDefined(); + expect(op.value).toBe(52); + expect(op.mnemonic).toBe("i64.load32_s"); + }); + + test('i64_load32_u', () => { + const op = (OpCodes as any).i64_load32_u; + expect(op).toBeDefined(); + expect(op.value).toBe(53); + expect(op.mnemonic).toBe("i64.load32_u"); + }); + + test('i32_store', () => { + const op = (OpCodes as any).i32_store; + expect(op).toBeDefined(); + expect(op.value).toBe(54); + expect(op.mnemonic).toBe("i32.store"); + }); + + test('i64_store', () => { + const op = (OpCodes as any).i64_store; + expect(op).toBeDefined(); + expect(op.value).toBe(55); + expect(op.mnemonic).toBe("i64.store"); + }); + + test('f32_store', () => { + const op = (OpCodes as any).f32_store; + expect(op).toBeDefined(); + expect(op.value).toBe(56); + expect(op.mnemonic).toBe("f32.store"); + }); + + test('f64_store', () => { + const op = (OpCodes as any).f64_store; + expect(op).toBeDefined(); + expect(op.value).toBe(57); + expect(op.mnemonic).toBe("f64.store"); + }); + + test('i32_store8', () => { + const op = (OpCodes as any).i32_store8; + expect(op).toBeDefined(); + expect(op.value).toBe(58); + expect(op.mnemonic).toBe("i32.store8"); + }); + + test('i32_store16', () => { + const op = (OpCodes as any).i32_store16; + expect(op).toBeDefined(); + expect(op.value).toBe(59); + expect(op.mnemonic).toBe("i32.store16"); + }); + + test('i64_store8', () => { + const op = (OpCodes as any).i64_store8; + expect(op).toBeDefined(); + expect(op.value).toBe(60); + expect(op.mnemonic).toBe("i64.store8"); + }); + + test('i64_store16', () => { + const op = (OpCodes as any).i64_store16; + expect(op).toBeDefined(); + expect(op.value).toBe(61); + expect(op.mnemonic).toBe("i64.store16"); + }); + + test('i64_store32', () => { + const op = (OpCodes as any).i64_store32; + expect(op).toBeDefined(); + expect(op.value).toBe(62); + expect(op.mnemonic).toBe("i64.store32"); + }); + + test('mem_size', () => { + const op = (OpCodes as any).mem_size; + expect(op).toBeDefined(); + expect(op.value).toBe(63); + expect(op.mnemonic).toBe("memory.size"); + }); + + test('mem_grow', () => { + const op = (OpCodes as any).mem_grow; + expect(op).toBeDefined(); + expect(op.value).toBe(64); + expect(op.mnemonic).toBe("memory.grow"); + }); + + }); + + describe('constant', () => { + test('i32_const', () => { + const op = (OpCodes as any).i32_const; + expect(op).toBeDefined(); + expect(op.value).toBe(65); + expect(op.mnemonic).toBe("i32.const"); + }); + + test('i64_const', () => { + const op = (OpCodes as any).i64_const; + expect(op).toBeDefined(); + expect(op.value).toBe(66); + expect(op.mnemonic).toBe("i64.const"); + }); + + test('f32_const', () => { + const op = (OpCodes as any).f32_const; + expect(op).toBeDefined(); + expect(op.value).toBe(67); + expect(op.mnemonic).toBe("f32.const"); + }); + + test('f64_const', () => { + const op = (OpCodes as any).f64_const; + expect(op).toBeDefined(); + expect(op.value).toBe(68); + expect(op.mnemonic).toBe("f64.const"); + }); + + }); + + describe('i32-comparison', () => { + test('i32_eqz', () => { + const op = (OpCodes as any).i32_eqz; + expect(op).toBeDefined(); + expect(op.value).toBe(69); + expect(op.mnemonic).toBe("i32.eqz"); + }); + + test('i32_eq', () => { + const op = (OpCodes as any).i32_eq; + expect(op).toBeDefined(); + expect(op.value).toBe(70); + expect(op.mnemonic).toBe("i32.eq"); + }); + + test('i32_ne', () => { + const op = (OpCodes as any).i32_ne; + expect(op).toBeDefined(); + expect(op.value).toBe(71); + expect(op.mnemonic).toBe("i32.ne"); + }); + + test('i32_lt_s', () => { + const op = (OpCodes as any).i32_lt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(72); + expect(op.mnemonic).toBe("i32.lt_s"); + }); + + test('i32_lt_u', () => { + const op = (OpCodes as any).i32_lt_u; + expect(op).toBeDefined(); + expect(op.value).toBe(73); + expect(op.mnemonic).toBe("i32.lt_u"); + }); + + test('i32_gt_s', () => { + const op = (OpCodes as any).i32_gt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(74); + expect(op.mnemonic).toBe("i32.gt_s"); + }); + + test('i32_gt_u', () => { + const op = (OpCodes as any).i32_gt_u; + expect(op).toBeDefined(); + expect(op.value).toBe(75); + expect(op.mnemonic).toBe("i32.gt_u"); + }); + + test('i32_le_s', () => { + const op = (OpCodes as any).i32_le_s; + expect(op).toBeDefined(); + expect(op.value).toBe(76); + expect(op.mnemonic).toBe("i32.le_s"); + }); + + test('i32_le_u', () => { + const op = (OpCodes as any).i32_le_u; + expect(op).toBeDefined(); + expect(op.value).toBe(77); + expect(op.mnemonic).toBe("i32.le_u"); + }); + + test('i32_ge_s', () => { + const op = (OpCodes as any).i32_ge_s; + expect(op).toBeDefined(); + expect(op.value).toBe(78); + expect(op.mnemonic).toBe("i32.ge_s"); + }); + + test('i32_ge_u', () => { + const op = (OpCodes as any).i32_ge_u; + expect(op).toBeDefined(); + expect(op.value).toBe(79); + expect(op.mnemonic).toBe("i32.ge_u"); + }); + + }); + + describe('i64-comparison', () => { + test('i64_eqz', () => { + const op = (OpCodes as any).i64_eqz; + expect(op).toBeDefined(); + expect(op.value).toBe(80); + expect(op.mnemonic).toBe("i64.eqz"); + }); + + test('i64_eq', () => { + const op = (OpCodes as any).i64_eq; + expect(op).toBeDefined(); + expect(op.value).toBe(81); + expect(op.mnemonic).toBe("i64.eq"); + }); + + test('i64_ne', () => { + const op = (OpCodes as any).i64_ne; + expect(op).toBeDefined(); + expect(op.value).toBe(82); + expect(op.mnemonic).toBe("i64.ne"); + }); + + test('i64_lt_s', () => { + const op = (OpCodes as any).i64_lt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(83); + expect(op.mnemonic).toBe("i64.lt_s"); + }); + + test('i64_lt_u', () => { + const op = (OpCodes as any).i64_lt_u; + expect(op).toBeDefined(); + expect(op.value).toBe(84); + expect(op.mnemonic).toBe("i64.lt_u"); + }); + + test('i64_gt_s', () => { + const op = (OpCodes as any).i64_gt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(85); + expect(op.mnemonic).toBe("i64.gt_s"); + }); + + test('i64_gt_u', () => { + const op = (OpCodes as any).i64_gt_u; + expect(op).toBeDefined(); + expect(op.value).toBe(86); + expect(op.mnemonic).toBe("i64.gt_u"); + }); + + test('i64_le_s', () => { + const op = (OpCodes as any).i64_le_s; + expect(op).toBeDefined(); + expect(op.value).toBe(87); + expect(op.mnemonic).toBe("i64.le_s"); + }); + + test('i64_le_u', () => { + const op = (OpCodes as any).i64_le_u; + expect(op).toBeDefined(); + expect(op.value).toBe(88); + expect(op.mnemonic).toBe("i64.le_u"); + }); + + test('i64_ge_s', () => { + const op = (OpCodes as any).i64_ge_s; + expect(op).toBeDefined(); + expect(op.value).toBe(89); + expect(op.mnemonic).toBe("i64.ge_s"); + }); + + test('i64_ge_u', () => { + const op = (OpCodes as any).i64_ge_u; + expect(op).toBeDefined(); + expect(op.value).toBe(90); + expect(op.mnemonic).toBe("i64.ge_u"); + }); + + }); + + describe('f32-comparison', () => { + test('f32_eq', () => { + const op = (OpCodes as any).f32_eq; + expect(op).toBeDefined(); + expect(op.value).toBe(91); + expect(op.mnemonic).toBe("f32.eq"); + }); + + test('f32_ne', () => { + const op = (OpCodes as any).f32_ne; + expect(op).toBeDefined(); + expect(op.value).toBe(92); + expect(op.mnemonic).toBe("f32.ne"); + }); + + test('f32_lt', () => { + const op = (OpCodes as any).f32_lt; + expect(op).toBeDefined(); + expect(op.value).toBe(93); + expect(op.mnemonic).toBe("f32.lt"); + }); + + test('f32_gt', () => { + const op = (OpCodes as any).f32_gt; + expect(op).toBeDefined(); + expect(op.value).toBe(94); + expect(op.mnemonic).toBe("f32.gt"); + }); + + test('f32_le', () => { + const op = (OpCodes as any).f32_le; + expect(op).toBeDefined(); + expect(op.value).toBe(95); + expect(op.mnemonic).toBe("f32.le"); + }); + + test('f32_ge', () => { + const op = (OpCodes as any).f32_ge; + expect(op).toBeDefined(); + expect(op.value).toBe(96); + expect(op.mnemonic).toBe("f32.ge"); + }); + + }); + + describe('f64-comparison', () => { + test('f64_eq', () => { + const op = (OpCodes as any).f64_eq; + expect(op).toBeDefined(); + expect(op.value).toBe(97); + expect(op.mnemonic).toBe("f64.eq"); + }); + + test('f64_ne', () => { + const op = (OpCodes as any).f64_ne; + expect(op).toBeDefined(); + expect(op.value).toBe(98); + expect(op.mnemonic).toBe("f64.ne"); + }); + + test('f64_lt', () => { + const op = (OpCodes as any).f64_lt; + expect(op).toBeDefined(); + expect(op.value).toBe(99); + expect(op.mnemonic).toBe("f64.lt"); + }); + + test('f64_gt', () => { + const op = (OpCodes as any).f64_gt; + expect(op).toBeDefined(); + expect(op.value).toBe(100); + expect(op.mnemonic).toBe("f64.gt"); + }); + + test('f64_le', () => { + const op = (OpCodes as any).f64_le; + expect(op).toBeDefined(); + expect(op.value).toBe(101); + expect(op.mnemonic).toBe("f64.le"); + }); + + test('f64_ge', () => { + const op = (OpCodes as any).f64_ge; + expect(op).toBeDefined(); + expect(op.value).toBe(102); + expect(op.mnemonic).toBe("f64.ge"); + }); + + }); + + describe('i32-bitwise', () => { + test('i32_clz', () => { + const op = (OpCodes as any).i32_clz; + expect(op).toBeDefined(); + expect(op.value).toBe(103); + expect(op.mnemonic).toBe("i32.clz"); + }); + + test('i32_ctz', () => { + const op = (OpCodes as any).i32_ctz; + expect(op).toBeDefined(); + expect(op.value).toBe(104); + expect(op.mnemonic).toBe("i32.ctz"); + }); + + test('i32_popcnt', () => { + const op = (OpCodes as any).i32_popcnt; + expect(op).toBeDefined(); + expect(op.value).toBe(105); + expect(op.mnemonic).toBe("i32.popcnt"); + }); + + test('i32_and', () => { + const op = (OpCodes as any).i32_and; + expect(op).toBeDefined(); + expect(op.value).toBe(113); + expect(op.mnemonic).toBe("i32.and"); + }); + + test('i32_or', () => { + const op = (OpCodes as any).i32_or; + expect(op).toBeDefined(); + expect(op.value).toBe(114); + expect(op.mnemonic).toBe("i32.or"); + }); + + test('i32_xor', () => { + const op = (OpCodes as any).i32_xor; + expect(op).toBeDefined(); + expect(op.value).toBe(115); + expect(op.mnemonic).toBe("i32.xor"); + }); + + test('i32_shl', () => { + const op = (OpCodes as any).i32_shl; + expect(op).toBeDefined(); + expect(op.value).toBe(116); + expect(op.mnemonic).toBe("i32.shl"); + }); + + test('i32_shr_s', () => { + const op = (OpCodes as any).i32_shr_s; + expect(op).toBeDefined(); + expect(op.value).toBe(117); + expect(op.mnemonic).toBe("i32.shr_s"); + }); + + test('i32_shr_u', () => { + const op = (OpCodes as any).i32_shr_u; + expect(op).toBeDefined(); + expect(op.value).toBe(118); + expect(op.mnemonic).toBe("i32.shr_u"); + }); + + test('i32_rotl', () => { + const op = (OpCodes as any).i32_rotl; + expect(op).toBeDefined(); + expect(op.value).toBe(119); + expect(op.mnemonic).toBe("i32.rotl"); + }); + + test('i32_rotr', () => { + const op = (OpCodes as any).i32_rotr; + expect(op).toBeDefined(); + expect(op.value).toBe(120); + expect(op.mnemonic).toBe("i32.rotr"); + }); + + }); + + describe('i32-arithmetic', () => { + test('i32_add', () => { + const op = (OpCodes as any).i32_add; + expect(op).toBeDefined(); + expect(op.value).toBe(106); + expect(op.mnemonic).toBe("i32.add"); + }); + + test('i32_sub', () => { + const op = (OpCodes as any).i32_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(107); + expect(op.mnemonic).toBe("i32.sub"); + }); + + test('i32_mul', () => { + const op = (OpCodes as any).i32_mul; + expect(op).toBeDefined(); + expect(op.value).toBe(108); + expect(op.mnemonic).toBe("i32.mul"); + }); + + test('i32_div_s', () => { + const op = (OpCodes as any).i32_div_s; + expect(op).toBeDefined(); + expect(op.value).toBe(109); + expect(op.mnemonic).toBe("i32.div_s"); + }); + + test('i32_div_u', () => { + const op = (OpCodes as any).i32_div_u; + expect(op).toBeDefined(); + expect(op.value).toBe(110); + expect(op.mnemonic).toBe("i32.div_u"); + }); + + test('i32_rem_s', () => { + const op = (OpCodes as any).i32_rem_s; + expect(op).toBeDefined(); + expect(op.value).toBe(111); + expect(op.mnemonic).toBe("i32.rem_s"); + }); + + test('i32_rem_u', () => { + const op = (OpCodes as any).i32_rem_u; + expect(op).toBeDefined(); + expect(op.value).toBe(112); + expect(op.mnemonic).toBe("i32.rem_u"); + }); + + }); + + describe('i64-bitwise', () => { + test('i64_clz', () => { + const op = (OpCodes as any).i64_clz; + expect(op).toBeDefined(); + expect(op.value).toBe(121); + expect(op.mnemonic).toBe("i64.clz"); + }); + + test('i64_ctz', () => { + const op = (OpCodes as any).i64_ctz; + expect(op).toBeDefined(); + expect(op.value).toBe(122); + expect(op.mnemonic).toBe("i64.ctz"); + }); + + test('i64_popcnt', () => { + const op = (OpCodes as any).i64_popcnt; + expect(op).toBeDefined(); + expect(op.value).toBe(123); + expect(op.mnemonic).toBe("i64.popcnt"); + }); + + test('i64_and', () => { + const op = (OpCodes as any).i64_and; + expect(op).toBeDefined(); + expect(op.value).toBe(131); + expect(op.mnemonic).toBe("i64.and"); + }); + + test('i64_or', () => { + const op = (OpCodes as any).i64_or; + expect(op).toBeDefined(); + expect(op.value).toBe(132); + expect(op.mnemonic).toBe("i64.or"); + }); + + test('i64_xor', () => { + const op = (OpCodes as any).i64_xor; + expect(op).toBeDefined(); + expect(op.value).toBe(133); + expect(op.mnemonic).toBe("i64.xor"); + }); + + test('i64_shl', () => { + const op = (OpCodes as any).i64_shl; + expect(op).toBeDefined(); + expect(op.value).toBe(134); + expect(op.mnemonic).toBe("i64.shl"); + }); + + test('i64_shr_s', () => { + const op = (OpCodes as any).i64_shr_s; + expect(op).toBeDefined(); + expect(op.value).toBe(135); + expect(op.mnemonic).toBe("i64.shr_s"); + }); + + test('i64_shr_u', () => { + const op = (OpCodes as any).i64_shr_u; + expect(op).toBeDefined(); + expect(op.value).toBe(136); + expect(op.mnemonic).toBe("i64.shr_u"); + }); + + test('i64_rotl', () => { + const op = (OpCodes as any).i64_rotl; + expect(op).toBeDefined(); + expect(op.value).toBe(137); + expect(op.mnemonic).toBe("i64.rotl"); + }); + + test('i64_rotr', () => { + const op = (OpCodes as any).i64_rotr; + expect(op).toBeDefined(); + expect(op.value).toBe(138); + expect(op.mnemonic).toBe("i64.rotr"); + }); + + }); + + describe('i64-arithmetic', () => { + test('i64_add', () => { + const op = (OpCodes as any).i64_add; + expect(op).toBeDefined(); + expect(op.value).toBe(124); + expect(op.mnemonic).toBe("i64.add"); + }); + + test('i64_sub', () => { + const op = (OpCodes as any).i64_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(125); + expect(op.mnemonic).toBe("i64.sub"); + }); + + test('i64_mul', () => { + const op = (OpCodes as any).i64_mul; + expect(op).toBeDefined(); + expect(op.value).toBe(126); + expect(op.mnemonic).toBe("i64.mul"); + }); + + test('i64_div_s', () => { + const op = (OpCodes as any).i64_div_s; + expect(op).toBeDefined(); + expect(op.value).toBe(127); + expect(op.mnemonic).toBe("i64.div_s"); + }); + + test('i64_div_u', () => { + const op = (OpCodes as any).i64_div_u; + expect(op).toBeDefined(); + expect(op.value).toBe(128); + expect(op.mnemonic).toBe("i64.div_u"); + }); + + test('i64_rem_s', () => { + const op = (OpCodes as any).i64_rem_s; + expect(op).toBeDefined(); + expect(op.value).toBe(129); + expect(op.mnemonic).toBe("i64.rem_s"); + }); + + test('i64_rem_u', () => { + const op = (OpCodes as any).i64_rem_u; + expect(op).toBeDefined(); + expect(op.value).toBe(130); + expect(op.mnemonic).toBe("i64.rem_u"); + }); + + }); + + describe('f32-arithmetic', () => { + test('f32_abs', () => { + const op = (OpCodes as any).f32_abs; + expect(op).toBeDefined(); + expect(op.value).toBe(139); + expect(op.mnemonic).toBe("f32.abs"); + }); + + test('f32_neg', () => { + const op = (OpCodes as any).f32_neg; + expect(op).toBeDefined(); + expect(op.value).toBe(140); + expect(op.mnemonic).toBe("f32.neg"); + }); + + test('f32_ceil', () => { + const op = (OpCodes as any).f32_ceil; + expect(op).toBeDefined(); + expect(op.value).toBe(141); + expect(op.mnemonic).toBe("f32.ceil"); + }); + + test('f32_floor', () => { + const op = (OpCodes as any).f32_floor; + expect(op).toBeDefined(); + expect(op.value).toBe(142); + expect(op.mnemonic).toBe("f32.floor"); + }); + + test('f32_trunc', () => { + const op = (OpCodes as any).f32_trunc; + expect(op).toBeDefined(); + expect(op.value).toBe(143); + expect(op.mnemonic).toBe("f32.trunc"); + }); + + test('f32_nearest', () => { + const op = (OpCodes as any).f32_nearest; + expect(op).toBeDefined(); + expect(op.value).toBe(144); + expect(op.mnemonic).toBe("f32.nearest"); + }); + + test('f32_sqrt', () => { + const op = (OpCodes as any).f32_sqrt; + expect(op).toBeDefined(); + expect(op.value).toBe(145); + expect(op.mnemonic).toBe("f32.sqrt"); + }); + + test('f32_add', () => { + const op = (OpCodes as any).f32_add; + expect(op).toBeDefined(); + expect(op.value).toBe(146); + expect(op.mnemonic).toBe("f32.add"); + }); + + test('f32_sub', () => { + const op = (OpCodes as any).f32_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(147); + expect(op.mnemonic).toBe("f32.sub"); + }); + + test('f32_mul', () => { + const op = (OpCodes as any).f32_mul; + expect(op).toBeDefined(); + expect(op.value).toBe(148); + expect(op.mnemonic).toBe("f32.mul"); + }); + + test('f32_div', () => { + const op = (OpCodes as any).f32_div; + expect(op).toBeDefined(); + expect(op.value).toBe(149); + expect(op.mnemonic).toBe("f32.div"); + }); + + test('f32_min', () => { + const op = (OpCodes as any).f32_min; + expect(op).toBeDefined(); + expect(op.value).toBe(150); + expect(op.mnemonic).toBe("f32.min"); + }); + + test('f32_max', () => { + const op = (OpCodes as any).f32_max; + expect(op).toBeDefined(); + expect(op.value).toBe(151); + expect(op.mnemonic).toBe("f32.max"); + }); + + test('f32_copysign', () => { + const op = (OpCodes as any).f32_copysign; + expect(op).toBeDefined(); + expect(op.value).toBe(152); + expect(op.mnemonic).toBe("f32.copysign"); + }); + + }); + + describe('f64-arithmetic', () => { + test('f64_abs', () => { + const op = (OpCodes as any).f64_abs; + expect(op).toBeDefined(); + expect(op.value).toBe(153); + expect(op.mnemonic).toBe("f64.abs"); + }); + + test('f64_neg', () => { + const op = (OpCodes as any).f64_neg; + expect(op).toBeDefined(); + expect(op.value).toBe(154); + expect(op.mnemonic).toBe("f64.neg"); + }); + + test('f64_ceil', () => { + const op = (OpCodes as any).f64_ceil; + expect(op).toBeDefined(); + expect(op.value).toBe(155); + expect(op.mnemonic).toBe("f64.ceil"); + }); + + test('f64_floor', () => { + const op = (OpCodes as any).f64_floor; + expect(op).toBeDefined(); + expect(op.value).toBe(156); + expect(op.mnemonic).toBe("f64.floor"); + }); + + test('f64_trunc', () => { + const op = (OpCodes as any).f64_trunc; + expect(op).toBeDefined(); + expect(op.value).toBe(157); + expect(op.mnemonic).toBe("f64.trunc"); + }); + + test('f64_nearest', () => { + const op = (OpCodes as any).f64_nearest; + expect(op).toBeDefined(); + expect(op.value).toBe(158); + expect(op.mnemonic).toBe("f64.nearest"); + }); + + test('f64_sqrt', () => { + const op = (OpCodes as any).f64_sqrt; + expect(op).toBeDefined(); + expect(op.value).toBe(159); + expect(op.mnemonic).toBe("f64.sqrt"); + }); + + test('f64_add', () => { + const op = (OpCodes as any).f64_add; + expect(op).toBeDefined(); + expect(op.value).toBe(160); + expect(op.mnemonic).toBe("f64.add"); + }); + + test('f64_sub', () => { + const op = (OpCodes as any).f64_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(161); + expect(op.mnemonic).toBe("f64.sub"); + }); + + test('f64_mul', () => { + const op = (OpCodes as any).f64_mul; + expect(op).toBeDefined(); + expect(op.value).toBe(162); + expect(op.mnemonic).toBe("f64.mul"); + }); + + test('f64_div', () => { + const op = (OpCodes as any).f64_div; + expect(op).toBeDefined(); + expect(op.value).toBe(163); + expect(op.mnemonic).toBe("f64.div"); + }); + + test('f64_min', () => { + const op = (OpCodes as any).f64_min; + expect(op).toBeDefined(); + expect(op.value).toBe(164); + expect(op.mnemonic).toBe("f64.min"); + }); + + test('f64_max', () => { + const op = (OpCodes as any).f64_max; + expect(op).toBeDefined(); + expect(op.value).toBe(165); + expect(op.mnemonic).toBe("f64.max"); + }); + + test('f64_copysign', () => { + const op = (OpCodes as any).f64_copysign; + expect(op).toBeDefined(); + expect(op.value).toBe(166); + expect(op.mnemonic).toBe("f64.copysign"); + }); + + }); + + describe('conversion', () => { + test('i32_wrap_i64', () => { + const op = (OpCodes as any).i32_wrap_i64; + expect(op).toBeDefined(); + expect(op.value).toBe(167); + expect(op.mnemonic).toBe("i32.wrap_i64"); + }); + + test('i32_trunc_f32_s', () => { + const op = (OpCodes as any).i32_trunc_f32_s; + expect(op).toBeDefined(); + expect(op.value).toBe(168); + expect(op.mnemonic).toBe("i32.trunc_f32_s"); + }); + + test('i32_trunc_f32_u', () => { + const op = (OpCodes as any).i32_trunc_f32_u; + expect(op).toBeDefined(); + expect(op.value).toBe(169); + expect(op.mnemonic).toBe("i32.trunc_f32_u"); + }); + + test('i32_trunc_f64_s', () => { + const op = (OpCodes as any).i32_trunc_f64_s; + expect(op).toBeDefined(); + expect(op.value).toBe(170); + expect(op.mnemonic).toBe("i32.trunc_f64_s"); + }); + + test('i32_trunc_f64_u', () => { + const op = (OpCodes as any).i32_trunc_f64_u; + expect(op).toBeDefined(); + expect(op.value).toBe(171); + expect(op.mnemonic).toBe("i32.trunc_f64_u"); + }); + + test('i64_extend_i32_s', () => { + const op = (OpCodes as any).i64_extend_i32_s; + expect(op).toBeDefined(); + expect(op.value).toBe(172); + expect(op.mnemonic).toBe("i64.extend_i32_s"); + }); + + test('i64_extend_i32_u', () => { + const op = (OpCodes as any).i64_extend_i32_u; + expect(op).toBeDefined(); + expect(op.value).toBe(173); + expect(op.mnemonic).toBe("i64.extend_i32_u"); + }); + + test('i64_trunc_f32_s', () => { + const op = (OpCodes as any).i64_trunc_f32_s; + expect(op).toBeDefined(); + expect(op.value).toBe(174); + expect(op.mnemonic).toBe("i64.trunc_f32_s"); + }); + + test('i64_trunc_f32_u', () => { + const op = (OpCodes as any).i64_trunc_f32_u; + expect(op).toBeDefined(); + expect(op.value).toBe(175); + expect(op.mnemonic).toBe("i64.trunc_f32_u"); + }); + + test('i64_trunc_f64_s', () => { + const op = (OpCodes as any).i64_trunc_f64_s; + expect(op).toBeDefined(); + expect(op.value).toBe(176); + expect(op.mnemonic).toBe("i64.trunc_f64_s"); + }); + + test('i64_trunc_f64_u', () => { + const op = (OpCodes as any).i64_trunc_f64_u; + expect(op).toBeDefined(); + expect(op.value).toBe(177); + expect(op.mnemonic).toBe("i64.trunc_f64_u"); + }); + + test('f32_convert_i32_s', () => { + const op = (OpCodes as any).f32_convert_i32_s; + expect(op).toBeDefined(); + expect(op.value).toBe(178); + expect(op.mnemonic).toBe("f32.convert_i32_s"); + }); + + test('f32_convert_i32_u', () => { + const op = (OpCodes as any).f32_convert_i32_u; + expect(op).toBeDefined(); + expect(op.value).toBe(179); + expect(op.mnemonic).toBe("f32.convert_i32_u"); + }); + + test('f32_convert_i64_s', () => { + const op = (OpCodes as any).f32_convert_i64_s; + expect(op).toBeDefined(); + expect(op.value).toBe(180); + expect(op.mnemonic).toBe("f32.convert_i64_s"); + }); + + test('f32_convert_i64_u', () => { + const op = (OpCodes as any).f32_convert_i64_u; + expect(op).toBeDefined(); + expect(op.value).toBe(181); + expect(op.mnemonic).toBe("f32.convert_i64_u"); + }); + + test('f32_demote_f64', () => { + const op = (OpCodes as any).f32_demote_f64; + expect(op).toBeDefined(); + expect(op.value).toBe(182); + expect(op.mnemonic).toBe("f32.demote_f64"); + }); + + test('f64_convert_i32_s', () => { + const op = (OpCodes as any).f64_convert_i32_s; + expect(op).toBeDefined(); + expect(op.value).toBe(183); + expect(op.mnemonic).toBe("f64.convert_i32_s"); + }); + + test('f64_convert_i32_u', () => { + const op = (OpCodes as any).f64_convert_i32_u; + expect(op).toBeDefined(); + expect(op.value).toBe(184); + expect(op.mnemonic).toBe("f64.convert_i32_u"); + }); + + test('f64_convert_i64_s', () => { + const op = (OpCodes as any).f64_convert_i64_s; + expect(op).toBeDefined(); + expect(op.value).toBe(185); + expect(op.mnemonic).toBe("f64.convert_i64_s"); + }); + + test('f64_convert_i64_u', () => { + const op = (OpCodes as any).f64_convert_i64_u; + expect(op).toBeDefined(); + expect(op.value).toBe(186); + expect(op.mnemonic).toBe("f64.convert_i64_u"); + }); + + test('f64_promote_f32', () => { + const op = (OpCodes as any).f64_promote_f32; + expect(op).toBeDefined(); + expect(op.value).toBe(187); + expect(op.mnemonic).toBe("f64.promote_f32"); + }); + + test('i32_reinterpret_f32', () => { + const op = (OpCodes as any).i32_reinterpret_f32; + expect(op).toBeDefined(); + expect(op.value).toBe(188); + expect(op.mnemonic).toBe("i32.reinterpret_f32"); + }); + + test('i64_reinterpret_f64', () => { + const op = (OpCodes as any).i64_reinterpret_f64; + expect(op).toBeDefined(); + expect(op.value).toBe(189); + expect(op.mnemonic).toBe("i64.reinterpret_f64"); + }); + + test('f32_reinterpret_i32', () => { + const op = (OpCodes as any).f32_reinterpret_i32; + expect(op).toBeDefined(); + expect(op.value).toBe(190); + expect(op.mnemonic).toBe("f32.reinterpret_i32"); + }); + + test('f64_reinterpret_i64', () => { + const op = (OpCodes as any).f64_reinterpret_i64; + expect(op).toBeDefined(); + expect(op.value).toBe(191); + expect(op.mnemonic).toBe("f64.reinterpret_i64"); + }); + + }); + + describe('sign-extend', () => { + test('i32_extend8_s', () => { + const op = (OpCodes as any).i32_extend8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(192); + expect(op.mnemonic).toBe("i32.extend8_s"); + expect(op.feature).toBe("sign-extend"); + }); + + test('i32_extend16_s', () => { + const op = (OpCodes as any).i32_extend16_s; + expect(op).toBeDefined(); + expect(op.value).toBe(193); + expect(op.mnemonic).toBe("i32.extend16_s"); + expect(op.feature).toBe("sign-extend"); + }); + + test('i64_extend8_s', () => { + const op = (OpCodes as any).i64_extend8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(194); + expect(op.mnemonic).toBe("i64.extend8_s"); + expect(op.feature).toBe("sign-extend"); + }); + + test('i64_extend16_s', () => { + const op = (OpCodes as any).i64_extend16_s; + expect(op).toBeDefined(); + expect(op.value).toBe(195); + expect(op.mnemonic).toBe("i64.extend16_s"); + expect(op.feature).toBe("sign-extend"); + }); + + test('i64_extend32_s', () => { + const op = (OpCodes as any).i64_extend32_s; + expect(op).toBeDefined(); + expect(op.value).toBe(196); + expect(op.mnemonic).toBe("i64.extend32_s"); + expect(op.feature).toBe("sign-extend"); + }); + + }); + + describe('sat-trunc', () => { + test('i32_trunc_sat_f32_s', () => { + const op = (OpCodes as any).i32_trunc_sat_f32_s; + expect(op).toBeDefined(); + expect(op.value).toBe(0); + expect(op.mnemonic).toBe("i32.trunc_sat_f32_s"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("sat-trunc"); + }); + + test('i32_trunc_sat_f32_u', () => { + const op = (OpCodes as any).i32_trunc_sat_f32_u; + expect(op).toBeDefined(); + expect(op.value).toBe(1); + expect(op.mnemonic).toBe("i32.trunc_sat_f32_u"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("sat-trunc"); + }); + + test('i32_trunc_sat_f64_s', () => { + const op = (OpCodes as any).i32_trunc_sat_f64_s; + expect(op).toBeDefined(); + expect(op.value).toBe(2); + expect(op.mnemonic).toBe("i32.trunc_sat_f64_s"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("sat-trunc"); + }); + + test('i32_trunc_sat_f64_u', () => { + const op = (OpCodes as any).i32_trunc_sat_f64_u; + expect(op).toBeDefined(); + expect(op.value).toBe(3); + expect(op.mnemonic).toBe("i32.trunc_sat_f64_u"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("sat-trunc"); + }); + + test('i64_trunc_sat_f32_s', () => { + const op = (OpCodes as any).i64_trunc_sat_f32_s; + expect(op).toBeDefined(); + expect(op.value).toBe(4); + expect(op.mnemonic).toBe("i64.trunc_sat_f32_s"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("sat-trunc"); + }); + + test('i64_trunc_sat_f32_u', () => { + const op = (OpCodes as any).i64_trunc_sat_f32_u; + expect(op).toBeDefined(); + expect(op.value).toBe(5); + expect(op.mnemonic).toBe("i64.trunc_sat_f32_u"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("sat-trunc"); + }); + + test('i64_trunc_sat_f64_s', () => { + const op = (OpCodes as any).i64_trunc_sat_f64_s; + expect(op).toBeDefined(); + expect(op.value).toBe(6); + expect(op.mnemonic).toBe("i64.trunc_sat_f64_s"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("sat-trunc"); + }); + + test('i64_trunc_sat_f64_u', () => { + const op = (OpCodes as any).i64_trunc_sat_f64_u; + expect(op).toBeDefined(); + expect(op.value).toBe(7); + expect(op.mnemonic).toBe("i64.trunc_sat_f64_u"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("sat-trunc"); + }); + + }); + + describe('bulk-memory', () => { + test('memory_init', () => { + const op = (OpCodes as any).memory_init; + expect(op).toBeDefined(); + expect(op.value).toBe(8); + expect(op.mnemonic).toBe("memory.init"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("bulk-memory"); + }); + + test('data_drop', () => { + const op = (OpCodes as any).data_drop; + expect(op).toBeDefined(); + expect(op.value).toBe(9); + expect(op.mnemonic).toBe("data.drop"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("bulk-memory"); + }); + + test('memory_copy', () => { + const op = (OpCodes as any).memory_copy; + expect(op).toBeDefined(); + expect(op.value).toBe(10); + expect(op.mnemonic).toBe("memory.copy"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("bulk-memory"); + }); + + test('memory_fill', () => { + const op = (OpCodes as any).memory_fill; + expect(op).toBeDefined(); + expect(op.value).toBe(11); + expect(op.mnemonic).toBe("memory.fill"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("bulk-memory"); + }); + + test('table_init', () => { + const op = (OpCodes as any).table_init; + expect(op).toBeDefined(); + expect(op.value).toBe(12); + expect(op.mnemonic).toBe("table.init"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("bulk-memory"); + }); + + test('elem_drop', () => { + const op = (OpCodes as any).elem_drop; + expect(op).toBeDefined(); + expect(op.value).toBe(13); + expect(op.mnemonic).toBe("elem.drop"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("bulk-memory"); + }); + + test('table_copy', () => { + const op = (OpCodes as any).table_copy; + expect(op).toBeDefined(); + expect(op.value).toBe(14); + expect(op.mnemonic).toBe("table.copy"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("bulk-memory"); + }); + + }); + + describe('reference-types', () => { + test('table_grow', () => { + const op = (OpCodes as any).table_grow; + expect(op).toBeDefined(); + expect(op.value).toBe(15); + expect(op.mnemonic).toBe("table.grow"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("reference-types"); + }); + + test('table_size', () => { + const op = (OpCodes as any).table_size; + expect(op).toBeDefined(); + expect(op.value).toBe(16); + expect(op.mnemonic).toBe("table.size"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("reference-types"); + }); + + test('table_fill', () => { + const op = (OpCodes as any).table_fill; + expect(op).toBeDefined(); + expect(op.value).toBe(17); + expect(op.mnemonic).toBe("table.fill"); + expect(op.prefix).toBe(252); + expect(op.feature).toBe("reference-types"); + }); + + test('ref_null', () => { + const op = (OpCodes as any).ref_null; + expect(op).toBeDefined(); + expect(op.value).toBe(208); + expect(op.mnemonic).toBe("ref.null"); + expect(op.feature).toBe("reference-types"); + }); + + test('ref_is_null', () => { + const op = (OpCodes as any).ref_is_null; + expect(op).toBeDefined(); + expect(op.value).toBe(209); + expect(op.mnemonic).toBe("ref.is_null"); + expect(op.feature).toBe("reference-types"); + }); + + test('ref_func', () => { + const op = (OpCodes as any).ref_func; + expect(op).toBeDefined(); + expect(op.value).toBe(210); + expect(op.mnemonic).toBe("ref.func"); + expect(op.feature).toBe("reference-types"); + }); + + test('table_get', () => { + const op = (OpCodes as any).table_get; + expect(op).toBeDefined(); + expect(op.value).toBe(37); + expect(op.mnemonic).toBe("table.get"); + expect(op.feature).toBe("reference-types"); + }); + + test('table_set', () => { + const op = (OpCodes as any).table_set; + expect(op).toBeDefined(); + expect(op.value).toBe(38); + expect(op.mnemonic).toBe("table.set"); + expect(op.feature).toBe("reference-types"); + }); + + }); + + describe('simd', () => { + test('v128_load', () => { + const op = (OpCodes as any).v128_load; + expect(op).toBeDefined(); + expect(op.value).toBe(0); + expect(op.mnemonic).toBe("v128.load"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load8x8_s', () => { + const op = (OpCodes as any).v128_load8x8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(1); + expect(op.mnemonic).toBe("v128.load8x8_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load8x8_u', () => { + const op = (OpCodes as any).v128_load8x8_u; + expect(op).toBeDefined(); + expect(op.value).toBe(2); + expect(op.mnemonic).toBe("v128.load8x8_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load16x4_s', () => { + const op = (OpCodes as any).v128_load16x4_s; + expect(op).toBeDefined(); + expect(op.value).toBe(3); + expect(op.mnemonic).toBe("v128.load16x4_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load16x4_u', () => { + const op = (OpCodes as any).v128_load16x4_u; + expect(op).toBeDefined(); + expect(op.value).toBe(4); + expect(op.mnemonic).toBe("v128.load16x4_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load32x2_s', () => { + const op = (OpCodes as any).v128_load32x2_s; + expect(op).toBeDefined(); + expect(op.value).toBe(5); + expect(op.mnemonic).toBe("v128.load32x2_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load32x2_u', () => { + const op = (OpCodes as any).v128_load32x2_u; + expect(op).toBeDefined(); + expect(op.value).toBe(6); + expect(op.mnemonic).toBe("v128.load32x2_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load8_splat', () => { + const op = (OpCodes as any).v128_load8_splat; + expect(op).toBeDefined(); + expect(op.value).toBe(7); + expect(op.mnemonic).toBe("v128.load8_splat"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load16_splat', () => { + const op = (OpCodes as any).v128_load16_splat; + expect(op).toBeDefined(); + expect(op.value).toBe(8); + expect(op.mnemonic).toBe("v128.load16_splat"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load32_splat', () => { + const op = (OpCodes as any).v128_load32_splat; + expect(op).toBeDefined(); + expect(op.value).toBe(9); + expect(op.mnemonic).toBe("v128.load32_splat"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load64_splat', () => { + const op = (OpCodes as any).v128_load64_splat; + expect(op).toBeDefined(); + expect(op.value).toBe(10); + expect(op.mnemonic).toBe("v128.load64_splat"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_store', () => { + const op = (OpCodes as any).v128_store; + expect(op).toBeDefined(); + expect(op.value).toBe(11); + expect(op.mnemonic).toBe("v128.store"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_const', () => { + const op = (OpCodes as any).v128_const; + expect(op).toBeDefined(); + expect(op.value).toBe(12); + expect(op.mnemonic).toBe("v128.const"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_shuffle', () => { + const op = (OpCodes as any).i8x16_shuffle; + expect(op).toBeDefined(); + expect(op.value).toBe(13); + expect(op.mnemonic).toBe("i8x16.shuffle"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_swizzle', () => { + const op = (OpCodes as any).i8x16_swizzle; + expect(op).toBeDefined(); + expect(op.value).toBe(14); + expect(op.mnemonic).toBe("i8x16.swizzle"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_splat', () => { + const op = (OpCodes as any).i8x16_splat; + expect(op).toBeDefined(); + expect(op.value).toBe(15); + expect(op.mnemonic).toBe("i8x16.splat"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_splat', () => { + const op = (OpCodes as any).i16x8_splat; + expect(op).toBeDefined(); + expect(op.value).toBe(16); + expect(op.mnemonic).toBe("i16x8.splat"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_splat', () => { + const op = (OpCodes as any).i32x4_splat; + expect(op).toBeDefined(); + expect(op.value).toBe(17); + expect(op.mnemonic).toBe("i32x4.splat"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_splat', () => { + const op = (OpCodes as any).i64x2_splat; + expect(op).toBeDefined(); + expect(op.value).toBe(18); + expect(op.mnemonic).toBe("i64x2.splat"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_splat', () => { + const op = (OpCodes as any).f32x4_splat; + expect(op).toBeDefined(); + expect(op.value).toBe(19); + expect(op.mnemonic).toBe("f32x4.splat"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_splat', () => { + const op = (OpCodes as any).f64x2_splat; + expect(op).toBeDefined(); + expect(op.value).toBe(20); + expect(op.mnemonic).toBe("f64x2.splat"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_extract_lane_s', () => { + const op = (OpCodes as any).i8x16_extract_lane_s; + expect(op).toBeDefined(); + expect(op.value).toBe(21); + expect(op.mnemonic).toBe("i8x16.extract_lane_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_extract_lane_u', () => { + const op = (OpCodes as any).i8x16_extract_lane_u; + expect(op).toBeDefined(); + expect(op.value).toBe(22); + expect(op.mnemonic).toBe("i8x16.extract_lane_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_replace_lane', () => { + const op = (OpCodes as any).i8x16_replace_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(23); + expect(op.mnemonic).toBe("i8x16.replace_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extract_lane_s', () => { + const op = (OpCodes as any).i16x8_extract_lane_s; + expect(op).toBeDefined(); + expect(op.value).toBe(24); + expect(op.mnemonic).toBe("i16x8.extract_lane_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extract_lane_u', () => { + const op = (OpCodes as any).i16x8_extract_lane_u; + expect(op).toBeDefined(); + expect(op.value).toBe(25); + expect(op.mnemonic).toBe("i16x8.extract_lane_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_replace_lane', () => { + const op = (OpCodes as any).i16x8_replace_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(26); + expect(op.mnemonic).toBe("i16x8.replace_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_extract_lane', () => { + const op = (OpCodes as any).i32x4_extract_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(27); + expect(op.mnemonic).toBe("i32x4.extract_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_replace_lane', () => { + const op = (OpCodes as any).i32x4_replace_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(28); + expect(op.mnemonic).toBe("i32x4.replace_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_extract_lane', () => { + const op = (OpCodes as any).i64x2_extract_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(29); + expect(op.mnemonic).toBe("i64x2.extract_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_replace_lane', () => { + const op = (OpCodes as any).i64x2_replace_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(30); + expect(op.mnemonic).toBe("i64x2.replace_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_extract_lane', () => { + const op = (OpCodes as any).f32x4_extract_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(31); + expect(op.mnemonic).toBe("f32x4.extract_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_replace_lane', () => { + const op = (OpCodes as any).f32x4_replace_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(32); + expect(op.mnemonic).toBe("f32x4.replace_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_extract_lane', () => { + const op = (OpCodes as any).f64x2_extract_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(33); + expect(op.mnemonic).toBe("f64x2.extract_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_replace_lane', () => { + const op = (OpCodes as any).f64x2_replace_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(34); + expect(op.mnemonic).toBe("f64x2.replace_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_eq', () => { + const op = (OpCodes as any).i8x16_eq; + expect(op).toBeDefined(); + expect(op.value).toBe(35); + expect(op.mnemonic).toBe("i8x16.eq"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_ne', () => { + const op = (OpCodes as any).i8x16_ne; + expect(op).toBeDefined(); + expect(op.value).toBe(36); + expect(op.mnemonic).toBe("i8x16.ne"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_lt_s', () => { + const op = (OpCodes as any).i8x16_lt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(37); + expect(op.mnemonic).toBe("i8x16.lt_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_lt_u', () => { + const op = (OpCodes as any).i8x16_lt_u; + expect(op).toBeDefined(); + expect(op.value).toBe(38); + expect(op.mnemonic).toBe("i8x16.lt_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_gt_s', () => { + const op = (OpCodes as any).i8x16_gt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(39); + expect(op.mnemonic).toBe("i8x16.gt_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_gt_u', () => { + const op = (OpCodes as any).i8x16_gt_u; + expect(op).toBeDefined(); + expect(op.value).toBe(40); + expect(op.mnemonic).toBe("i8x16.gt_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_le_s', () => { + const op = (OpCodes as any).i8x16_le_s; + expect(op).toBeDefined(); + expect(op.value).toBe(41); + expect(op.mnemonic).toBe("i8x16.le_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_le_u', () => { + const op = (OpCodes as any).i8x16_le_u; + expect(op).toBeDefined(); + expect(op.value).toBe(42); + expect(op.mnemonic).toBe("i8x16.le_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_ge_s', () => { + const op = (OpCodes as any).i8x16_ge_s; + expect(op).toBeDefined(); + expect(op.value).toBe(43); + expect(op.mnemonic).toBe("i8x16.ge_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_ge_u', () => { + const op = (OpCodes as any).i8x16_ge_u; + expect(op).toBeDefined(); + expect(op.value).toBe(44); + expect(op.mnemonic).toBe("i8x16.ge_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_eq', () => { + const op = (OpCodes as any).i16x8_eq; + expect(op).toBeDefined(); + expect(op.value).toBe(45); + expect(op.mnemonic).toBe("i16x8.eq"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_ne', () => { + const op = (OpCodes as any).i16x8_ne; + expect(op).toBeDefined(); + expect(op.value).toBe(46); + expect(op.mnemonic).toBe("i16x8.ne"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_lt_s', () => { + const op = (OpCodes as any).i16x8_lt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(47); + expect(op.mnemonic).toBe("i16x8.lt_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_lt_u', () => { + const op = (OpCodes as any).i16x8_lt_u; + expect(op).toBeDefined(); + expect(op.value).toBe(48); + expect(op.mnemonic).toBe("i16x8.lt_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_gt_s', () => { + const op = (OpCodes as any).i16x8_gt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(49); + expect(op.mnemonic).toBe("i16x8.gt_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_gt_u', () => { + const op = (OpCodes as any).i16x8_gt_u; + expect(op).toBeDefined(); + expect(op.value).toBe(50); + expect(op.mnemonic).toBe("i16x8.gt_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_le_s', () => { + const op = (OpCodes as any).i16x8_le_s; + expect(op).toBeDefined(); + expect(op.value).toBe(51); + expect(op.mnemonic).toBe("i16x8.le_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_le_u', () => { + const op = (OpCodes as any).i16x8_le_u; + expect(op).toBeDefined(); + expect(op.value).toBe(52); + expect(op.mnemonic).toBe("i16x8.le_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_ge_s', () => { + const op = (OpCodes as any).i16x8_ge_s; + expect(op).toBeDefined(); + expect(op.value).toBe(53); + expect(op.mnemonic).toBe("i16x8.ge_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_ge_u', () => { + const op = (OpCodes as any).i16x8_ge_u; + expect(op).toBeDefined(); + expect(op.value).toBe(54); + expect(op.mnemonic).toBe("i16x8.ge_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_eq', () => { + const op = (OpCodes as any).i32x4_eq; + expect(op).toBeDefined(); + expect(op.value).toBe(55); + expect(op.mnemonic).toBe("i32x4.eq"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_ne', () => { + const op = (OpCodes as any).i32x4_ne; + expect(op).toBeDefined(); + expect(op.value).toBe(56); + expect(op.mnemonic).toBe("i32x4.ne"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_lt_s', () => { + const op = (OpCodes as any).i32x4_lt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(57); + expect(op.mnemonic).toBe("i32x4.lt_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_lt_u', () => { + const op = (OpCodes as any).i32x4_lt_u; + expect(op).toBeDefined(); + expect(op.value).toBe(58); + expect(op.mnemonic).toBe("i32x4.lt_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_gt_s', () => { + const op = (OpCodes as any).i32x4_gt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(59); + expect(op.mnemonic).toBe("i32x4.gt_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_gt_u', () => { + const op = (OpCodes as any).i32x4_gt_u; + expect(op).toBeDefined(); + expect(op.value).toBe(60); + expect(op.mnemonic).toBe("i32x4.gt_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_le_s', () => { + const op = (OpCodes as any).i32x4_le_s; + expect(op).toBeDefined(); + expect(op.value).toBe(61); + expect(op.mnemonic).toBe("i32x4.le_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_le_u', () => { + const op = (OpCodes as any).i32x4_le_u; + expect(op).toBeDefined(); + expect(op.value).toBe(62); + expect(op.mnemonic).toBe("i32x4.le_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_ge_s', () => { + const op = (OpCodes as any).i32x4_ge_s; + expect(op).toBeDefined(); + expect(op.value).toBe(63); + expect(op.mnemonic).toBe("i32x4.ge_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_ge_u', () => { + const op = (OpCodes as any).i32x4_ge_u; + expect(op).toBeDefined(); + expect(op.value).toBe(64); + expect(op.mnemonic).toBe("i32x4.ge_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_eq', () => { + const op = (OpCodes as any).f32x4_eq; + expect(op).toBeDefined(); + expect(op.value).toBe(65); + expect(op.mnemonic).toBe("f32x4.eq"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_ne', () => { + const op = (OpCodes as any).f32x4_ne; + expect(op).toBeDefined(); + expect(op.value).toBe(66); + expect(op.mnemonic).toBe("f32x4.ne"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_lt', () => { + const op = (OpCodes as any).f32x4_lt; + expect(op).toBeDefined(); + expect(op.value).toBe(67); + expect(op.mnemonic).toBe("f32x4.lt"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_gt', () => { + const op = (OpCodes as any).f32x4_gt; + expect(op).toBeDefined(); + expect(op.value).toBe(68); + expect(op.mnemonic).toBe("f32x4.gt"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_le', () => { + const op = (OpCodes as any).f32x4_le; + expect(op).toBeDefined(); + expect(op.value).toBe(69); + expect(op.mnemonic).toBe("f32x4.le"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_ge', () => { + const op = (OpCodes as any).f32x4_ge; + expect(op).toBeDefined(); + expect(op.value).toBe(70); + expect(op.mnemonic).toBe("f32x4.ge"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_eq', () => { + const op = (OpCodes as any).f64x2_eq; + expect(op).toBeDefined(); + expect(op.value).toBe(71); + expect(op.mnemonic).toBe("f64x2.eq"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_ne', () => { + const op = (OpCodes as any).f64x2_ne; + expect(op).toBeDefined(); + expect(op.value).toBe(72); + expect(op.mnemonic).toBe("f64x2.ne"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_lt', () => { + const op = (OpCodes as any).f64x2_lt; + expect(op).toBeDefined(); + expect(op.value).toBe(73); + expect(op.mnemonic).toBe("f64x2.lt"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_gt', () => { + const op = (OpCodes as any).f64x2_gt; + expect(op).toBeDefined(); + expect(op.value).toBe(74); + expect(op.mnemonic).toBe("f64x2.gt"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_le', () => { + const op = (OpCodes as any).f64x2_le; + expect(op).toBeDefined(); + expect(op.value).toBe(75); + expect(op.mnemonic).toBe("f64x2.le"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_ge', () => { + const op = (OpCodes as any).f64x2_ge; + expect(op).toBeDefined(); + expect(op.value).toBe(76); + expect(op.mnemonic).toBe("f64x2.ge"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_not', () => { + const op = (OpCodes as any).v128_not; + expect(op).toBeDefined(); + expect(op.value).toBe(77); + expect(op.mnemonic).toBe("v128.not"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_and', () => { + const op = (OpCodes as any).v128_and; + expect(op).toBeDefined(); + expect(op.value).toBe(78); + expect(op.mnemonic).toBe("v128.and"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_andnot', () => { + const op = (OpCodes as any).v128_andnot; + expect(op).toBeDefined(); + expect(op.value).toBe(79); + expect(op.mnemonic).toBe("v128.andnot"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_or', () => { + const op = (OpCodes as any).v128_or; + expect(op).toBeDefined(); + expect(op.value).toBe(80); + expect(op.mnemonic).toBe("v128.or"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_xor', () => { + const op = (OpCodes as any).v128_xor; + expect(op).toBeDefined(); + expect(op.value).toBe(81); + expect(op.mnemonic).toBe("v128.xor"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_bitselect', () => { + const op = (OpCodes as any).v128_bitselect; + expect(op).toBeDefined(); + expect(op.value).toBe(82); + expect(op.mnemonic).toBe("v128.bitselect"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_any_true', () => { + const op = (OpCodes as any).v128_any_true; + expect(op).toBeDefined(); + expect(op.value).toBe(83); + expect(op.mnemonic).toBe("v128.any_true"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load8_lane', () => { + const op = (OpCodes as any).v128_load8_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(84); + expect(op.mnemonic).toBe("v128.load8_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load16_lane', () => { + const op = (OpCodes as any).v128_load16_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(85); + expect(op.mnemonic).toBe("v128.load16_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load32_lane', () => { + const op = (OpCodes as any).v128_load32_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(86); + expect(op.mnemonic).toBe("v128.load32_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load64_lane', () => { + const op = (OpCodes as any).v128_load64_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(87); + expect(op.mnemonic).toBe("v128.load64_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_store8_lane', () => { + const op = (OpCodes as any).v128_store8_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(88); + expect(op.mnemonic).toBe("v128.store8_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_store16_lane', () => { + const op = (OpCodes as any).v128_store16_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(89); + expect(op.mnemonic).toBe("v128.store16_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_store32_lane', () => { + const op = (OpCodes as any).v128_store32_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(90); + expect(op.mnemonic).toBe("v128.store32_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_store64_lane', () => { + const op = (OpCodes as any).v128_store64_lane; + expect(op).toBeDefined(); + expect(op.value).toBe(91); + expect(op.mnemonic).toBe("v128.store64_lane"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load32_zero', () => { + const op = (OpCodes as any).v128_load32_zero; + expect(op).toBeDefined(); + expect(op.value).toBe(92); + expect(op.mnemonic).toBe("v128.load32_zero"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('v128_load64_zero', () => { + const op = (OpCodes as any).v128_load64_zero; + expect(op).toBeDefined(); + expect(op.value).toBe(93); + expect(op.mnemonic).toBe("v128.load64_zero"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_trunc_sat_f32x4_s', () => { + const op = (OpCodes as any).i32x4_trunc_sat_f32x4_s; + expect(op).toBeDefined(); + expect(op.value).toBe(94); + expect(op.mnemonic).toBe("i32x4.trunc_sat_f32x4_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_trunc_sat_f32x4_u', () => { + const op = (OpCodes as any).i32x4_trunc_sat_f32x4_u; + expect(op).toBeDefined(); + expect(op.value).toBe(95); + expect(op.mnemonic).toBe("i32x4.trunc_sat_f32x4_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_abs', () => { + const op = (OpCodes as any).i8x16_abs; + expect(op).toBeDefined(); + expect(op.value).toBe(96); + expect(op.mnemonic).toBe("i8x16.abs"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_neg', () => { + const op = (OpCodes as any).i8x16_neg; + expect(op).toBeDefined(); + expect(op.value).toBe(97); + expect(op.mnemonic).toBe("i8x16.neg"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_popcnt', () => { + const op = (OpCodes as any).i8x16_popcnt; + expect(op).toBeDefined(); + expect(op.value).toBe(98); + expect(op.mnemonic).toBe("i8x16.popcnt"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_all_true', () => { + const op = (OpCodes as any).i8x16_all_true; + expect(op).toBeDefined(); + expect(op.value).toBe(99); + expect(op.mnemonic).toBe("i8x16.all_true"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_bitmask', () => { + const op = (OpCodes as any).i8x16_bitmask; + expect(op).toBeDefined(); + expect(op.value).toBe(100); + expect(op.mnemonic).toBe("i8x16.bitmask"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_narrow_i16x8_s', () => { + const op = (OpCodes as any).i8x16_narrow_i16x8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(101); + expect(op.mnemonic).toBe("i8x16.narrow_i16x8_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_narrow_i16x8_u', () => { + const op = (OpCodes as any).i8x16_narrow_i16x8_u; + expect(op).toBeDefined(); + expect(op.value).toBe(102); + expect(op.mnemonic).toBe("i8x16.narrow_i16x8_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_ceil', () => { + const op = (OpCodes as any).f32x4_ceil; + expect(op).toBeDefined(); + expect(op.value).toBe(103); + expect(op.mnemonic).toBe("f32x4.ceil"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_floor', () => { + const op = (OpCodes as any).f32x4_floor; + expect(op).toBeDefined(); + expect(op.value).toBe(104); + expect(op.mnemonic).toBe("f32x4.floor"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_trunc', () => { + const op = (OpCodes as any).f32x4_trunc; + expect(op).toBeDefined(); + expect(op.value).toBe(105); + expect(op.mnemonic).toBe("f32x4.trunc"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_nearest', () => { + const op = (OpCodes as any).f32x4_nearest; + expect(op).toBeDefined(); + expect(op.value).toBe(106); + expect(op.mnemonic).toBe("f32x4.nearest"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_shl', () => { + const op = (OpCodes as any).i8x16_shl; + expect(op).toBeDefined(); + expect(op.value).toBe(107); + expect(op.mnemonic).toBe("i8x16.shl"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_shr_s', () => { + const op = (OpCodes as any).i8x16_shr_s; + expect(op).toBeDefined(); + expect(op.value).toBe(108); + expect(op.mnemonic).toBe("i8x16.shr_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_shr_u', () => { + const op = (OpCodes as any).i8x16_shr_u; + expect(op).toBeDefined(); + expect(op.value).toBe(109); + expect(op.mnemonic).toBe("i8x16.shr_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_add', () => { + const op = (OpCodes as any).i8x16_add; + expect(op).toBeDefined(); + expect(op.value).toBe(110); + expect(op.mnemonic).toBe("i8x16.add"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_add_sat_s', () => { + const op = (OpCodes as any).i8x16_add_sat_s; + expect(op).toBeDefined(); + expect(op.value).toBe(111); + expect(op.mnemonic).toBe("i8x16.add_sat_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_add_sat_u', () => { + const op = (OpCodes as any).i8x16_add_sat_u; + expect(op).toBeDefined(); + expect(op.value).toBe(112); + expect(op.mnemonic).toBe("i8x16.add_sat_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_sub', () => { + const op = (OpCodes as any).i8x16_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(113); + expect(op.mnemonic).toBe("i8x16.sub"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_sub_sat_s', () => { + const op = (OpCodes as any).i8x16_sub_sat_s; + expect(op).toBeDefined(); + expect(op.value).toBe(114); + expect(op.mnemonic).toBe("i8x16.sub_sat_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_sub_sat_u', () => { + const op = (OpCodes as any).i8x16_sub_sat_u; + expect(op).toBeDefined(); + expect(op.value).toBe(115); + expect(op.mnemonic).toBe("i8x16.sub_sat_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_ceil', () => { + const op = (OpCodes as any).f64x2_ceil; + expect(op).toBeDefined(); + expect(op.value).toBe(116); + expect(op.mnemonic).toBe("f64x2.ceil"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_floor', () => { + const op = (OpCodes as any).f64x2_floor; + expect(op).toBeDefined(); + expect(op.value).toBe(117); + expect(op.mnemonic).toBe("f64x2.floor"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_min_s', () => { + const op = (OpCodes as any).i8x16_min_s; + expect(op).toBeDefined(); + expect(op.value).toBe(118); + expect(op.mnemonic).toBe("i8x16.min_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_min_u', () => { + const op = (OpCodes as any).i8x16_min_u; + expect(op).toBeDefined(); + expect(op.value).toBe(119); + expect(op.mnemonic).toBe("i8x16.min_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_max_s', () => { + const op = (OpCodes as any).i8x16_max_s; + expect(op).toBeDefined(); + expect(op.value).toBe(120); + expect(op.mnemonic).toBe("i8x16.max_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_max_u', () => { + const op = (OpCodes as any).i8x16_max_u; + expect(op).toBeDefined(); + expect(op.value).toBe(121); + expect(op.mnemonic).toBe("i8x16.max_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_trunc', () => { + const op = (OpCodes as any).f64x2_trunc; + expect(op).toBeDefined(); + expect(op.value).toBe(122); + expect(op.mnemonic).toBe("f64x2.trunc"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i8x16_avgr_u', () => { + const op = (OpCodes as any).i8x16_avgr_u; + expect(op).toBeDefined(); + expect(op.value).toBe(123); + expect(op.mnemonic).toBe("i8x16.avgr_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extadd_pairwise_i8x16_s', () => { + const op = (OpCodes as any).i16x8_extadd_pairwise_i8x16_s; + expect(op).toBeDefined(); + expect(op.value).toBe(124); + expect(op.mnemonic).toBe("i16x8.extadd_pairwise_i8x16_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extadd_pairwise_i8x16_u', () => { + const op = (OpCodes as any).i16x8_extadd_pairwise_i8x16_u; + expect(op).toBeDefined(); + expect(op.value).toBe(125); + expect(op.mnemonic).toBe("i16x8.extadd_pairwise_i8x16_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_extadd_pairwise_i16x8_s', () => { + const op = (OpCodes as any).i32x4_extadd_pairwise_i16x8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(126); + expect(op.mnemonic).toBe("i32x4.extadd_pairwise_i16x8_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_extadd_pairwise_i16x8_u', () => { + const op = (OpCodes as any).i32x4_extadd_pairwise_i16x8_u; + expect(op).toBeDefined(); + expect(op.value).toBe(127); + expect(op.mnemonic).toBe("i32x4.extadd_pairwise_i16x8_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_abs', () => { + const op = (OpCodes as any).i16x8_abs; + expect(op).toBeDefined(); + expect(op.value).toBe(128); + expect(op.mnemonic).toBe("i16x8.abs"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_neg', () => { + const op = (OpCodes as any).i16x8_neg; + expect(op).toBeDefined(); + expect(op.value).toBe(129); + expect(op.mnemonic).toBe("i16x8.neg"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_q15mulr_sat_s', () => { + const op = (OpCodes as any).i16x8_q15mulr_sat_s; + expect(op).toBeDefined(); + expect(op.value).toBe(130); + expect(op.mnemonic).toBe("i16x8.q15mulr_sat_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_all_true', () => { + const op = (OpCodes as any).i16x8_all_true; + expect(op).toBeDefined(); + expect(op.value).toBe(131); + expect(op.mnemonic).toBe("i16x8.all_true"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_bitmask', () => { + const op = (OpCodes as any).i16x8_bitmask; + expect(op).toBeDefined(); + expect(op.value).toBe(132); + expect(op.mnemonic).toBe("i16x8.bitmask"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_narrow_i32x4_s', () => { + const op = (OpCodes as any).i16x8_narrow_i32x4_s; + expect(op).toBeDefined(); + expect(op.value).toBe(133); + expect(op.mnemonic).toBe("i16x8.narrow_i32x4_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_narrow_i32x4_u', () => { + const op = (OpCodes as any).i16x8_narrow_i32x4_u; + expect(op).toBeDefined(); + expect(op.value).toBe(134); + expect(op.mnemonic).toBe("i16x8.narrow_i32x4_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extend_low_i8x16_s', () => { + const op = (OpCodes as any).i16x8_extend_low_i8x16_s; + expect(op).toBeDefined(); + expect(op.value).toBe(135); + expect(op.mnemonic).toBe("i16x8.extend_low_i8x16_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extend_high_i8x16_s', () => { + const op = (OpCodes as any).i16x8_extend_high_i8x16_s; + expect(op).toBeDefined(); + expect(op.value).toBe(136); + expect(op.mnemonic).toBe("i16x8.extend_high_i8x16_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extend_low_i8x16_u', () => { + const op = (OpCodes as any).i16x8_extend_low_i8x16_u; + expect(op).toBeDefined(); + expect(op.value).toBe(137); + expect(op.mnemonic).toBe("i16x8.extend_low_i8x16_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extend_high_i8x16_u', () => { + const op = (OpCodes as any).i16x8_extend_high_i8x16_u; + expect(op).toBeDefined(); + expect(op.value).toBe(138); + expect(op.mnemonic).toBe("i16x8.extend_high_i8x16_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_shl', () => { + const op = (OpCodes as any).i16x8_shl; + expect(op).toBeDefined(); + expect(op.value).toBe(139); + expect(op.mnemonic).toBe("i16x8.shl"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_shr_s', () => { + const op = (OpCodes as any).i16x8_shr_s; + expect(op).toBeDefined(); + expect(op.value).toBe(140); + expect(op.mnemonic).toBe("i16x8.shr_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_shr_u', () => { + const op = (OpCodes as any).i16x8_shr_u; + expect(op).toBeDefined(); + expect(op.value).toBe(141); + expect(op.mnemonic).toBe("i16x8.shr_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_add', () => { + const op = (OpCodes as any).i16x8_add; + expect(op).toBeDefined(); + expect(op.value).toBe(142); + expect(op.mnemonic).toBe("i16x8.add"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_add_sat_s', () => { + const op = (OpCodes as any).i16x8_add_sat_s; + expect(op).toBeDefined(); + expect(op.value).toBe(143); + expect(op.mnemonic).toBe("i16x8.add_sat_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_add_sat_u', () => { + const op = (OpCodes as any).i16x8_add_sat_u; + expect(op).toBeDefined(); + expect(op.value).toBe(144); + expect(op.mnemonic).toBe("i16x8.add_sat_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_sub', () => { + const op = (OpCodes as any).i16x8_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(145); + expect(op.mnemonic).toBe("i16x8.sub"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_sub_sat_s', () => { + const op = (OpCodes as any).i16x8_sub_sat_s; + expect(op).toBeDefined(); + expect(op.value).toBe(146); + expect(op.mnemonic).toBe("i16x8.sub_sat_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_sub_sat_u', () => { + const op = (OpCodes as any).i16x8_sub_sat_u; + expect(op).toBeDefined(); + expect(op.value).toBe(147); + expect(op.mnemonic).toBe("i16x8.sub_sat_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_nearest', () => { + const op = (OpCodes as any).f64x2_nearest; + expect(op).toBeDefined(); + expect(op.value).toBe(148); + expect(op.mnemonic).toBe("f64x2.nearest"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_mul', () => { + const op = (OpCodes as any).i16x8_mul; + expect(op).toBeDefined(); + expect(op.value).toBe(149); + expect(op.mnemonic).toBe("i16x8.mul"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_min_s', () => { + const op = (OpCodes as any).i16x8_min_s; + expect(op).toBeDefined(); + expect(op.value).toBe(150); + expect(op.mnemonic).toBe("i16x8.min_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_min_u', () => { + const op = (OpCodes as any).i16x8_min_u; + expect(op).toBeDefined(); + expect(op.value).toBe(151); + expect(op.mnemonic).toBe("i16x8.min_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_max_s', () => { + const op = (OpCodes as any).i16x8_max_s; + expect(op).toBeDefined(); + expect(op.value).toBe(152); + expect(op.mnemonic).toBe("i16x8.max_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_max_u', () => { + const op = (OpCodes as any).i16x8_max_u; + expect(op).toBeDefined(); + expect(op.value).toBe(153); + expect(op.mnemonic).toBe("i16x8.max_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_avgr_u', () => { + const op = (OpCodes as any).i16x8_avgr_u; + expect(op).toBeDefined(); + expect(op.value).toBe(155); + expect(op.mnemonic).toBe("i16x8.avgr_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extmul_low_i8x16_s', () => { + const op = (OpCodes as any).i16x8_extmul_low_i8x16_s; + expect(op).toBeDefined(); + expect(op.value).toBe(156); + expect(op.mnemonic).toBe("i16x8.extmul_low_i8x16_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extmul_high_i8x16_s', () => { + const op = (OpCodes as any).i16x8_extmul_high_i8x16_s; + expect(op).toBeDefined(); + expect(op.value).toBe(157); + expect(op.mnemonic).toBe("i16x8.extmul_high_i8x16_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extmul_low_i8x16_u', () => { + const op = (OpCodes as any).i16x8_extmul_low_i8x16_u; + expect(op).toBeDefined(); + expect(op.value).toBe(158); + expect(op.mnemonic).toBe("i16x8.extmul_low_i8x16_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i16x8_extmul_high_i8x16_u', () => { + const op = (OpCodes as any).i16x8_extmul_high_i8x16_u; + expect(op).toBeDefined(); + expect(op.value).toBe(159); + expect(op.mnemonic).toBe("i16x8.extmul_high_i8x16_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_abs', () => { + const op = (OpCodes as any).i32x4_abs; + expect(op).toBeDefined(); + expect(op.value).toBe(160); + expect(op.mnemonic).toBe("i32x4.abs"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_neg', () => { + const op = (OpCodes as any).i32x4_neg; + expect(op).toBeDefined(); + expect(op.value).toBe(161); + expect(op.mnemonic).toBe("i32x4.neg"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_all_true', () => { + const op = (OpCodes as any).i32x4_all_true; + expect(op).toBeDefined(); + expect(op.value).toBe(163); + expect(op.mnemonic).toBe("i32x4.all_true"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_bitmask', () => { + const op = (OpCodes as any).i32x4_bitmask; + expect(op).toBeDefined(); + expect(op.value).toBe(164); + expect(op.mnemonic).toBe("i32x4.bitmask"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_extend_low_i16x8_s', () => { + const op = (OpCodes as any).i32x4_extend_low_i16x8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(167); + expect(op.mnemonic).toBe("i32x4.extend_low_i16x8_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_extend_high_i16x8_s', () => { + const op = (OpCodes as any).i32x4_extend_high_i16x8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(168); + expect(op.mnemonic).toBe("i32x4.extend_high_i16x8_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_extend_low_i16x8_u', () => { + const op = (OpCodes as any).i32x4_extend_low_i16x8_u; + expect(op).toBeDefined(); + expect(op.value).toBe(169); + expect(op.mnemonic).toBe("i32x4.extend_low_i16x8_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_extend_high_i16x8_u', () => { + const op = (OpCodes as any).i32x4_extend_high_i16x8_u; + expect(op).toBeDefined(); + expect(op.value).toBe(170); + expect(op.mnemonic).toBe("i32x4.extend_high_i16x8_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_shl', () => { + const op = (OpCodes as any).i32x4_shl; + expect(op).toBeDefined(); + expect(op.value).toBe(171); + expect(op.mnemonic).toBe("i32x4.shl"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_shr_s', () => { + const op = (OpCodes as any).i32x4_shr_s; + expect(op).toBeDefined(); + expect(op.value).toBe(172); + expect(op.mnemonic).toBe("i32x4.shr_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_shr_u', () => { + const op = (OpCodes as any).i32x4_shr_u; + expect(op).toBeDefined(); + expect(op.value).toBe(173); + expect(op.mnemonic).toBe("i32x4.shr_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_add', () => { + const op = (OpCodes as any).i32x4_add; + expect(op).toBeDefined(); + expect(op.value).toBe(174); + expect(op.mnemonic).toBe("i32x4.add"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_convert_i32x4_s', () => { + const op = (OpCodes as any).f32x4_convert_i32x4_s; + expect(op).toBeDefined(); + expect(op.value).toBe(175); + expect(op.mnemonic).toBe("f32x4.convert_i32x4_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_convert_i32x4_u', () => { + const op = (OpCodes as any).f32x4_convert_i32x4_u; + expect(op).toBeDefined(); + expect(op.value).toBe(176); + expect(op.mnemonic).toBe("f32x4.convert_i32x4_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_sub', () => { + const op = (OpCodes as any).i32x4_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(177); + expect(op.mnemonic).toBe("i32x4.sub"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_mul', () => { + const op = (OpCodes as any).i32x4_mul; + expect(op).toBeDefined(); + expect(op.value).toBe(181); + expect(op.mnemonic).toBe("i32x4.mul"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_min_s', () => { + const op = (OpCodes as any).i32x4_min_s; + expect(op).toBeDefined(); + expect(op.value).toBe(182); + expect(op.mnemonic).toBe("i32x4.min_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_min_u', () => { + const op = (OpCodes as any).i32x4_min_u; + expect(op).toBeDefined(); + expect(op.value).toBe(183); + expect(op.mnemonic).toBe("i32x4.min_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_max_s', () => { + const op = (OpCodes as any).i32x4_max_s; + expect(op).toBeDefined(); + expect(op.value).toBe(184); + expect(op.mnemonic).toBe("i32x4.max_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_max_u', () => { + const op = (OpCodes as any).i32x4_max_u; + expect(op).toBeDefined(); + expect(op.value).toBe(185); + expect(op.mnemonic).toBe("i32x4.max_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_dot_i16x8_s', () => { + const op = (OpCodes as any).i32x4_dot_i16x8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(186); + expect(op.mnemonic).toBe("i32x4.dot_i16x8_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_extmul_low_i16x8_s', () => { + const op = (OpCodes as any).i32x4_extmul_low_i16x8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(188); + expect(op.mnemonic).toBe("i32x4.extmul_low_i16x8_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_extmul_high_i16x8_s', () => { + const op = (OpCodes as any).i32x4_extmul_high_i16x8_s; + expect(op).toBeDefined(); + expect(op.value).toBe(189); + expect(op.mnemonic).toBe("i32x4.extmul_high_i16x8_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_extmul_low_i16x8_u', () => { + const op = (OpCodes as any).i32x4_extmul_low_i16x8_u; + expect(op).toBeDefined(); + expect(op.value).toBe(190); + expect(op.mnemonic).toBe("i32x4.extmul_low_i16x8_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_extmul_high_i16x8_u', () => { + const op = (OpCodes as any).i32x4_extmul_high_i16x8_u; + expect(op).toBeDefined(); + expect(op.value).toBe(191); + expect(op.mnemonic).toBe("i32x4.extmul_high_i16x8_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_abs', () => { + const op = (OpCodes as any).i64x2_abs; + expect(op).toBeDefined(); + expect(op.value).toBe(192); + expect(op.mnemonic).toBe("i64x2.abs"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_neg', () => { + const op = (OpCodes as any).i64x2_neg; + expect(op).toBeDefined(); + expect(op.value).toBe(193); + expect(op.mnemonic).toBe("i64x2.neg"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_all_true', () => { + const op = (OpCodes as any).i64x2_all_true; + expect(op).toBeDefined(); + expect(op.value).toBe(195); + expect(op.mnemonic).toBe("i64x2.all_true"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_bitmask', () => { + const op = (OpCodes as any).i64x2_bitmask; + expect(op).toBeDefined(); + expect(op.value).toBe(196); + expect(op.mnemonic).toBe("i64x2.bitmask"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_extend_low_i32x4_s', () => { + const op = (OpCodes as any).i64x2_extend_low_i32x4_s; + expect(op).toBeDefined(); + expect(op.value).toBe(199); + expect(op.mnemonic).toBe("i64x2.extend_low_i32x4_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_extend_high_i32x4_s', () => { + const op = (OpCodes as any).i64x2_extend_high_i32x4_s; + expect(op).toBeDefined(); + expect(op.value).toBe(200); + expect(op.mnemonic).toBe("i64x2.extend_high_i32x4_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_extend_low_i32x4_u', () => { + const op = (OpCodes as any).i64x2_extend_low_i32x4_u; + expect(op).toBeDefined(); + expect(op.value).toBe(201); + expect(op.mnemonic).toBe("i64x2.extend_low_i32x4_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_extend_high_i32x4_u', () => { + const op = (OpCodes as any).i64x2_extend_high_i32x4_u; + expect(op).toBeDefined(); + expect(op.value).toBe(202); + expect(op.mnemonic).toBe("i64x2.extend_high_i32x4_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_shl', () => { + const op = (OpCodes as any).i64x2_shl; + expect(op).toBeDefined(); + expect(op.value).toBe(203); + expect(op.mnemonic).toBe("i64x2.shl"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_shr_s', () => { + const op = (OpCodes as any).i64x2_shr_s; + expect(op).toBeDefined(); + expect(op.value).toBe(204); + expect(op.mnemonic).toBe("i64x2.shr_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_shr_u', () => { + const op = (OpCodes as any).i64x2_shr_u; + expect(op).toBeDefined(); + expect(op.value).toBe(205); + expect(op.mnemonic).toBe("i64x2.shr_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_add', () => { + const op = (OpCodes as any).i64x2_add; + expect(op).toBeDefined(); + expect(op.value).toBe(206); + expect(op.mnemonic).toBe("i64x2.add"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_sub', () => { + const op = (OpCodes as any).i64x2_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(209); + expect(op.mnemonic).toBe("i64x2.sub"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_mul', () => { + const op = (OpCodes as any).i64x2_mul; + expect(op).toBeDefined(); + expect(op.value).toBe(213); + expect(op.mnemonic).toBe("i64x2.mul"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_eq', () => { + const op = (OpCodes as any).i64x2_eq; + expect(op).toBeDefined(); + expect(op.value).toBe(214); + expect(op.mnemonic).toBe("i64x2.eq"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_ne', () => { + const op = (OpCodes as any).i64x2_ne; + expect(op).toBeDefined(); + expect(op.value).toBe(215); + expect(op.mnemonic).toBe("i64x2.ne"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_lt_s', () => { + const op = (OpCodes as any).i64x2_lt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(216); + expect(op.mnemonic).toBe("i64x2.lt_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_gt_s', () => { + const op = (OpCodes as any).i64x2_gt_s; + expect(op).toBeDefined(); + expect(op.value).toBe(217); + expect(op.mnemonic).toBe("i64x2.gt_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_le_s', () => { + const op = (OpCodes as any).i64x2_le_s; + expect(op).toBeDefined(); + expect(op.value).toBe(218); + expect(op.mnemonic).toBe("i64x2.le_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_ge_s', () => { + const op = (OpCodes as any).i64x2_ge_s; + expect(op).toBeDefined(); + expect(op.value).toBe(219); + expect(op.mnemonic).toBe("i64x2.ge_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_extmul_low_i32x4_s', () => { + const op = (OpCodes as any).i64x2_extmul_low_i32x4_s; + expect(op).toBeDefined(); + expect(op.value).toBe(220); + expect(op.mnemonic).toBe("i64x2.extmul_low_i32x4_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_extmul_high_i32x4_s', () => { + const op = (OpCodes as any).i64x2_extmul_high_i32x4_s; + expect(op).toBeDefined(); + expect(op.value).toBe(221); + expect(op.mnemonic).toBe("i64x2.extmul_high_i32x4_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_extmul_low_i32x4_u', () => { + const op = (OpCodes as any).i64x2_extmul_low_i32x4_u; + expect(op).toBeDefined(); + expect(op.value).toBe(222); + expect(op.mnemonic).toBe("i64x2.extmul_low_i32x4_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i64x2_extmul_high_i32x4_u', () => { + const op = (OpCodes as any).i64x2_extmul_high_i32x4_u; + expect(op).toBeDefined(); + expect(op.value).toBe(223); + expect(op.mnemonic).toBe("i64x2.extmul_high_i32x4_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_abs', () => { + const op = (OpCodes as any).f32x4_abs; + expect(op).toBeDefined(); + expect(op.value).toBe(224); + expect(op.mnemonic).toBe("f32x4.abs"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_neg', () => { + const op = (OpCodes as any).f32x4_neg; + expect(op).toBeDefined(); + expect(op.value).toBe(225); + expect(op.mnemonic).toBe("f32x4.neg"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_sqrt', () => { + const op = (OpCodes as any).f32x4_sqrt; + expect(op).toBeDefined(); + expect(op.value).toBe(227); + expect(op.mnemonic).toBe("f32x4.sqrt"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_add', () => { + const op = (OpCodes as any).f32x4_add; + expect(op).toBeDefined(); + expect(op.value).toBe(228); + expect(op.mnemonic).toBe("f32x4.add"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_sub', () => { + const op = (OpCodes as any).f32x4_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(229); + expect(op.mnemonic).toBe("f32x4.sub"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_mul', () => { + const op = (OpCodes as any).f32x4_mul; + expect(op).toBeDefined(); + expect(op.value).toBe(230); + expect(op.mnemonic).toBe("f32x4.mul"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_div', () => { + const op = (OpCodes as any).f32x4_div; + expect(op).toBeDefined(); + expect(op.value).toBe(231); + expect(op.mnemonic).toBe("f32x4.div"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_min', () => { + const op = (OpCodes as any).f32x4_min; + expect(op).toBeDefined(); + expect(op.value).toBe(232); + expect(op.mnemonic).toBe("f32x4.min"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_max', () => { + const op = (OpCodes as any).f32x4_max; + expect(op).toBeDefined(); + expect(op.value).toBe(233); + expect(op.mnemonic).toBe("f32x4.max"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_pmin', () => { + const op = (OpCodes as any).f32x4_pmin; + expect(op).toBeDefined(); + expect(op.value).toBe(234); + expect(op.mnemonic).toBe("f32x4.pmin"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_pmax', () => { + const op = (OpCodes as any).f32x4_pmax; + expect(op).toBeDefined(); + expect(op.value).toBe(235); + expect(op.mnemonic).toBe("f32x4.pmax"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_abs', () => { + const op = (OpCodes as any).f64x2_abs; + expect(op).toBeDefined(); + expect(op.value).toBe(236); + expect(op.mnemonic).toBe("f64x2.abs"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_neg', () => { + const op = (OpCodes as any).f64x2_neg; + expect(op).toBeDefined(); + expect(op.value).toBe(237); + expect(op.mnemonic).toBe("f64x2.neg"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_sqrt', () => { + const op = (OpCodes as any).f64x2_sqrt; + expect(op).toBeDefined(); + expect(op.value).toBe(239); + expect(op.mnemonic).toBe("f64x2.sqrt"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_add', () => { + const op = (OpCodes as any).f64x2_add; + expect(op).toBeDefined(); + expect(op.value).toBe(240); + expect(op.mnemonic).toBe("f64x2.add"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_sub', () => { + const op = (OpCodes as any).f64x2_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(241); + expect(op.mnemonic).toBe("f64x2.sub"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_mul', () => { + const op = (OpCodes as any).f64x2_mul; + expect(op).toBeDefined(); + expect(op.value).toBe(242); + expect(op.mnemonic).toBe("f64x2.mul"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_div', () => { + const op = (OpCodes as any).f64x2_div; + expect(op).toBeDefined(); + expect(op.value).toBe(243); + expect(op.mnemonic).toBe("f64x2.div"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_min', () => { + const op = (OpCodes as any).f64x2_min; + expect(op).toBeDefined(); + expect(op.value).toBe(244); + expect(op.mnemonic).toBe("f64x2.min"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_max', () => { + const op = (OpCodes as any).f64x2_max; + expect(op).toBeDefined(); + expect(op.value).toBe(245); + expect(op.mnemonic).toBe("f64x2.max"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_pmin', () => { + const op = (OpCodes as any).f64x2_pmin; + expect(op).toBeDefined(); + expect(op.value).toBe(246); + expect(op.mnemonic).toBe("f64x2.pmin"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_pmax', () => { + const op = (OpCodes as any).f64x2_pmax; + expect(op).toBeDefined(); + expect(op.value).toBe(247); + expect(op.mnemonic).toBe("f64x2.pmax"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_trunc_sat_f64x2_s_zero', () => { + const op = (OpCodes as any).i32x4_trunc_sat_f64x2_s_zero; + expect(op).toBeDefined(); + expect(op.value).toBe(248); + expect(op.mnemonic).toBe("i32x4.trunc_sat_f64x2_s_zero"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('i32x4_trunc_sat_f64x2_u_zero', () => { + const op = (OpCodes as any).i32x4_trunc_sat_f64x2_u_zero; + expect(op).toBeDefined(); + expect(op.value).toBe(249); + expect(op.mnemonic).toBe("i32x4.trunc_sat_f64x2_u_zero"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_convert_low_i32x4_s', () => { + const op = (OpCodes as any).f64x2_convert_low_i32x4_s; + expect(op).toBeDefined(); + expect(op.value).toBe(250); + expect(op.mnemonic).toBe("f64x2.convert_low_i32x4_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_convert_low_i32x4_u', () => { + const op = (OpCodes as any).f64x2_convert_low_i32x4_u; + expect(op).toBeDefined(); + expect(op.value).toBe(251); + expect(op.mnemonic).toBe("f64x2.convert_low_i32x4_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f32x4_demote_f64x2_zero', () => { + const op = (OpCodes as any).f32x4_demote_f64x2_zero; + expect(op).toBeDefined(); + expect(op.value).toBe(252); + expect(op.mnemonic).toBe("f32x4.demote_f64x2_zero"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + test('f64x2_promote_low_f32x4', () => { + const op = (OpCodes as any).f64x2_promote_low_f32x4; + expect(op).toBeDefined(); + expect(op.value).toBe(253); + expect(op.mnemonic).toBe("f64x2.promote_low_f32x4"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("simd"); + }); + + }); + + describe('atomics', () => { + test('memory_atomic_notify', () => { + const op = (OpCodes as any).memory_atomic_notify; + expect(op).toBeDefined(); + expect(op.value).toBe(0); + expect(op.mnemonic).toBe("memory.atomic.notify"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('memory_atomic_wait32', () => { + const op = (OpCodes as any).memory_atomic_wait32; + expect(op).toBeDefined(); + expect(op.value).toBe(1); + expect(op.mnemonic).toBe("memory.atomic.wait32"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('memory_atomic_wait64', () => { + const op = (OpCodes as any).memory_atomic_wait64; + expect(op).toBeDefined(); + expect(op.value).toBe(2); + expect(op.mnemonic).toBe("memory.atomic.wait64"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('atomic_fence', () => { + const op = (OpCodes as any).atomic_fence; + expect(op).toBeDefined(); + expect(op.value).toBe(3); + expect(op.mnemonic).toBe("atomic.fence"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_load', () => { + const op = (OpCodes as any).i32_atomic_load; + expect(op).toBeDefined(); + expect(op.value).toBe(16); + expect(op.mnemonic).toBe("i32.atomic.load"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_load', () => { + const op = (OpCodes as any).i64_atomic_load; + expect(op).toBeDefined(); + expect(op.value).toBe(17); + expect(op.mnemonic).toBe("i64.atomic.load"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_load8_u', () => { + const op = (OpCodes as any).i32_atomic_load8_u; + expect(op).toBeDefined(); + expect(op.value).toBe(18); + expect(op.mnemonic).toBe("i32.atomic.load8_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_load16_u', () => { + const op = (OpCodes as any).i32_atomic_load16_u; + expect(op).toBeDefined(); + expect(op.value).toBe(19); + expect(op.mnemonic).toBe("i32.atomic.load16_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_load8_u', () => { + const op = (OpCodes as any).i64_atomic_load8_u; + expect(op).toBeDefined(); + expect(op.value).toBe(20); + expect(op.mnemonic).toBe("i64.atomic.load8_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_load16_u', () => { + const op = (OpCodes as any).i64_atomic_load16_u; + expect(op).toBeDefined(); + expect(op.value).toBe(21); + expect(op.mnemonic).toBe("i64.atomic.load16_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_load32_u', () => { + const op = (OpCodes as any).i64_atomic_load32_u; + expect(op).toBeDefined(); + expect(op.value).toBe(22); + expect(op.mnemonic).toBe("i64.atomic.load32_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_store', () => { + const op = (OpCodes as any).i32_atomic_store; + expect(op).toBeDefined(); + expect(op.value).toBe(23); + expect(op.mnemonic).toBe("i32.atomic.store"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_store', () => { + const op = (OpCodes as any).i64_atomic_store; + expect(op).toBeDefined(); + expect(op.value).toBe(24); + expect(op.mnemonic).toBe("i64.atomic.store"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_store8', () => { + const op = (OpCodes as any).i32_atomic_store8; + expect(op).toBeDefined(); + expect(op.value).toBe(25); + expect(op.mnemonic).toBe("i32.atomic.store8"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_store16', () => { + const op = (OpCodes as any).i32_atomic_store16; + expect(op).toBeDefined(); + expect(op.value).toBe(26); + expect(op.mnemonic).toBe("i32.atomic.store16"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_store8', () => { + const op = (OpCodes as any).i64_atomic_store8; + expect(op).toBeDefined(); + expect(op.value).toBe(27); + expect(op.mnemonic).toBe("i64.atomic.store8"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_store16', () => { + const op = (OpCodes as any).i64_atomic_store16; + expect(op).toBeDefined(); + expect(op.value).toBe(28); + expect(op.mnemonic).toBe("i64.atomic.store16"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_store32', () => { + const op = (OpCodes as any).i64_atomic_store32; + expect(op).toBeDefined(); + expect(op.value).toBe(29); + expect(op.mnemonic).toBe("i64.atomic.store32"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw_add', () => { + const op = (OpCodes as any).i32_atomic_rmw_add; + expect(op).toBeDefined(); + expect(op.value).toBe(30); + expect(op.mnemonic).toBe("i32.atomic.rmw.add"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw_add', () => { + const op = (OpCodes as any).i64_atomic_rmw_add; + expect(op).toBeDefined(); + expect(op.value).toBe(31); + expect(op.mnemonic).toBe("i64.atomic.rmw.add"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw8_add_u', () => { + const op = (OpCodes as any).i32_atomic_rmw8_add_u; + expect(op).toBeDefined(); + expect(op.value).toBe(32); + expect(op.mnemonic).toBe("i32.atomic.rmw8.add_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw16_add_u', () => { + const op = (OpCodes as any).i32_atomic_rmw16_add_u; + expect(op).toBeDefined(); + expect(op.value).toBe(33); + expect(op.mnemonic).toBe("i32.atomic.rmw16.add_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw8_add_u', () => { + const op = (OpCodes as any).i64_atomic_rmw8_add_u; + expect(op).toBeDefined(); + expect(op.value).toBe(34); + expect(op.mnemonic).toBe("i64.atomic.rmw8.add_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw16_add_u', () => { + const op = (OpCodes as any).i64_atomic_rmw16_add_u; + expect(op).toBeDefined(); + expect(op.value).toBe(35); + expect(op.mnemonic).toBe("i64.atomic.rmw16.add_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw32_add_u', () => { + const op = (OpCodes as any).i64_atomic_rmw32_add_u; + expect(op).toBeDefined(); + expect(op.value).toBe(36); + expect(op.mnemonic).toBe("i64.atomic.rmw32.add_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw_sub', () => { + const op = (OpCodes as any).i32_atomic_rmw_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(37); + expect(op.mnemonic).toBe("i32.atomic.rmw.sub"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw_sub', () => { + const op = (OpCodes as any).i64_atomic_rmw_sub; + expect(op).toBeDefined(); + expect(op.value).toBe(38); + expect(op.mnemonic).toBe("i64.atomic.rmw.sub"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw8_sub_u', () => { + const op = (OpCodes as any).i32_atomic_rmw8_sub_u; + expect(op).toBeDefined(); + expect(op.value).toBe(39); + expect(op.mnemonic).toBe("i32.atomic.rmw8.sub_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw16_sub_u', () => { + const op = (OpCodes as any).i32_atomic_rmw16_sub_u; + expect(op).toBeDefined(); + expect(op.value).toBe(40); + expect(op.mnemonic).toBe("i32.atomic.rmw16.sub_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw8_sub_u', () => { + const op = (OpCodes as any).i64_atomic_rmw8_sub_u; + expect(op).toBeDefined(); + expect(op.value).toBe(41); + expect(op.mnemonic).toBe("i64.atomic.rmw8.sub_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw16_sub_u', () => { + const op = (OpCodes as any).i64_atomic_rmw16_sub_u; + expect(op).toBeDefined(); + expect(op.value).toBe(42); + expect(op.mnemonic).toBe("i64.atomic.rmw16.sub_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw32_sub_u', () => { + const op = (OpCodes as any).i64_atomic_rmw32_sub_u; + expect(op).toBeDefined(); + expect(op.value).toBe(43); + expect(op.mnemonic).toBe("i64.atomic.rmw32.sub_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw_and', () => { + const op = (OpCodes as any).i32_atomic_rmw_and; + expect(op).toBeDefined(); + expect(op.value).toBe(44); + expect(op.mnemonic).toBe("i32.atomic.rmw.and"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw_and', () => { + const op = (OpCodes as any).i64_atomic_rmw_and; + expect(op).toBeDefined(); + expect(op.value).toBe(45); + expect(op.mnemonic).toBe("i64.atomic.rmw.and"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw8_and_u', () => { + const op = (OpCodes as any).i32_atomic_rmw8_and_u; + expect(op).toBeDefined(); + expect(op.value).toBe(46); + expect(op.mnemonic).toBe("i32.atomic.rmw8.and_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw16_and_u', () => { + const op = (OpCodes as any).i32_atomic_rmw16_and_u; + expect(op).toBeDefined(); + expect(op.value).toBe(47); + expect(op.mnemonic).toBe("i32.atomic.rmw16.and_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw8_and_u', () => { + const op = (OpCodes as any).i64_atomic_rmw8_and_u; + expect(op).toBeDefined(); + expect(op.value).toBe(48); + expect(op.mnemonic).toBe("i64.atomic.rmw8.and_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw16_and_u', () => { + const op = (OpCodes as any).i64_atomic_rmw16_and_u; + expect(op).toBeDefined(); + expect(op.value).toBe(49); + expect(op.mnemonic).toBe("i64.atomic.rmw16.and_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw32_and_u', () => { + const op = (OpCodes as any).i64_atomic_rmw32_and_u; + expect(op).toBeDefined(); + expect(op.value).toBe(50); + expect(op.mnemonic).toBe("i64.atomic.rmw32.and_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw_or', () => { + const op = (OpCodes as any).i32_atomic_rmw_or; + expect(op).toBeDefined(); + expect(op.value).toBe(51); + expect(op.mnemonic).toBe("i32.atomic.rmw.or"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw_or', () => { + const op = (OpCodes as any).i64_atomic_rmw_or; + expect(op).toBeDefined(); + expect(op.value).toBe(52); + expect(op.mnemonic).toBe("i64.atomic.rmw.or"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw8_or_u', () => { + const op = (OpCodes as any).i32_atomic_rmw8_or_u; + expect(op).toBeDefined(); + expect(op.value).toBe(53); + expect(op.mnemonic).toBe("i32.atomic.rmw8.or_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw16_or_u', () => { + const op = (OpCodes as any).i32_atomic_rmw16_or_u; + expect(op).toBeDefined(); + expect(op.value).toBe(54); + expect(op.mnemonic).toBe("i32.atomic.rmw16.or_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw8_or_u', () => { + const op = (OpCodes as any).i64_atomic_rmw8_or_u; + expect(op).toBeDefined(); + expect(op.value).toBe(55); + expect(op.mnemonic).toBe("i64.atomic.rmw8.or_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw16_or_u', () => { + const op = (OpCodes as any).i64_atomic_rmw16_or_u; + expect(op).toBeDefined(); + expect(op.value).toBe(56); + expect(op.mnemonic).toBe("i64.atomic.rmw16.or_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw32_or_u', () => { + const op = (OpCodes as any).i64_atomic_rmw32_or_u; + expect(op).toBeDefined(); + expect(op.value).toBe(57); + expect(op.mnemonic).toBe("i64.atomic.rmw32.or_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw_xor', () => { + const op = (OpCodes as any).i32_atomic_rmw_xor; + expect(op).toBeDefined(); + expect(op.value).toBe(58); + expect(op.mnemonic).toBe("i32.atomic.rmw.xor"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw_xor', () => { + const op = (OpCodes as any).i64_atomic_rmw_xor; + expect(op).toBeDefined(); + expect(op.value).toBe(59); + expect(op.mnemonic).toBe("i64.atomic.rmw.xor"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw8_xor_u', () => { + const op = (OpCodes as any).i32_atomic_rmw8_xor_u; + expect(op).toBeDefined(); + expect(op.value).toBe(60); + expect(op.mnemonic).toBe("i32.atomic.rmw8.xor_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw16_xor_u', () => { + const op = (OpCodes as any).i32_atomic_rmw16_xor_u; + expect(op).toBeDefined(); + expect(op.value).toBe(61); + expect(op.mnemonic).toBe("i32.atomic.rmw16.xor_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw8_xor_u', () => { + const op = (OpCodes as any).i64_atomic_rmw8_xor_u; + expect(op).toBeDefined(); + expect(op.value).toBe(62); + expect(op.mnemonic).toBe("i64.atomic.rmw8.xor_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw16_xor_u', () => { + const op = (OpCodes as any).i64_atomic_rmw16_xor_u; + expect(op).toBeDefined(); + expect(op.value).toBe(63); + expect(op.mnemonic).toBe("i64.atomic.rmw16.xor_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw32_xor_u', () => { + const op = (OpCodes as any).i64_atomic_rmw32_xor_u; + expect(op).toBeDefined(); + expect(op.value).toBe(64); + expect(op.mnemonic).toBe("i64.atomic.rmw32.xor_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw_xchg', () => { + const op = (OpCodes as any).i32_atomic_rmw_xchg; + expect(op).toBeDefined(); + expect(op.value).toBe(65); + expect(op.mnemonic).toBe("i32.atomic.rmw.xchg"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw_xchg', () => { + const op = (OpCodes as any).i64_atomic_rmw_xchg; + expect(op).toBeDefined(); + expect(op.value).toBe(66); + expect(op.mnemonic).toBe("i64.atomic.rmw.xchg"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw8_xchg_u', () => { + const op = (OpCodes as any).i32_atomic_rmw8_xchg_u; + expect(op).toBeDefined(); + expect(op.value).toBe(67); + expect(op.mnemonic).toBe("i32.atomic.rmw8.xchg_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw16_xchg_u', () => { + const op = (OpCodes as any).i32_atomic_rmw16_xchg_u; + expect(op).toBeDefined(); + expect(op.value).toBe(68); + expect(op.mnemonic).toBe("i32.atomic.rmw16.xchg_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw8_xchg_u', () => { + const op = (OpCodes as any).i64_atomic_rmw8_xchg_u; + expect(op).toBeDefined(); + expect(op.value).toBe(69); + expect(op.mnemonic).toBe("i64.atomic.rmw8.xchg_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw16_xchg_u', () => { + const op = (OpCodes as any).i64_atomic_rmw16_xchg_u; + expect(op).toBeDefined(); + expect(op.value).toBe(70); + expect(op.mnemonic).toBe("i64.atomic.rmw16.xchg_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw32_xchg_u', () => { + const op = (OpCodes as any).i64_atomic_rmw32_xchg_u; + expect(op).toBeDefined(); + expect(op.value).toBe(71); + expect(op.mnemonic).toBe("i64.atomic.rmw32.xchg_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw_cmpxchg', () => { + const op = (OpCodes as any).i32_atomic_rmw_cmpxchg; + expect(op).toBeDefined(); + expect(op.value).toBe(72); + expect(op.mnemonic).toBe("i32.atomic.rmw.cmpxchg"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw_cmpxchg', () => { + const op = (OpCodes as any).i64_atomic_rmw_cmpxchg; + expect(op).toBeDefined(); + expect(op.value).toBe(73); + expect(op.mnemonic).toBe("i64.atomic.rmw.cmpxchg"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw8_cmpxchg_u', () => { + const op = (OpCodes as any).i32_atomic_rmw8_cmpxchg_u; + expect(op).toBeDefined(); + expect(op.value).toBe(74); + expect(op.mnemonic).toBe("i32.atomic.rmw8.cmpxchg_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i32_atomic_rmw16_cmpxchg_u', () => { + const op = (OpCodes as any).i32_atomic_rmw16_cmpxchg_u; + expect(op).toBeDefined(); + expect(op.value).toBe(75); + expect(op.mnemonic).toBe("i32.atomic.rmw16.cmpxchg_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw8_cmpxchg_u', () => { + const op = (OpCodes as any).i64_atomic_rmw8_cmpxchg_u; + expect(op).toBeDefined(); + expect(op.value).toBe(76); + expect(op.mnemonic).toBe("i64.atomic.rmw8.cmpxchg_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw16_cmpxchg_u', () => { + const op = (OpCodes as any).i64_atomic_rmw16_cmpxchg_u; + expect(op).toBeDefined(); + expect(op.value).toBe(77); + expect(op.mnemonic).toBe("i64.atomic.rmw16.cmpxchg_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + test('i64_atomic_rmw32_cmpxchg_u', () => { + const op = (OpCodes as any).i64_atomic_rmw32_cmpxchg_u; + expect(op).toBeDefined(); + expect(op.value).toBe(78); + expect(op.mnemonic).toBe("i64.atomic.rmw32.cmpxchg_u"); + expect(op.prefix).toBe(254); + expect(op.feature).toBe("threads"); + }); + + }); + + describe('relaxed-simd', () => { + test('i8x16_relaxed_swizzle', () => { + const op = (OpCodes as any).i8x16_relaxed_swizzle; + expect(op).toBeDefined(); + expect(op.value).toBe(256); + expect(op.mnemonic).toBe("i8x16.relaxed_swizzle"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('i32x4_relaxed_trunc_f32x4_s', () => { + const op = (OpCodes as any).i32x4_relaxed_trunc_f32x4_s; + expect(op).toBeDefined(); + expect(op.value).toBe(257); + expect(op.mnemonic).toBe("i32x4.relaxed_trunc_f32x4_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('i32x4_relaxed_trunc_f32x4_u', () => { + const op = (OpCodes as any).i32x4_relaxed_trunc_f32x4_u; + expect(op).toBeDefined(); + expect(op.value).toBe(258); + expect(op.mnemonic).toBe("i32x4.relaxed_trunc_f32x4_u"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('i32x4_relaxed_trunc_f64x2_s_zero', () => { + const op = (OpCodes as any).i32x4_relaxed_trunc_f64x2_s_zero; + expect(op).toBeDefined(); + expect(op.value).toBe(259); + expect(op.mnemonic).toBe("i32x4.relaxed_trunc_f64x2_s_zero"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('i32x4_relaxed_trunc_f64x2_u_zero', () => { + const op = (OpCodes as any).i32x4_relaxed_trunc_f64x2_u_zero; + expect(op).toBeDefined(); + expect(op.value).toBe(260); + expect(op.mnemonic).toBe("i32x4.relaxed_trunc_f64x2_u_zero"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('f32x4_relaxed_madd', () => { + const op = (OpCodes as any).f32x4_relaxed_madd; + expect(op).toBeDefined(); + expect(op.value).toBe(261); + expect(op.mnemonic).toBe("f32x4.relaxed_madd"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('f32x4_relaxed_nmadd', () => { + const op = (OpCodes as any).f32x4_relaxed_nmadd; + expect(op).toBeDefined(); + expect(op.value).toBe(262); + expect(op.mnemonic).toBe("f32x4.relaxed_nmadd"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('f64x2_relaxed_madd', () => { + const op = (OpCodes as any).f64x2_relaxed_madd; + expect(op).toBeDefined(); + expect(op.value).toBe(263); + expect(op.mnemonic).toBe("f64x2.relaxed_madd"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('f64x2_relaxed_nmadd', () => { + const op = (OpCodes as any).f64x2_relaxed_nmadd; + expect(op).toBeDefined(); + expect(op.value).toBe(264); + expect(op.mnemonic).toBe("f64x2.relaxed_nmadd"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('i8x16_relaxed_laneselect', () => { + const op = (OpCodes as any).i8x16_relaxed_laneselect; + expect(op).toBeDefined(); + expect(op.value).toBe(265); + expect(op.mnemonic).toBe("i8x16.relaxed_laneselect"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('i16x8_relaxed_laneselect', () => { + const op = (OpCodes as any).i16x8_relaxed_laneselect; + expect(op).toBeDefined(); + expect(op.value).toBe(266); + expect(op.mnemonic).toBe("i16x8.relaxed_laneselect"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('i32x4_relaxed_laneselect', () => { + const op = (OpCodes as any).i32x4_relaxed_laneselect; + expect(op).toBeDefined(); + expect(op.value).toBe(267); + expect(op.mnemonic).toBe("i32x4.relaxed_laneselect"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('i64x2_relaxed_laneselect', () => { + const op = (OpCodes as any).i64x2_relaxed_laneselect; + expect(op).toBeDefined(); + expect(op.value).toBe(268); + expect(op.mnemonic).toBe("i64x2.relaxed_laneselect"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('f32x4_relaxed_min', () => { + const op = (OpCodes as any).f32x4_relaxed_min; + expect(op).toBeDefined(); + expect(op.value).toBe(269); + expect(op.mnemonic).toBe("f32x4.relaxed_min"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('f32x4_relaxed_max', () => { + const op = (OpCodes as any).f32x4_relaxed_max; + expect(op).toBeDefined(); + expect(op.value).toBe(270); + expect(op.mnemonic).toBe("f32x4.relaxed_max"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('f64x2_relaxed_min', () => { + const op = (OpCodes as any).f64x2_relaxed_min; + expect(op).toBeDefined(); + expect(op.value).toBe(271); + expect(op.mnemonic).toBe("f64x2.relaxed_min"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('f64x2_relaxed_max', () => { + const op = (OpCodes as any).f64x2_relaxed_max; + expect(op).toBeDefined(); + expect(op.value).toBe(272); + expect(op.mnemonic).toBe("f64x2.relaxed_max"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('i16x8_relaxed_q15mulr_s', () => { + const op = (OpCodes as any).i16x8_relaxed_q15mulr_s; + expect(op).toBeDefined(); + expect(op.value).toBe(273); + expect(op.mnemonic).toBe("i16x8.relaxed_q15mulr_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('i16x8_relaxed_dot_i8x16_i7x16_s', () => { + const op = (OpCodes as any).i16x8_relaxed_dot_i8x16_i7x16_s; + expect(op).toBeDefined(); + expect(op.value).toBe(274); + expect(op.mnemonic).toBe("i16x8.relaxed_dot_i8x16_i7x16_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + test('i32x4_relaxed_dot_i8x16_i7x16_add_s', () => { + const op = (OpCodes as any).i32x4_relaxed_dot_i8x16_i7x16_add_s; + expect(op).toBeDefined(); + expect(op.value).toBe(275); + expect(op.mnemonic).toBe("i32x4.relaxed_dot_i8x16_i7x16_add_s"); + expect(op.prefix).toBe(253); + expect(op.feature).toBe("relaxed-simd"); + }); + + }); + + describe('feature groups', () => { + test('exception-handling: 6 opcodes', () => { + const ops = Object.values(OpCodes).filter((op: any) => op.feature === 'exception-handling'); + expect(ops.length).toBe(6); + }); + + test('tail-call: 2 opcodes', () => { + const ops = Object.values(OpCodes).filter((op: any) => op.feature === 'tail-call'); + expect(ops.length).toBe(2); + }); + + test('sign-extend: 5 opcodes', () => { + const ops = Object.values(OpCodes).filter((op: any) => op.feature === 'sign-extend'); + expect(ops.length).toBe(5); + }); + + test('sat-trunc: 8 opcodes', () => { + const ops = Object.values(OpCodes).filter((op: any) => op.feature === 'sat-trunc'); + expect(ops.length).toBe(8); + ops.forEach((op: any) => expect(op.prefix).toBe(252)); + }); + + test('bulk-memory: 7 opcodes', () => { + const ops = Object.values(OpCodes).filter((op: any) => op.feature === 'bulk-memory'); + expect(ops.length).toBe(7); + ops.forEach((op: any) => expect(op.prefix).toBe(252)); + }); + + test('reference-types: 8 opcodes', () => { + const ops = Object.values(OpCodes).filter((op: any) => op.feature === 'reference-types'); + expect(ops.length).toBe(8); + }); + + test('simd: 236 opcodes', () => { + const ops = Object.values(OpCodes).filter((op: any) => op.feature === 'simd'); + expect(ops.length).toBe(236); + ops.forEach((op: any) => expect(op.prefix).toBe(253)); + }); + + test('threads: 67 opcodes', () => { + const ops = Object.values(OpCodes).filter((op: any) => op.feature === 'threads'); + expect(ops.length).toBe(67); + ops.forEach((op: any) => expect(op.prefix).toBe(254)); + }); + + test('relaxed-simd: 20 opcodes', () => { + const ops = Object.values(OpCodes).filter((op: any) => op.feature === 'relaxed-simd'); + expect(ops.length).toBe(20); + ops.forEach((op: any) => expect(op.prefix).toBe(253)); + }); + + }); +}); + +describe('Emitter methods', () => { + describe('control-flow', () => { + test('unreachable', () => { + expect(typeof (OpCodeEmitter.prototype as any).unreachable).toBe('function'); + }); + + test('nop', () => { + expect(typeof (OpCodeEmitter.prototype as any).nop).toBe('function'); + }); + + test('block', () => { + expect(typeof (OpCodeEmitter.prototype as any).block).toBe('function'); + }); + + test('loop', () => { + expect(typeof (OpCodeEmitter.prototype as any).loop).toBe('function'); + }); + + test('if', () => { + expect(typeof (OpCodeEmitter.prototype as any).if).toBe('function'); + }); + + test('else', () => { + expect(typeof (OpCodeEmitter.prototype as any).else).toBe('function'); + }); + + test('end', () => { + expect(typeof (OpCodeEmitter.prototype as any).end).toBe('function'); + }); + + test('br', () => { + expect(typeof (OpCodeEmitter.prototype as any).br).toBe('function'); + }); + + test('br_if', () => { + expect(typeof (OpCodeEmitter.prototype as any).br_if).toBe('function'); + }); + + test('br_table', () => { + expect(typeof (OpCodeEmitter.prototype as any).br_table).toBe('function'); + }); + + test('return', () => { + expect(typeof (OpCodeEmitter.prototype as any).return).toBe('function'); + }); + + }); + + describe('exception-handling', () => { + test('try', () => { + expect(typeof (OpCodeEmitter.prototype as any).try).toBe('function'); + }); + + test('catch', () => { + expect(typeof (OpCodeEmitter.prototype as any).catch).toBe('function'); + }); + + test('throw', () => { + expect(typeof (OpCodeEmitter.prototype as any).throw).toBe('function'); + }); + + test('rethrow', () => { + expect(typeof (OpCodeEmitter.prototype as any).rethrow).toBe('function'); + }); + + test('delegate', () => { + expect(typeof (OpCodeEmitter.prototype as any).delegate).toBe('function'); + }); + + test('catch_all', () => { + expect(typeof (OpCodeEmitter.prototype as any).catch_all).toBe('function'); + }); + + }); + + describe('call', () => { + test('call', () => { + expect(typeof (OpCodeEmitter.prototype as any).call).toBe('function'); + }); + + test('call_indirect', () => { + expect(typeof (OpCodeEmitter.prototype as any).call_indirect).toBe('function'); + }); + + test('return_call', () => { + expect(typeof (OpCodeEmitter.prototype as any).return_call).toBe('function'); + }); + + test('return_call_indirect', () => { + expect(typeof (OpCodeEmitter.prototype as any).return_call_indirect).toBe('function'); + }); + + }); + + describe('parametric', () => { + test('drop', () => { + expect(typeof (OpCodeEmitter.prototype as any).drop).toBe('function'); + }); + + test('select', () => { + expect(typeof (OpCodeEmitter.prototype as any).select).toBe('function'); + }); + + }); + + describe('variable', () => { + test('get_local', () => { + expect(typeof (OpCodeEmitter.prototype as any).get_local).toBe('function'); + }); + + test('set_local', () => { + expect(typeof (OpCodeEmitter.prototype as any).set_local).toBe('function'); + }); + + test('tee_local', () => { + expect(typeof (OpCodeEmitter.prototype as any).tee_local).toBe('function'); + }); + + test('get_global', () => { + expect(typeof (OpCodeEmitter.prototype as any).get_global).toBe('function'); + }); + + test('set_global', () => { + expect(typeof (OpCodeEmitter.prototype as any).set_global).toBe('function'); + }); + + }); + + describe('memory', () => { + test('load_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).load_i32).toBe('function'); + }); + + test('load_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).load_i64).toBe('function'); + }); + + test('load_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).load_f32).toBe('function'); + }); + + test('load_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).load_f64).toBe('function'); + }); + + test('load8_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).load8_i32).toBe('function'); + }); + + test('load8_i32_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).load8_i32_u).toBe('function'); + }); + + test('load16_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).load16_i32).toBe('function'); + }); + + test('load16_i32_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).load16_i32_u).toBe('function'); + }); + + test('load8_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).load8_i64).toBe('function'); + }); + + test('load8_i64_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).load8_i64_u).toBe('function'); + }); + + test('load16_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).load16_i64).toBe('function'); + }); + + test('load16_i64_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).load16_i64_u).toBe('function'); + }); + + test('load32_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).load32_i64).toBe('function'); + }); + + test('load32_i64_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).load32_i64_u).toBe('function'); + }); + + test('store_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).store_i32).toBe('function'); + }); + + test('store_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).store_i64).toBe('function'); + }); + + test('store_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).store_f32).toBe('function'); + }); + + test('store_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).store_f64).toBe('function'); + }); + + test('store8_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).store8_i32).toBe('function'); + }); + + test('store16_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).store16_i32).toBe('function'); + }); + + test('store8_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).store8_i64).toBe('function'); + }); + + test('store16_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).store16_i64).toBe('function'); + }); + + test('store32_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).store32_i64).toBe('function'); + }); + + test('mem_size', () => { + expect(typeof (OpCodeEmitter.prototype as any).mem_size).toBe('function'); + }); + + test('mem_grow', () => { + expect(typeof (OpCodeEmitter.prototype as any).mem_grow).toBe('function'); + }); + + }); + + describe('constant', () => { + test('const_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).const_i32).toBe('function'); + }); + + test('const_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).const_i64).toBe('function'); + }); + + test('const_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).const_f32).toBe('function'); + }); + + test('const_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).const_f64).toBe('function'); + }); + + }); + + describe('i32-comparison', () => { + test('eqz_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).eqz_i32).toBe('function'); + }); + + test('eq_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).eq_i32).toBe('function'); + }); + + test('ne_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).ne_i32).toBe('function'); + }); + + test('lt_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_i32).toBe('function'); + }); + + test('lt_i32_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_i32_u).toBe('function'); + }); + + test('gt_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_i32).toBe('function'); + }); + + test('gt_i32_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_i32_u).toBe('function'); + }); + + test('le_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_i32).toBe('function'); + }); + + test('le_i32_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_i32_u).toBe('function'); + }); + + test('ge_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_i32).toBe('function'); + }); + + test('ge_i32_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_i32_u).toBe('function'); + }); + + }); + + describe('i64-comparison', () => { + test('eqz_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).eqz_i64).toBe('function'); + }); + + test('eq_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).eq_i64).toBe('function'); + }); + + test('ne_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).ne_i64).toBe('function'); + }); + + test('lt_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_i64).toBe('function'); + }); + + test('lt_i64_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_i64_u).toBe('function'); + }); + + test('gt_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_i64).toBe('function'); + }); + + test('gt_i64_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_i64_u).toBe('function'); + }); + + test('le_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_i64).toBe('function'); + }); + + test('le_i64_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_i64_u).toBe('function'); + }); + + test('ge_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_i64).toBe('function'); + }); + + test('ge_i64_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_i64_u).toBe('function'); + }); + + }); + + describe('f32-comparison', () => { + test('eq_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).eq_f32).toBe('function'); + }); + + test('ne_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).ne_f32).toBe('function'); + }); + + test('lt_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_f32).toBe('function'); + }); + + test('gt_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_f32).toBe('function'); + }); + + test('le_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_f32).toBe('function'); + }); + + test('ge_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_f32).toBe('function'); + }); + + }); + + describe('f64-comparison', () => { + test('eq_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).eq_f64).toBe('function'); + }); + + test('ne_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).ne_f64).toBe('function'); + }); + + test('lt_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_f64).toBe('function'); + }); + + test('gt_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_f64).toBe('function'); + }); + + test('le_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_f64).toBe('function'); + }); + + test('ge_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_f64).toBe('function'); + }); + + }); + + describe('i32-bitwise', () => { + test('clz_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).clz_i32).toBe('function'); + }); + + test('ctz_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).ctz_i32).toBe('function'); + }); + + test('popcnt_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).popcnt_i32).toBe('function'); + }); + + test('and_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).and_i32).toBe('function'); + }); + + test('or_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).or_i32).toBe('function'); + }); + + test('xor_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).xor_i32).toBe('function'); + }); + + test('shl_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).shl_i32).toBe('function'); + }); + + test('shr_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_i32).toBe('function'); + }); + + test('shr_i32_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_i32_u).toBe('function'); + }); + + test('rotl_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).rotl_i32).toBe('function'); + }); + + test('rotr_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).rotr_i32).toBe('function'); + }); + + }); + + describe('i32-arithmetic', () => { + test('add_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_i32).toBe('function'); + }); + + test('sub_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_i32).toBe('function'); + }); + + test('mul_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).mul_i32).toBe('function'); + }); + + test('div_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).div_i32).toBe('function'); + }); + + test('div_i32_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).div_i32_u).toBe('function'); + }); + + test('rem_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).rem_i32).toBe('function'); + }); + + test('rem_i32_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).rem_i32_u).toBe('function'); + }); + + }); + + describe('i64-bitwise', () => { + test('clz_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).clz_i64).toBe('function'); + }); + + test('ctz_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).ctz_i64).toBe('function'); + }); + + test('popcnt_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).popcnt_i64).toBe('function'); + }); + + test('and_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).and_i64).toBe('function'); + }); + + test('or_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).or_i64).toBe('function'); + }); + + test('xor_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).xor_i64).toBe('function'); + }); + + test('shl_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).shl_i64).toBe('function'); + }); + + test('shr_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_i64).toBe('function'); + }); + + test('shr_i64_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_i64_u).toBe('function'); + }); + + test('rotl_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).rotl_i64).toBe('function'); + }); + + test('rotr_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).rotr_i64).toBe('function'); + }); + + }); + + describe('i64-arithmetic', () => { + test('add_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_i64).toBe('function'); + }); + + test('sub_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_i64).toBe('function'); + }); + + test('mul_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).mul_i64).toBe('function'); + }); + + test('div_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).div_i64).toBe('function'); + }); + + test('div_i64_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).div_i64_u).toBe('function'); + }); + + test('rem_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).rem_i64).toBe('function'); + }); + + test('rem_i64_u', () => { + expect(typeof (OpCodeEmitter.prototype as any).rem_i64_u).toBe('function'); + }); + + }); + + describe('f32-arithmetic', () => { + test('abs_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).abs_f32).toBe('function'); + }); + + test('neg_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).neg_f32).toBe('function'); + }); + + test('ceil_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).ceil_f32).toBe('function'); + }); + + test('floor_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).floor_f32).toBe('function'); + }); + + test('trunc_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f32).toBe('function'); + }); + + test('nearest_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).nearest_f32).toBe('function'); + }); + + test('sqrt_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).sqrt_f32).toBe('function'); + }); + + test('add_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_f32).toBe('function'); + }); + + test('sub_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_f32).toBe('function'); + }); + + test('mul_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).mul_f32).toBe('function'); + }); + + test('div_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).div_f32).toBe('function'); + }); + + test('min_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).min_f32).toBe('function'); + }); + + test('max_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).max_f32).toBe('function'); + }); + + test('copysign_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).copysign_f32).toBe('function'); + }); + + }); + + describe('f64-arithmetic', () => { + test('abs_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).abs_f64).toBe('function'); + }); + + test('neg_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).neg_f64).toBe('function'); + }); + + test('ceil_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).ceil_f64).toBe('function'); + }); + + test('floor_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).floor_f64).toBe('function'); + }); + + test('trunc_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f64).toBe('function'); + }); + + test('nearest_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).nearest_f64).toBe('function'); + }); + + test('sqrt_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).sqrt_f64).toBe('function'); + }); + + test('add_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_f64).toBe('function'); + }); + + test('sub_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_f64).toBe('function'); + }); + + test('mul_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).mul_f64).toBe('function'); + }); + + test('div_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).div_f64).toBe('function'); + }); + + test('min_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).min_f64).toBe('function'); + }); + + test('max_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).max_f64).toBe('function'); + }); + + test('copysign_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).copysign_f64).toBe('function'); + }); + + }); + + describe('conversion', () => { + test('wrap_i64_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).wrap_i64_i32).toBe('function'); + }); + + test('trunc_f32_s_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f32_s_i32).toBe('function'); + }); + + test('trunc_f32_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f32_u_i32).toBe('function'); + }); + + test('trunc_f64_s_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f64_s_i32).toBe('function'); + }); + + test('trunc_f64_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f64_u_i32).toBe('function'); + }); + + test('extend_i32_s_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_i32_s_i64).toBe('function'); + }); + + test('extend_i32_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_i32_u_i64).toBe('function'); + }); + + test('trunc_f32_s_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f32_s_i64).toBe('function'); + }); + + test('trunc_f32_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f32_u_i64).toBe('function'); + }); + + test('trunc_f64_s_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f64_s_i64).toBe('function'); + }); + + test('trunc_f64_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f64_u_i64).toBe('function'); + }); + + test('convert_i32_s_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_i32_s_f32).toBe('function'); + }); + + test('convert_i32_u_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_i32_u_f32).toBe('function'); + }); + + test('convert_i64_s_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_i64_s_f32).toBe('function'); + }); + + test('convert_i64_u_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_i64_u_f32).toBe('function'); + }); + + test('demote_f64_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).demote_f64_f32).toBe('function'); + }); + + test('convert_i32_s_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_i32_s_f64).toBe('function'); + }); + + test('convert_i32_u_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_i32_u_f64).toBe('function'); + }); + + test('convert_i64_s_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_i64_s_f64).toBe('function'); + }); + + test('convert_i64_u_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_i64_u_f64).toBe('function'); + }); + + test('promote_f32_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).promote_f32_f64).toBe('function'); + }); + + test('reinterpret_f32_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).reinterpret_f32_i32).toBe('function'); + }); + + test('reinterpret_f64_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).reinterpret_f64_i64).toBe('function'); + }); + + test('reinterpret_i32_f32', () => { + expect(typeof (OpCodeEmitter.prototype as any).reinterpret_i32_f32).toBe('function'); + }); + + test('reinterpret_i64_f64', () => { + expect(typeof (OpCodeEmitter.prototype as any).reinterpret_i64_f64).toBe('function'); + }); + + }); + + describe('sign-extend', () => { + test('extend8_s_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend8_s_i32).toBe('function'); + }); + + test('extend16_s_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend16_s_i32).toBe('function'); + }); + + test('extend8_s_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend8_s_i64).toBe('function'); + }); + + test('extend16_s_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend16_s_i64).toBe('function'); + }); + + test('extend32_s_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend32_s_i64).toBe('function'); + }); + + }); + + describe('sat-trunc', () => { + test('trunc_sat_f32_s_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f32_s_i32).toBe('function'); + }); + + test('trunc_sat_f32_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f32_u_i32).toBe('function'); + }); + + test('trunc_sat_f64_s_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f64_s_i32).toBe('function'); + }); + + test('trunc_sat_f64_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f64_u_i32).toBe('function'); + }); + + test('trunc_sat_f32_s_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f32_s_i64).toBe('function'); + }); + + test('trunc_sat_f32_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f32_u_i64).toBe('function'); + }); + + test('trunc_sat_f64_s_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f64_s_i64).toBe('function'); + }); + + test('trunc_sat_f64_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f64_u_i64).toBe('function'); + }); + + }); + + describe('bulk-memory', () => { + test('memory_init', () => { + expect(typeof (OpCodeEmitter.prototype as any).memory_init).toBe('function'); + }); + + test('data_drop', () => { + expect(typeof (OpCodeEmitter.prototype as any).data_drop).toBe('function'); + }); + + test('memory_copy', () => { + expect(typeof (OpCodeEmitter.prototype as any).memory_copy).toBe('function'); + }); + + test('memory_fill', () => { + expect(typeof (OpCodeEmitter.prototype as any).memory_fill).toBe('function'); + }); + + test('table_init', () => { + expect(typeof (OpCodeEmitter.prototype as any).table_init).toBe('function'); + }); + + test('elem_drop', () => { + expect(typeof (OpCodeEmitter.prototype as any).elem_drop).toBe('function'); + }); + + test('table_copy', () => { + expect(typeof (OpCodeEmitter.prototype as any).table_copy).toBe('function'); + }); + + }); + + describe('reference-types', () => { + test('table_grow', () => { + expect(typeof (OpCodeEmitter.prototype as any).table_grow).toBe('function'); + }); + + test('table_size', () => { + expect(typeof (OpCodeEmitter.prototype as any).table_size).toBe('function'); + }); + + test('table_fill', () => { + expect(typeof (OpCodeEmitter.prototype as any).table_fill).toBe('function'); + }); + + test('ref_null', () => { + expect(typeof (OpCodeEmitter.prototype as any).ref_null).toBe('function'); + }); + + test('ref_is_null', () => { + expect(typeof (OpCodeEmitter.prototype as any).ref_is_null).toBe('function'); + }); + + test('ref_func', () => { + expect(typeof (OpCodeEmitter.prototype as any).ref_func).toBe('function'); + }); + + test('table_get', () => { + expect(typeof (OpCodeEmitter.prototype as any).table_get).toBe('function'); + }); + + test('table_set', () => { + expect(typeof (OpCodeEmitter.prototype as any).table_set).toBe('function'); + }); + + }); + + describe('simd', () => { + test('load_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load_v128).toBe('function'); + }); + + test('load8x8_s_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load8x8_s_v128).toBe('function'); + }); + + test('load8x8_u_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load8x8_u_v128).toBe('function'); + }); + + test('load16x4_s_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load16x4_s_v128).toBe('function'); + }); + + test('load16x4_u_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load16x4_u_v128).toBe('function'); + }); + + test('load32x2_s_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load32x2_s_v128).toBe('function'); + }); + + test('load32x2_u_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load32x2_u_v128).toBe('function'); + }); + + test('load8_splat_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load8_splat_v128).toBe('function'); + }); + + test('load16_splat_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load16_splat_v128).toBe('function'); + }); + + test('load32_splat_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load32_splat_v128).toBe('function'); + }); + + test('load64_splat_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load64_splat_v128).toBe('function'); + }); + + test('store_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).store_v128).toBe('function'); + }); + + test('const_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).const_v128).toBe('function'); + }); + + test('shuffle_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).shuffle_i8x16).toBe('function'); + }); + + test('swizzle_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).swizzle_i8x16).toBe('function'); + }); + + test('splat_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).splat_i8x16).toBe('function'); + }); + + test('splat_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).splat_i16x8).toBe('function'); + }); + + test('splat_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).splat_i32x4).toBe('function'); + }); + + test('splat_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).splat_i64x2).toBe('function'); + }); + + test('splat_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).splat_f32x4).toBe('function'); + }); + + test('splat_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).splat_f64x2).toBe('function'); + }); + + test('extract_lane_s_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).extract_lane_s_i8x16).toBe('function'); + }); + + test('extract_lane_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).extract_lane_u_i8x16).toBe('function'); + }); + + test('replace_lane_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).replace_lane_i8x16).toBe('function'); + }); + + test('extract_lane_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extract_lane_s_i16x8).toBe('function'); + }); + + test('extract_lane_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extract_lane_u_i16x8).toBe('function'); + }); + + test('replace_lane_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).replace_lane_i16x8).toBe('function'); + }); + + test('extract_lane_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extract_lane_i32x4).toBe('function'); + }); + + test('replace_lane_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).replace_lane_i32x4).toBe('function'); + }); + + test('extract_lane_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).extract_lane_i64x2).toBe('function'); + }); + + test('replace_lane_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).replace_lane_i64x2).toBe('function'); + }); + + test('extract_lane_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extract_lane_f32x4).toBe('function'); + }); + + test('replace_lane_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).replace_lane_f32x4).toBe('function'); + }); + + test('extract_lane_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).extract_lane_f64x2).toBe('function'); + }); + + test('replace_lane_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).replace_lane_f64x2).toBe('function'); + }); + + test('eq_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).eq_i8x16).toBe('function'); + }); + + test('ne_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).ne_i8x16).toBe('function'); + }); + + test('lt_s_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_s_i8x16).toBe('function'); + }); + + test('lt_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_u_i8x16).toBe('function'); + }); + + test('gt_s_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_s_i8x16).toBe('function'); + }); + + test('gt_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_u_i8x16).toBe('function'); + }); + + test('le_s_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_s_i8x16).toBe('function'); + }); + + test('le_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_u_i8x16).toBe('function'); + }); + + test('ge_s_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_s_i8x16).toBe('function'); + }); + + test('ge_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_u_i8x16).toBe('function'); + }); + + test('eq_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).eq_i16x8).toBe('function'); + }); + + test('ne_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).ne_i16x8).toBe('function'); + }); + + test('lt_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_s_i16x8).toBe('function'); + }); + + test('lt_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_u_i16x8).toBe('function'); + }); + + test('gt_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_s_i16x8).toBe('function'); + }); + + test('gt_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_u_i16x8).toBe('function'); + }); + + test('le_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_s_i16x8).toBe('function'); + }); + + test('le_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_u_i16x8).toBe('function'); + }); + + test('ge_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_s_i16x8).toBe('function'); + }); + + test('ge_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_u_i16x8).toBe('function'); + }); + + test('eq_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).eq_i32x4).toBe('function'); + }); + + test('ne_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).ne_i32x4).toBe('function'); + }); + + test('lt_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_s_i32x4).toBe('function'); + }); + + test('lt_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_u_i32x4).toBe('function'); + }); + + test('gt_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_s_i32x4).toBe('function'); + }); + + test('gt_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_u_i32x4).toBe('function'); + }); + + test('le_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_s_i32x4).toBe('function'); + }); + + test('le_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_u_i32x4).toBe('function'); + }); + + test('ge_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_s_i32x4).toBe('function'); + }); + + test('ge_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_u_i32x4).toBe('function'); + }); + + test('eq_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).eq_f32x4).toBe('function'); + }); + + test('ne_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).ne_f32x4).toBe('function'); + }); + + test('lt_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_f32x4).toBe('function'); + }); + + test('gt_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_f32x4).toBe('function'); + }); + + test('le_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_f32x4).toBe('function'); + }); + + test('ge_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_f32x4).toBe('function'); + }); + + test('eq_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).eq_f64x2).toBe('function'); + }); + + test('ne_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).ne_f64x2).toBe('function'); + }); + + test('lt_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_f64x2).toBe('function'); + }); + + test('gt_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_f64x2).toBe('function'); + }); + + test('le_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_f64x2).toBe('function'); + }); + + test('ge_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_f64x2).toBe('function'); + }); + + test('not_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).not_v128).toBe('function'); + }); + + test('and_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).and_v128).toBe('function'); + }); + + test('andnot_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).andnot_v128).toBe('function'); + }); + + test('or_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).or_v128).toBe('function'); + }); + + test('xor_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).xor_v128).toBe('function'); + }); + + test('bitselect_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).bitselect_v128).toBe('function'); + }); + + test('any_true_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).any_true_v128).toBe('function'); + }); + + test('load8_lane_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load8_lane_v128).toBe('function'); + }); + + test('load16_lane_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load16_lane_v128).toBe('function'); + }); + + test('load32_lane_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load32_lane_v128).toBe('function'); + }); + + test('load64_lane_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load64_lane_v128).toBe('function'); + }); + + test('store8_lane_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).store8_lane_v128).toBe('function'); + }); + + test('store16_lane_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).store16_lane_v128).toBe('function'); + }); + + test('store32_lane_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).store32_lane_v128).toBe('function'); + }); + + test('store64_lane_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).store64_lane_v128).toBe('function'); + }); + + test('load32_zero_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load32_zero_v128).toBe('function'); + }); + + test('load64_zero_v128', () => { + expect(typeof (OpCodeEmitter.prototype as any).load64_zero_v128).toBe('function'); + }); + + test('trunc_sat_f32x4_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f32x4_s_i32x4).toBe('function'); + }); + + test('trunc_sat_f32x4_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f32x4_u_i32x4).toBe('function'); + }); + + test('abs_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).abs_i8x16).toBe('function'); + }); + + test('neg_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).neg_i8x16).toBe('function'); + }); + + test('popcnt_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).popcnt_i8x16).toBe('function'); + }); + + test('all_true_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).all_true_i8x16).toBe('function'); + }); + + test('bitmask_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).bitmask_i8x16).toBe('function'); + }); + + test('narrow_i16x8_s_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).narrow_i16x8_s_i8x16).toBe('function'); + }); + + test('narrow_i16x8_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).narrow_i16x8_u_i8x16).toBe('function'); + }); + + test('ceil_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).ceil_f32x4).toBe('function'); + }); + + test('floor_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).floor_f32x4).toBe('function'); + }); + + test('trunc_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f32x4).toBe('function'); + }); + + test('nearest_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).nearest_f32x4).toBe('function'); + }); + + test('shl_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).shl_i8x16).toBe('function'); + }); + + test('shr_s_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_s_i8x16).toBe('function'); + }); + + test('shr_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_u_i8x16).toBe('function'); + }); + + test('add_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_i8x16).toBe('function'); + }); + + test('add_sat_s_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_sat_s_i8x16).toBe('function'); + }); + + test('add_sat_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_sat_u_i8x16).toBe('function'); + }); + + test('sub_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_i8x16).toBe('function'); + }); + + test('sub_sat_s_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_sat_s_i8x16).toBe('function'); + }); + + test('sub_sat_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_sat_u_i8x16).toBe('function'); + }); + + test('ceil_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).ceil_f64x2).toBe('function'); + }); + + test('floor_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).floor_f64x2).toBe('function'); + }); + + test('min_s_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).min_s_i8x16).toBe('function'); + }); + + test('min_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).min_u_i8x16).toBe('function'); + }); + + test('max_s_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).max_s_i8x16).toBe('function'); + }); + + test('max_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).max_u_i8x16).toBe('function'); + }); + + test('trunc_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_f64x2).toBe('function'); + }); + + test('avgr_u_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).avgr_u_i8x16).toBe('function'); + }); + + test('extadd_pairwise_i8x16_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extadd_pairwise_i8x16_s_i16x8).toBe('function'); + }); + + test('extadd_pairwise_i8x16_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extadd_pairwise_i8x16_u_i16x8).toBe('function'); + }); + + test('extadd_pairwise_i16x8_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extadd_pairwise_i16x8_s_i32x4).toBe('function'); + }); + + test('extadd_pairwise_i16x8_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extadd_pairwise_i16x8_u_i32x4).toBe('function'); + }); + + test('abs_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).abs_i16x8).toBe('function'); + }); + + test('neg_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).neg_i16x8).toBe('function'); + }); + + test('q15mulr_sat_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).q15mulr_sat_s_i16x8).toBe('function'); + }); + + test('all_true_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).all_true_i16x8).toBe('function'); + }); + + test('bitmask_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).bitmask_i16x8).toBe('function'); + }); + + test('narrow_i32x4_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).narrow_i32x4_s_i16x8).toBe('function'); + }); + + test('narrow_i32x4_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).narrow_i32x4_u_i16x8).toBe('function'); + }); + + test('extend_low_i8x16_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_low_i8x16_s_i16x8).toBe('function'); + }); + + test('extend_high_i8x16_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_high_i8x16_s_i16x8).toBe('function'); + }); + + test('extend_low_i8x16_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_low_i8x16_u_i16x8).toBe('function'); + }); + + test('extend_high_i8x16_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_high_i8x16_u_i16x8).toBe('function'); + }); + + test('shl_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).shl_i16x8).toBe('function'); + }); + + test('shr_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_s_i16x8).toBe('function'); + }); + + test('shr_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_u_i16x8).toBe('function'); + }); + + test('add_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_i16x8).toBe('function'); + }); + + test('add_sat_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_sat_s_i16x8).toBe('function'); + }); + + test('add_sat_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_sat_u_i16x8).toBe('function'); + }); + + test('sub_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_i16x8).toBe('function'); + }); + + test('sub_sat_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_sat_s_i16x8).toBe('function'); + }); + + test('sub_sat_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_sat_u_i16x8).toBe('function'); + }); + + test('nearest_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).nearest_f64x2).toBe('function'); + }); + + test('mul_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).mul_i16x8).toBe('function'); + }); + + test('min_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).min_s_i16x8).toBe('function'); + }); + + test('min_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).min_u_i16x8).toBe('function'); + }); + + test('max_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).max_s_i16x8).toBe('function'); + }); + + test('max_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).max_u_i16x8).toBe('function'); + }); + + test('avgr_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).avgr_u_i16x8).toBe('function'); + }); + + test('extmul_low_i8x16_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_low_i8x16_s_i16x8).toBe('function'); + }); + + test('extmul_high_i8x16_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_high_i8x16_s_i16x8).toBe('function'); + }); + + test('extmul_low_i8x16_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_low_i8x16_u_i16x8).toBe('function'); + }); + + test('extmul_high_i8x16_u_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_high_i8x16_u_i16x8).toBe('function'); + }); + + test('abs_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).abs_i32x4).toBe('function'); + }); + + test('neg_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).neg_i32x4).toBe('function'); + }); + + test('all_true_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).all_true_i32x4).toBe('function'); + }); + + test('bitmask_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).bitmask_i32x4).toBe('function'); + }); + + test('extend_low_i16x8_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_low_i16x8_s_i32x4).toBe('function'); + }); + + test('extend_high_i16x8_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_high_i16x8_s_i32x4).toBe('function'); + }); + + test('extend_low_i16x8_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_low_i16x8_u_i32x4).toBe('function'); + }); + + test('extend_high_i16x8_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_high_i16x8_u_i32x4).toBe('function'); + }); + + test('shl_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).shl_i32x4).toBe('function'); + }); + + test('shr_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_s_i32x4).toBe('function'); + }); + + test('shr_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_u_i32x4).toBe('function'); + }); + + test('add_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_i32x4).toBe('function'); + }); + + test('convert_i32x4_s_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_i32x4_s_f32x4).toBe('function'); + }); + + test('convert_i32x4_u_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_i32x4_u_f32x4).toBe('function'); + }); + + test('sub_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_i32x4).toBe('function'); + }); + + test('mul_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).mul_i32x4).toBe('function'); + }); + + test('min_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).min_s_i32x4).toBe('function'); + }); + + test('min_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).min_u_i32x4).toBe('function'); + }); + + test('max_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).max_s_i32x4).toBe('function'); + }); + + test('max_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).max_u_i32x4).toBe('function'); + }); + + test('dot_i16x8_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).dot_i16x8_s_i32x4).toBe('function'); + }); + + test('extmul_low_i16x8_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_low_i16x8_s_i32x4).toBe('function'); + }); + + test('extmul_high_i16x8_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_high_i16x8_s_i32x4).toBe('function'); + }); + + test('extmul_low_i16x8_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_low_i16x8_u_i32x4).toBe('function'); + }); + + test('extmul_high_i16x8_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_high_i16x8_u_i32x4).toBe('function'); + }); + + test('abs_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).abs_i64x2).toBe('function'); + }); + + test('neg_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).neg_i64x2).toBe('function'); + }); + + test('all_true_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).all_true_i64x2).toBe('function'); + }); + + test('bitmask_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).bitmask_i64x2).toBe('function'); + }); + + test('extend_low_i32x4_s_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_low_i32x4_s_i64x2).toBe('function'); + }); + + test('extend_high_i32x4_s_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_high_i32x4_s_i64x2).toBe('function'); + }); + + test('extend_low_i32x4_u_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_low_i32x4_u_i64x2).toBe('function'); + }); + + test('extend_high_i32x4_u_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).extend_high_i32x4_u_i64x2).toBe('function'); + }); + + test('shl_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).shl_i64x2).toBe('function'); + }); + + test('shr_s_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_s_i64x2).toBe('function'); + }); + + test('shr_u_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).shr_u_i64x2).toBe('function'); + }); + + test('add_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_i64x2).toBe('function'); + }); + + test('sub_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_i64x2).toBe('function'); + }); + + test('mul_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).mul_i64x2).toBe('function'); + }); + + test('eq_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).eq_i64x2).toBe('function'); + }); + + test('ne_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).ne_i64x2).toBe('function'); + }); + + test('lt_s_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).lt_s_i64x2).toBe('function'); + }); + + test('gt_s_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).gt_s_i64x2).toBe('function'); + }); + + test('le_s_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).le_s_i64x2).toBe('function'); + }); + + test('ge_s_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).ge_s_i64x2).toBe('function'); + }); + + test('extmul_low_i32x4_s_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_low_i32x4_s_i64x2).toBe('function'); + }); + + test('extmul_high_i32x4_s_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_high_i32x4_s_i64x2).toBe('function'); + }); + + test('extmul_low_i32x4_u_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_low_i32x4_u_i64x2).toBe('function'); + }); + + test('extmul_high_i32x4_u_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).extmul_high_i32x4_u_i64x2).toBe('function'); + }); + + test('abs_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).abs_f32x4).toBe('function'); + }); + + test('neg_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).neg_f32x4).toBe('function'); + }); + + test('sqrt_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).sqrt_f32x4).toBe('function'); + }); + + test('add_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_f32x4).toBe('function'); + }); + + test('sub_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_f32x4).toBe('function'); + }); + + test('mul_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).mul_f32x4).toBe('function'); + }); + + test('div_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).div_f32x4).toBe('function'); + }); + + test('min_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).min_f32x4).toBe('function'); + }); + + test('max_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).max_f32x4).toBe('function'); + }); + + test('pmin_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).pmin_f32x4).toBe('function'); + }); + + test('pmax_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).pmax_f32x4).toBe('function'); + }); + + test('abs_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).abs_f64x2).toBe('function'); + }); + + test('neg_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).neg_f64x2).toBe('function'); + }); + + test('sqrt_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).sqrt_f64x2).toBe('function'); + }); + + test('add_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).add_f64x2).toBe('function'); + }); + + test('sub_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).sub_f64x2).toBe('function'); + }); + + test('mul_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).mul_f64x2).toBe('function'); + }); + + test('div_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).div_f64x2).toBe('function'); + }); + + test('min_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).min_f64x2).toBe('function'); + }); + + test('max_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).max_f64x2).toBe('function'); + }); + + test('pmin_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).pmin_f64x2).toBe('function'); + }); + + test('pmax_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).pmax_f64x2).toBe('function'); + }); + + test('trunc_sat_f64x2_s_zero_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f64x2_s_zero_i32x4).toBe('function'); + }); + + test('trunc_sat_f64x2_u_zero_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).trunc_sat_f64x2_u_zero_i32x4).toBe('function'); + }); + + test('convert_low_i32x4_s_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_low_i32x4_s_f64x2).toBe('function'); + }); + + test('convert_low_i32x4_u_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).convert_low_i32x4_u_f64x2).toBe('function'); + }); + + test('demote_f64x2_zero_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).demote_f64x2_zero_f32x4).toBe('function'); + }); + + test('promote_low_f32x4_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).promote_low_f32x4_f64x2).toBe('function'); + }); + + }); + + describe('atomics', () => { + test('atomic_notify', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_notify).toBe('function'); + }); + + test('atomic_wait32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_wait32).toBe('function'); + }); + + test('atomic_wait64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_wait64).toBe('function'); + }); + + test('atomic_fence', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_fence).toBe('function'); + }); + + test('atomic_load_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_load_i32).toBe('function'); + }); + + test('atomic_load_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_load_i64).toBe('function'); + }); + + test('atomic_load8_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_load8_u_i32).toBe('function'); + }); + + test('atomic_load16_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_load16_u_i32).toBe('function'); + }); + + test('atomic_load8_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_load8_u_i64).toBe('function'); + }); + + test('atomic_load16_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_load16_u_i64).toBe('function'); + }); + + test('atomic_load32_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_load32_u_i64).toBe('function'); + }); + + test('atomic_store_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_store_i32).toBe('function'); + }); + + test('atomic_store_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_store_i64).toBe('function'); + }); + + test('atomic_store8_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_store8_i32).toBe('function'); + }); + + test('atomic_store16_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_store16_i32).toBe('function'); + }); + + test('atomic_store8_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_store8_i64).toBe('function'); + }); + + test('atomic_store16_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_store16_i64).toBe('function'); + }); + + test('atomic_store32_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_store32_i64).toBe('function'); + }); + + test('atomic_rmw_add_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_add_i32).toBe('function'); + }); + + test('atomic_rmw_add_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_add_i64).toBe('function'); + }); + + test('atomic_rmw8_add_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_add_u_i32).toBe('function'); + }); + + test('atomic_rmw16_add_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_add_u_i32).toBe('function'); + }); + + test('atomic_rmw8_add_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_add_u_i64).toBe('function'); + }); + + test('atomic_rmw16_add_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_add_u_i64).toBe('function'); + }); + + test('atomic_rmw32_add_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw32_add_u_i64).toBe('function'); + }); + + test('atomic_rmw_sub_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_sub_i32).toBe('function'); + }); + + test('atomic_rmw_sub_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_sub_i64).toBe('function'); + }); + + test('atomic_rmw8_sub_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_sub_u_i32).toBe('function'); + }); + + test('atomic_rmw16_sub_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_sub_u_i32).toBe('function'); + }); + + test('atomic_rmw8_sub_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_sub_u_i64).toBe('function'); + }); + + test('atomic_rmw16_sub_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_sub_u_i64).toBe('function'); + }); + + test('atomic_rmw32_sub_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw32_sub_u_i64).toBe('function'); + }); + + test('atomic_rmw_and_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_and_i32).toBe('function'); + }); + + test('atomic_rmw_and_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_and_i64).toBe('function'); + }); + + test('atomic_rmw8_and_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_and_u_i32).toBe('function'); + }); + + test('atomic_rmw16_and_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_and_u_i32).toBe('function'); + }); + + test('atomic_rmw8_and_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_and_u_i64).toBe('function'); + }); + + test('atomic_rmw16_and_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_and_u_i64).toBe('function'); + }); + + test('atomic_rmw32_and_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw32_and_u_i64).toBe('function'); + }); + + test('atomic_rmw_or_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_or_i32).toBe('function'); + }); + + test('atomic_rmw_or_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_or_i64).toBe('function'); + }); + + test('atomic_rmw8_or_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_or_u_i32).toBe('function'); + }); + + test('atomic_rmw16_or_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_or_u_i32).toBe('function'); + }); + + test('atomic_rmw8_or_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_or_u_i64).toBe('function'); + }); + + test('atomic_rmw16_or_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_or_u_i64).toBe('function'); + }); + + test('atomic_rmw32_or_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw32_or_u_i64).toBe('function'); + }); + + test('atomic_rmw_xor_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_xor_i32).toBe('function'); + }); + + test('atomic_rmw_xor_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_xor_i64).toBe('function'); + }); + + test('atomic_rmw8_xor_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_xor_u_i32).toBe('function'); + }); + + test('atomic_rmw16_xor_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_xor_u_i32).toBe('function'); + }); + + test('atomic_rmw8_xor_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_xor_u_i64).toBe('function'); + }); + + test('atomic_rmw16_xor_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_xor_u_i64).toBe('function'); + }); + + test('atomic_rmw32_xor_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw32_xor_u_i64).toBe('function'); + }); + + test('atomic_rmw_xchg_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_xchg_i32).toBe('function'); + }); + + test('atomic_rmw_xchg_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_xchg_i64).toBe('function'); + }); + + test('atomic_rmw8_xchg_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_xchg_u_i32).toBe('function'); + }); + + test('atomic_rmw16_xchg_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_xchg_u_i32).toBe('function'); + }); + + test('atomic_rmw8_xchg_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_xchg_u_i64).toBe('function'); + }); + + test('atomic_rmw16_xchg_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_xchg_u_i64).toBe('function'); + }); + + test('atomic_rmw32_xchg_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw32_xchg_u_i64).toBe('function'); + }); + + test('atomic_rmw_cmpxchg_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_cmpxchg_i32).toBe('function'); + }); + + test('atomic_rmw_cmpxchg_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw_cmpxchg_i64).toBe('function'); + }); + + test('atomic_rmw8_cmpxchg_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_cmpxchg_u_i32).toBe('function'); + }); + + test('atomic_rmw16_cmpxchg_u_i32', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_cmpxchg_u_i32).toBe('function'); + }); + + test('atomic_rmw8_cmpxchg_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw8_cmpxchg_u_i64).toBe('function'); + }); + + test('atomic_rmw16_cmpxchg_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw16_cmpxchg_u_i64).toBe('function'); + }); + + test('atomic_rmw32_cmpxchg_u_i64', () => { + expect(typeof (OpCodeEmitter.prototype as any).atomic_rmw32_cmpxchg_u_i64).toBe('function'); + }); + + }); + + describe('relaxed-simd', () => { + test('relaxed_swizzle_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_swizzle_i8x16).toBe('function'); + }); + + test('relaxed_trunc_f32x4_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_trunc_f32x4_s_i32x4).toBe('function'); + }); + + test('relaxed_trunc_f32x4_u_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_trunc_f32x4_u_i32x4).toBe('function'); + }); + + test('relaxed_trunc_f64x2_s_zero_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_trunc_f64x2_s_zero_i32x4).toBe('function'); + }); + + test('relaxed_trunc_f64x2_u_zero_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_trunc_f64x2_u_zero_i32x4).toBe('function'); + }); + + test('relaxed_madd_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_madd_f32x4).toBe('function'); + }); + + test('relaxed_nmadd_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_nmadd_f32x4).toBe('function'); + }); + + test('relaxed_madd_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_madd_f64x2).toBe('function'); + }); + + test('relaxed_nmadd_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_nmadd_f64x2).toBe('function'); + }); + + test('relaxed_laneselect_i8x16', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_laneselect_i8x16).toBe('function'); + }); + + test('relaxed_laneselect_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_laneselect_i16x8).toBe('function'); + }); + + test('relaxed_laneselect_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_laneselect_i32x4).toBe('function'); + }); + + test('relaxed_laneselect_i64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_laneselect_i64x2).toBe('function'); + }); + + test('relaxed_min_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_min_f32x4).toBe('function'); + }); + + test('relaxed_max_f32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_max_f32x4).toBe('function'); + }); + + test('relaxed_min_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_min_f64x2).toBe('function'); + }); + + test('relaxed_max_f64x2', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_max_f64x2).toBe('function'); + }); + + test('relaxed_q15mulr_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_q15mulr_s_i16x8).toBe('function'); + }); + + test('relaxed_dot_i8x16_i7x16_s_i16x8', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_dot_i8x16_i7x16_s_i16x8).toBe('function'); + }); + + test('relaxed_dot_i8x16_i7x16_add_s_i32x4', () => { + expect(typeof (OpCodeEmitter.prototype as any).relaxed_dot_i8x16_i7x16_add_s_i32x4).toBe('function'); + }); + + }); + +}); diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index a6b8337..abd7af4 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/arg.ts","./src/assemblyemitter.ts","./src/binarymodulewriter.ts","./src/binaryreader.ts","./src/binarywriter.ts","./src/customsectionbuilder.ts","./src/datasegmentbuilder.ts","./src/elementsegmentbuilder.ts","./src/exportbuilder.ts","./src/functypebuilder.ts","./src/functypesignature.ts","./src/functionbuilder.ts","./src/functionemitter.ts","./src/functionparameterbuilder.ts","./src/globalbuilder.ts","./src/globaltype.ts","./src/immediate.ts","./src/immediateencoder.ts","./src/importbuilder.ts","./src/initexpressionemitter.ts","./src/instruction.ts","./src/labelbuilder.ts","./src/localbuilder.ts","./src/memorybuilder.ts","./src/memorytype.ts","./src/modulebuilder.ts","./src/opcodeemitter.ts","./src/opcodes.ts","./src/packagebuilder.ts","./src/resizablelimits.ts","./src/tablebuilder.ts","./src/tabletype.ts","./src/textmodulewriter.ts","./src/watparser.ts","./src/index.ts","./src/types.ts","./src/verification/controlflowblock.ts","./src/verification/controlflowverifier.ts","./src/verification/operandstack.ts","./src/verification/operandstackverifier.ts","./src/verification/verificationerror.ts","./src/verification/types.ts"],"version":"5.9.3"} \ No newline at end of file +{"root":["./src/arg.ts","./src/assemblyemitter.ts","./src/binarymodulewriter.ts","./src/binaryreader.ts","./src/binarywriter.ts","./src/customsectionbuilder.ts","./src/datasegmentbuilder.ts","./src/elementsegmentbuilder.ts","./src/exportbuilder.ts","./src/functypebuilder.ts","./src/functypesignature.ts","./src/functionbuilder.ts","./src/functionemitter.ts","./src/functionparameterbuilder.ts","./src/globalbuilder.ts","./src/globaltype.ts","./src/immediate.ts","./src/immediateencoder.ts","./src/importbuilder.ts","./src/initexpressionemitter.ts","./src/instruction.ts","./src/labelbuilder.ts","./src/localbuilder.ts","./src/memorybuilder.ts","./src/memorytype.ts","./src/modulebuilder.ts","./src/opcodeemitter.ts","./src/opcodes.ts","./src/packagebuilder.ts","./src/resizablelimits.ts","./src/tablebuilder.ts","./src/tabletype.ts","./src/tagbuilder.ts","./src/textmodulewriter.ts","./src/watparser.ts","./src/index.ts","./src/types.ts","./src/verification/controlflowblock.ts","./src/verification/controlflowverifier.ts","./src/verification/operandstack.ts","./src/verification/operandstackverifier.ts","./src/verification/verificationerror.ts","./src/verification/types.ts"],"version":"5.9.3"} \ No newline at end of file From 61d375562b49f8d55145590465b21ce51d8c9abc Mon Sep 17 00:00:00 2001 From: zelmalki Date: Mon, 23 Feb 2026 23:27:02 -0800 Subject: [PATCH 3/3] * use newer node that supports newer opcodes * do compat test --- .github/workflows/ci.yml | 2 +- tests/Features.test.ts | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 287ae5a..ad9510f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: - node-version: [18, 20, 22] + node-version: [22, 24] steps: - uses: actions/checkout@v4 diff --git a/tests/Features.test.ts b/tests/Features.test.ts index 1bf31f7..45e0a44 100644 --- a/tests/Features.test.ts +++ b/tests/Features.test.ts @@ -2,6 +2,21 @@ import ModuleBuilder from '../src/ModuleBuilder'; import { ValueType, ElementType } from '../src/types'; import VerificationError from '../src/verification/VerificationError'; +// Detect engine support for extended-const (requires V8 11.4+ / Node 21+) +const HAS_EXTENDED_CONST = (() => { + try { + // Minimal module: (global i32 (i32.add (i32.const 1) (i32.const 2))) + const bytes = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, // magic + version + 0x06, 0x09, // global section, 9 bytes + 0x01, // 1 global + 0x7f, 0x00, // i32, immutable + 0x41, 0x01, 0x41, 0x02, 0x6a, 0x0b, // i32.const 1, i32.const 2, i32.add, end + ]); + return WebAssembly.validate(bytes); + } catch { return false; } +})(); + // ─── Target System ─────────────────────────────────────────────────── describe('Target system', () => { @@ -357,7 +372,7 @@ describe('Extended const expressions', () => { expect(() => emitter.add_i32()).toThrow(/extended-const/i); }); - test('extended-const global init compiles and runs', async () => { + (HAS_EXTENDED_CONST ? test : test.skip)('extended-const global init compiles and runs', async () => { const mod = new ModuleBuilder('test'); const g = mod.defineGlobal(ValueType.Int32, false); g.createInitEmitter((asm) => {