diff --git a/src/builtins.ts b/src/builtins.ts index f641627b18..71812bd12f 100644 --- a/src/builtins.ts +++ b/src/builtins.ts @@ -135,6 +135,7 @@ export namespace BuiltinSymbols { export const sizeof = "~lib/builtins/sizeof"; export const alignof = "~lib/builtins/alignof"; export const offsetof = "~lib/builtins/offsetof"; + export const nameof = "~lib/builtins/nameof"; export const select = "~lib/builtins/select"; export const unreachable = "~lib/builtins/unreachable"; export const changetype = "~lib/builtins/changetype"; @@ -771,6 +772,51 @@ export function compileCall( } } } + case BuiltinSymbols.nameof: { + // Check to make sure a parameter or a type was passed to the builtin + let resultType = evaluateConstantType(compiler, typeArguments, operands, reportNode); + if (resultType === null) { + compiler.currentType = compiler.program.stringInstance.type; + compiler.error( + DiagnosticCode.Operation_not_supported, + reportNode.typeArgumentsRange + ); + return module.unreachable(); + } + + let value: string; + if (resultType.is(TypeFlags.REFERENCE)) { + if (resultType.classReference !== null) { + value = resultType.classReference.name; + } else { + assert(resultType.signatureReference); + value = "Function"; + } + } else { + switch (resultType.kind) { + case TypeKind.BOOL: value = "bool"; break; + case TypeKind.I8: value = "i8"; break; + case TypeKind.U8: value = "u8"; break; + case TypeKind.I16: value = "i16"; break; + case TypeKind.U16: value = "u16"; break; + case TypeKind.I32: value = "i32"; break; + case TypeKind.U32: value = "u32"; break; + case TypeKind.F32: value = "f32"; break; + case TypeKind.I64: value = "i64"; break; + case TypeKind.U64: value = "u64"; break; + case TypeKind.F64: value = "f64"; break; + case TypeKind.ISIZE: value = "isize"; break; + case TypeKind.USIZE: value = "usize"; break; + case TypeKind.V128: value = "v128"; break; + // If the kind is not set properly, throw an error. + // The default case falls through to satisfy that value is always set, and never null. + default: assert(false); + case TypeKind.VOID: value = "void"; break; + } + } + + return compiler.ensureStaticString(value); + } // === Math =================================================================================== diff --git a/std/assembly/builtins.ts b/std/assembly/builtins.ts index 96bbcd2fc5..3dc7cddaa6 100644 --- a/std/assembly/builtins.ts +++ b/std/assembly/builtins.ts @@ -134,6 +134,10 @@ export declare function offsetof(fieldName?: string): usize; // | u32 / u64 @builtin export declare function idof(): u32; +// @ts-ignore +@builtin +export declare function nameof(): string; + // @ts-ignore: decorator @builtin export declare function select(ifTrue: T, ifFalse: T, condition: bool): T; diff --git a/std/assembly/index.d.ts b/std/assembly/index.d.ts index cd4beeb5e1..f6a4142a2c 100644 --- a/std/assembly/index.d.ts +++ b/std/assembly/index.d.ts @@ -116,6 +116,8 @@ declare function offsetof(): usize; declare function offsetof(fieldName: keyof T | string): usize; /** Determines the offset of the specified field within the given class type. Returns the class type's end offset if field name has been omitted. Compiles to a constant. */ declare function offsetof(fieldName?: string): usize; +/** Determines the name of a given type. */ +declare function nameof(value?: T): string; /** Determines the unique runtime id of a class type. Compiles to a constant. */ declare function idof(): u32; /** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/ diff --git a/tests/compiler/binary.optimized.wat b/tests/compiler/binary.optimized.wat index cfa4016d55..2ac3453cf9 100644 --- a/tests/compiler/binary.optimized.wat +++ b/tests/compiler/binary.optimized.wat @@ -29,8 +29,6 @@ local.get $2 i32.wrap_i64 i32.const 0 - i32.ne - i32.const 0 local.get $1 i32.const 2147483647 i32.and diff --git a/tests/compiler/builtins.optimized.wat b/tests/compiler/builtins.optimized.wat index d9962e1e44..8b017b690c 100644 --- a/tests/compiler/builtins.optimized.wat +++ b/tests/compiler/builtins.optimized.wat @@ -3,14 +3,35 @@ (type $FUNCSIG$if (func (param f32) (result i32))) (type $FUNCSIG$id (func (param f64) (result i32))) (type $FUNCSIG$vii (func (param i32 i32))) + (type $FUNCSIG$iii (func (param i32 i32) (result i32))) + (type $FUNCSIG$ii (func (param i32) (result i32))) (type $FUNCSIG$v (func)) + (type $FUNCSIG$iiii (func (param i32 i32 i32) (result i32))) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 12) "\01\00\00\00\01") (data (i32.const 24) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00a\00b\00c") (data (i32.const 48) "\16\00\00\00\01\00\00\00\01\00\00\00\16\00\00\00b\00u\00i\00l\00t\00i\00n\00s\00.\00t\00s") - (table $0 2 funcref) - (elem (i32.const 0) $builtins/test $start:builtins~anonymous|0) + (data (i32.const 88) "\10\00\00\00\01\00\00\00\01\00\00\00\10\00\00\00F\00u\00n\00c\00t\00i\00o\00n") + (data (i32.const 120) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\00C") + (data (i32.const 144) "\0c\00\00\00\01\00\00\00\01\00\00\00\0c\00\00\00S\00t\00r\00i\00n\00g") + (data (i32.const 176) "\08\00\00\00\01\00\00\00\01\00\00\00\08\00\00\00b\00o\00o\00l") + (data (i32.const 200) "\04\00\00\00\01\00\00\00\01\00\00\00\04\00\00\00i\008") + (data (i32.const 224) "\04\00\00\00\01\00\00\00\01\00\00\00\04\00\00\00u\008") + (data (i32.const 248) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00i\001\006") + (data (i32.const 272) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00u\001\006") + (data (i32.const 296) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00i\003\002") + (data (i32.const 320) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00u\003\002") + (data (i32.const 344) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00f\003\002") + (data (i32.const 368) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00i\006\004") + (data (i32.const 392) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00u\006\004") + (data (i32.const 416) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00f\006\004") + (data (i32.const 440) "\n\00\00\00\01\00\00\00\01\00\00\00\n\00\00\00i\00s\00i\00z\00e") + (data (i32.const 472) "\n\00\00\00\01\00\00\00\01\00\00\00\n\00\00\00u\00s\00i\00z\00e") + (data (i32.const 504) "\08\00\00\00\01\00\00\00\01\00\00\00\08\00\00\00v\00o\00i\00d") + (data (i32.const 528) "\14\00\00\00\01\00\00\00\01\00\00\00\14\00\00\00s\00o\00m\00e\00 \00v\00a\00l\00u\00e") + (table $0 3 funcref) + (elem (i32.const 0) $start:builtins~anonymous|1 $start:builtins~anonymous|0 $start:builtins~anonymous|1) (global $builtins/b (mut i32) (i32.const 0)) (global $builtins/i (mut i32) (i32.const 0)) (global $builtins/I (mut i64) (i64.const 0)) @@ -21,7 +42,7 @@ (global $builtins/s (mut i32) (i32.const 0)) (global $builtins/fn i32 (i32.const 1)) (export "memory" (memory $0)) - (export "test" (func $builtins/test)) + (export "test" (func $start:builtins~anonymous|1)) (start $start) (func $~lib/number/isNaN (; 1 ;) (type $FUNCSIG$if) (param $0 f32) (result i32) local.get $0 @@ -50,7 +71,83 @@ (func $start:builtins~anonymous|0 (; 5 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) nop ) - (func $start:builtins (; 6 ;) (type $FUNCSIG$v) + (func $~lib/string/String#get:length (; 6 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 16 + i32.sub + i32.load offset=12 + i32.const 1 + i32.shr_u + ) + (func $~lib/util/string/compareImpl (; 7 ;) (type $FUNCSIG$iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + loop $continue|0 + local.get $2 + if (result i32) + local.get $0 + i32.load16_u + local.get $1 + i32.load16_u + i32.sub + local.tee $3 + i32.eqz + else + i32.const 0 + end + if + local.get $2 + i32.const 1 + i32.sub + local.set $2 + local.get $0 + i32.const 2 + i32.add + local.set $0 + local.get $1 + i32.const 2 + i32.add + local.set $1 + br $continue|0 + end + end + local.get $3 + ) + (func $~lib/string/String.__eq (; 8 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + return + end + block $folding-inner0 + local.get $1 + i32.eqz + i32.const 1 + local.get $0 + select + br_if $folding-inner0 + local.get $0 + call $~lib/string/String#get:length + local.tee $2 + local.get $1 + call $~lib/string/String#get:length + i32.ne + br_if $folding-inner0 + local.get $0 + local.get $1 + local.get $2 + call $~lib/util/string/compareImpl + i32.eqz + return + end + i32.const 0 + ) + (func $start:builtins~anonymous|1 (; 9 ;) (type $FUNCSIG$v) + nop + ) + (func $start:builtins (; 10 ;) (type $FUNCSIG$v) i32.const 31 global.set $builtins/i i32.const 0 @@ -685,11 +782,248 @@ i32.const 8 f64.const 1 f64.store + i32.const 104 + i32.const 104 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 423 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 104 + i32.const 104 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 424 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 136 + i32.const 136 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 425 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 160 + i32.const 160 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 426 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 192 + i32.const 192 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 427 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 216 + i32.const 216 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 428 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 240 + i32.const 240 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 429 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 264 + i32.const 264 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 430 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 288 + i32.const 288 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 431 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 312 + i32.const 312 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 432 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 336 + i32.const 336 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 433 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 360 + i32.const 360 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 434 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 384 + i32.const 384 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 435 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 408 + i32.const 408 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 436 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 432 + i32.const 432 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 437 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 456 + i32.const 456 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 438 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 488 + i32.const 488 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 439 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 520 + i32.const 520 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 440 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 160 + i32.const 160 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 441 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 104 + i32.const 104 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 442 + i32.const 2 + call $~lib/builtins/abort + unreachable + end ) - (func $builtins/test (; 7 ;) (type $FUNCSIG$v) - nop - ) - (func $start (; 8 ;) (type $FUNCSIG$v) + (func $start (; 11 ;) (type $FUNCSIG$v) call $start:builtins ) ) diff --git a/tests/compiler/builtins.ts b/tests/compiler/builtins.ts index 5cfd3dbbac..5c267d13f6 100644 --- a/tests/compiler/builtins.ts +++ b/tests/compiler/builtins.ts @@ -418,3 +418,26 @@ f64.store(8, 1.0); f32.trunc(1.0); f64.trunc(1.0); + +{ + assert(nameof<() => void>() == "Function"); + assert(nameof<(a: C) => i32>() == "Function"); + assert(nameof() == "C"); + assert(nameof() == "String"); + assert(nameof() == "bool"); + assert(nameof() == "i8"); + assert(nameof() == "u8"); + assert(nameof() == "i16"); + assert(nameof() == "u16"); + assert(nameof() == "i32"); + assert(nameof() == "u32"); + assert(nameof() == "f32"); + assert(nameof() == "i64"); + assert(nameof() == "u64"); + assert(nameof() == "f64"); + assert(nameof() == "isize"); + assert(nameof() == "usize"); + assert(nameof() == "void"); + assert(nameof("some value") == "String"); + assert(nameof((): void => {}) == "Function"); +} diff --git a/tests/compiler/builtins.untouched.wat b/tests/compiler/builtins.untouched.wat index f09cccc9da..ccc7992501 100644 --- a/tests/compiler/builtins.untouched.wat +++ b/tests/compiler/builtins.untouched.wat @@ -3,14 +3,36 @@ (type $FUNCSIG$if (func (param f32) (result i32))) (type $FUNCSIG$id (func (param f64) (result i32))) (type $FUNCSIG$vii (func (param i32 i32))) + (type $FUNCSIG$iii (func (param i32 i32) (result i32))) + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$vi (func (param i32))) + (type $FUNCSIG$iiiiii (func (param i32 i32 i32 i32 i32) (result i32))) (type $FUNCSIG$v (func)) (import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32))) (memory $0 1) (data (i32.const 8) "\00\00\00\00\01\00\00\00\01\00\00\00\00\00\00\00") (data (i32.const 24) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00a\00b\00c\00") (data (i32.const 48) "\16\00\00\00\01\00\00\00\01\00\00\00\16\00\00\00b\00u\00i\00l\00t\00i\00n\00s\00.\00t\00s\00") - (table $0 2 funcref) - (elem (i32.const 0) $null $start:builtins~anonymous|0) + (data (i32.const 88) "\10\00\00\00\01\00\00\00\01\00\00\00\10\00\00\00F\00u\00n\00c\00t\00i\00o\00n\00") + (data (i32.const 120) "\02\00\00\00\01\00\00\00\01\00\00\00\02\00\00\00C\00") + (data (i32.const 144) "\0c\00\00\00\01\00\00\00\01\00\00\00\0c\00\00\00S\00t\00r\00i\00n\00g\00") + (data (i32.const 176) "\08\00\00\00\01\00\00\00\01\00\00\00\08\00\00\00b\00o\00o\00l\00") + (data (i32.const 200) "\04\00\00\00\01\00\00\00\01\00\00\00\04\00\00\00i\008\00") + (data (i32.const 224) "\04\00\00\00\01\00\00\00\01\00\00\00\04\00\00\00u\008\00") + (data (i32.const 248) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00i\001\006\00") + (data (i32.const 272) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00u\001\006\00") + (data (i32.const 296) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00i\003\002\00") + (data (i32.const 320) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00u\003\002\00") + (data (i32.const 344) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00f\003\002\00") + (data (i32.const 368) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00i\006\004\00") + (data (i32.const 392) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00u\006\004\00") + (data (i32.const 416) "\06\00\00\00\01\00\00\00\01\00\00\00\06\00\00\00f\006\004\00") + (data (i32.const 440) "\n\00\00\00\01\00\00\00\01\00\00\00\n\00\00\00i\00s\00i\00z\00e\00") + (data (i32.const 472) "\n\00\00\00\01\00\00\00\01\00\00\00\n\00\00\00u\00s\00i\00z\00e\00") + (data (i32.const 504) "\08\00\00\00\01\00\00\00\01\00\00\00\08\00\00\00v\00o\00i\00d\00") + (data (i32.const 528) "\14\00\00\00\01\00\00\00\01\00\00\00\14\00\00\00s\00o\00m\00e\00 \00v\00a\00l\00u\00e\00") + (table $0 3 funcref) + (elem (i32.const 0) $null $start:builtins~anonymous|0 $start:builtins~anonymous|1) (global $builtins/b (mut i32) (i32.const 0)) (global $builtins/i (mut i32) (i32.const 0)) (global $builtins/I (mut i64) (i64.const 0)) @@ -81,7 +103,162 @@ (func $start:builtins~anonymous|0 (; 5 ;) (type $FUNCSIG$vii) (param $0 i32) (param $1 i32) nop ) - (func $start:builtins (; 6 ;) (type $FUNCSIG$v) + (func $~lib/rt/stub/__retain (; 6 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + ) + (func $~lib/rt/stub/__release (; 7 ;) (type $FUNCSIG$vi) (param $0 i32) + nop + ) + (func $~lib/string/String#get:length (; 8 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + local.get $0 + i32.const 16 + i32.sub + i32.load offset=12 + i32.const 1 + i32.shr_u + ) + (func $~lib/util/string/compareImpl (; 9 ;) (type $FUNCSIG$iiiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (result i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + local.get $0 + call $~lib/rt/stub/__retain + drop + local.get $2 + call $~lib/rt/stub/__retain + drop + i32.const 0 + local.set $5 + local.get $0 + local.get $1 + i32.const 1 + i32.shl + i32.add + local.set $6 + local.get $2 + local.get $3 + i32.const 1 + i32.shl + i32.add + local.set $7 + block $break|0 + loop $continue|0 + local.get $4 + if (result i32) + local.get $6 + i32.load16_u + local.get $7 + i32.load16_u + i32.sub + local.tee $5 + i32.eqz + else + i32.const 0 + end + i32.eqz + br_if $break|0 + local.get $4 + i32.const 1 + i32.sub + local.set $4 + local.get $6 + i32.const 2 + i32.add + local.set $6 + local.get $7 + i32.const 2 + i32.add + local.set $7 + br $continue|0 + end + unreachable + end + local.get $5 + local.set $8 + local.get $0 + call $~lib/rt/stub/__release + local.get $2 + call $~lib/rt/stub/__release + local.get $8 + ) + (func $~lib/string/String.__eq (; 10 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + local.get $0 + call $~lib/rt/stub/__retain + drop + local.get $1 + call $~lib/rt/stub/__retain + drop + local.get $0 + local.get $1 + i32.eq + if + i32.const 1 + local.set $2 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + return + end + local.get $0 + i32.const 0 + i32.eq + if (result i32) + i32.const 1 + else + local.get $1 + i32.const 0 + i32.eq + end + if + i32.const 0 + local.set $2 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + return + end + local.get $0 + call $~lib/string/String#get:length + local.set $3 + local.get $3 + local.get $1 + call $~lib/string/String#get:length + i32.ne + if + i32.const 0 + local.set $2 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + return + end + local.get $0 + i32.const 0 + local.get $1 + i32.const 0 + local.get $3 + call $~lib/util/string/compareImpl + i32.eqz + local.set $2 + local.get $0 + call $~lib/rt/stub/__release + local.get $1 + call $~lib/rt/stub/__release + local.get $2 + ) + (func $start:builtins~anonymous|1 (; 11 ;) (type $FUNCSIG$v) + nop + ) + (func $start:builtins (; 12 ;) (type $FUNCSIG$v) (local $0 i32) (local $1 i32) (local $2 i64) @@ -1147,13 +1324,253 @@ f64.const 1 f64.trunc drop + i32.const 104 + i32.const 104 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 423 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 104 + i32.const 104 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 424 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 136 + i32.const 136 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 425 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 160 + i32.const 160 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 426 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 192 + i32.const 192 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 427 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 216 + i32.const 216 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 428 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 240 + i32.const 240 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 429 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 264 + i32.const 264 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 430 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 288 + i32.const 288 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 431 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 312 + i32.const 312 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 432 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 336 + i32.const 336 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 433 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 360 + i32.const 360 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 434 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 384 + i32.const 384 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 435 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 408 + i32.const 408 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 436 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 432 + i32.const 432 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 437 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 456 + i32.const 456 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 438 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 488 + i32.const 488 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 439 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 520 + i32.const 520 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 440 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 160 + i32.const 160 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 441 + i32.const 2 + call $~lib/builtins/abort + unreachable + end + i32.const 104 + i32.const 104 + call $~lib/string/String.__eq + i32.eqz + if + i32.const 0 + i32.const 64 + i32.const 442 + i32.const 2 + call $~lib/builtins/abort + unreachable + end ) - (func $builtins/test (; 7 ;) (type $FUNCSIG$v) + (func $builtins/test (; 13 ;) (type $FUNCSIG$v) nop ) - (func $start (; 8 ;) (type $FUNCSIG$v) + (func $start (; 14 ;) (type $FUNCSIG$v) call $start:builtins ) - (func $null (; 9 ;) (type $FUNCSIG$v) + (func $null (; 15 ;) (type $FUNCSIG$v) ) ) diff --git a/tests/compiler/std/libm.optimized.wat b/tests/compiler/std/libm.optimized.wat index 280b885be1..674c46355b 100644 --- a/tests/compiler/std/libm.optimized.wat +++ b/tests/compiler/std/libm.optimized.wat @@ -2933,8 +2933,6 @@ i32.const 1 local.get $6 i32.const 0 - i32.ne - i32.const 0 local.get $8 i32.const 2146435072 i32.eq @@ -2946,8 +2944,6 @@ i32.const 1 local.get $19 i32.const 0 - i32.ne - i32.const 0 local.get $4 i32.const 2146435072 i32.eq @@ -7185,14 +7181,14 @@ local.get $8 i32.const -1021968384 i32.eq - if - local.get $1 - local.get $0 - local.get $2 - f32.sub - f32.le - br_if $folding-inner1 - end + i32.const 0 + local.get $1 + local.get $0 + local.get $2 + f32.sub + f32.le + select + br_if $folding-inner1 end end local.get $8 diff --git a/tests/compiler/std/math.optimized.wat b/tests/compiler/std/math.optimized.wat index 86b7d05f4d..583c4b84a0 100644 --- a/tests/compiler/std/math.optimized.wat +++ b/tests/compiler/std/math.optimized.wat @@ -6321,8 +6321,6 @@ i32.const 1 local.get $6 i32.const 0 - i32.ne - i32.const 0 local.get $8 i32.const 2146435072 i32.eq @@ -6334,8 +6332,6 @@ i32.const 1 local.get $19 i32.const 0 - i32.ne - i32.const 0 local.get $4 i32.const 2146435072 i32.eq @@ -7801,14 +7797,14 @@ local.get $8 i32.const -1021968384 i32.eq - if - local.get $1 - local.get $0 - local.get $2 - f32.sub - f32.le - br_if $folding-inner1 - end + i32.const 0 + local.get $1 + local.get $0 + local.get $2 + f32.sub + f32.le + select + br_if $folding-inner1 end end local.get $8 diff --git a/tests/compiler/std/operator-overloading.optimized.wat b/tests/compiler/std/operator-overloading.optimized.wat index 1fd696f1be..53ea972248 100644 --- a/tests/compiler/std/operator-overloading.optimized.wat +++ b/tests/compiler/std/operator-overloading.optimized.wat @@ -284,8 +284,6 @@ i32.const 1 local.get $6 i32.const 0 - i32.ne - i32.const 0 local.get $8 i32.const 2146435072 i32.eq @@ -297,8 +295,6 @@ i32.const 1 local.get $19 i32.const 0 - i32.ne - i32.const 0 local.get $4 i32.const 2146435072 i32.eq