Skip to content

Fix: add missed tests for simd with type usize and isize #2467

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
976 changes: 968 additions & 8 deletions tests/compiler/simd.debug.wat

Large diffs are not rendered by default.

316 changes: 291 additions & 25 deletions tests/compiler/simd.release.wat
Original file line number Diff line number Diff line change
@@ -4,10 +4,10 @@
(type $i32_i32_i32_=>_v128 (func (param i32 i32 i32) (result v128)))
(type $i32_i32_=>_none (func (param i32 i32)))
(type $i32_i32_=>_i32 (func (param i32 i32) (result i32)))
(type $i32_=>_i32 (func (param i32) (result i32)))
(type $i32_i32_i32_i32_=>_none (func (param i32 i32 i32 i32)))
(type $i32_i32_i32_=>_none (func (param i32 i32 i32)))
(type $none_=>_i32 (func (result i32)))
(type $i32_=>_i32 (func (param i32) (result i32)))
(type $v128_=>_v128 (func (param v128) (result v128)))
(type $i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_i32_=>_v128 (func (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result v128)))
(type $i32_i32_i32_i32_i32_i32_i32_i32_=>_v128 (func (param i32 i32 i32 i32 i32 i32 i32 i32) (result v128)))
@@ -30,7 +30,7 @@
(global $~lib/rt/itcms/fromSpace (mut i32) (i32.const 0))
(global $~lib/rt/tlsf/ROOT (mut i32) (i32.const 0))
(global $simd/vec (mut v128) (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000))
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 18012))
(global $~lib/memory/__stack_pointer (mut i32) (i32.const 18076))
(memory $0 1)
(data (i32.const 1036) ",")
(data (i32.const 1052) "\10\00\00\00\01\00\00\00\02\00\00\00\03\00\00\00\04")
@@ -48,8 +48,12 @@
(data (i32.const 1496) "\01\00\00\00\1a\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s")
(data (i32.const 1532) ",")
(data (i32.const 1544) "\01\00\00\00\0e\00\00\00s\00i\00m\00d\00.\00t\00s")
(data (i32.const 1584) "\05\00\00\00 \00\00\00\00\00\00\00 ")
(data (i32.const 1612) "\02\04\00\00\00\00\00\00\02\t")
(data (i32.const 1580) "\1c")
(data (i32.const 1592) "\01\00\00\00\0c\00\00\00w\00a\00s\00m\003\002")
(data (i32.const 1612) "\1c")
(data (i32.const 1624) "\01\00\00\00\0c\00\00\00w\00a\00s\00m\006\004")
(data (i32.const 1648) "\05\00\00\00 \00\00\00\00\00\00\00 ")
(data (i32.const 1676) "\02\04\00\00\00\00\00\00\02\t")
(export "reexport" (func $simd/reexport))
(export "test_vars_i8x16_partial" (func $simd/test_vars_i8x16_partial))
(export "test_vars_i8x16_full" (func $simd/test_vars_i8x16_full))
@@ -69,6 +73,8 @@
(func $~lib/rt/itcms/visitRoots
(local $0 i32)
(local $1 i32)
i32.const 1600
call $byn-split-outlined-A$~lib/rt/itcms/__visit
i32.const 1296
call $byn-split-outlined-A$~lib/rt/itcms/__visit
i32.const 1104
@@ -146,7 +152,7 @@
i32.load $0 offset=8
i32.eqz
local.get $0
i32.const 18012
i32.const 18076
i32.lt_u
i32.and
i32.eqz
@@ -195,7 +201,7 @@
i32.const 1
else
local.get $1
i32.const 1584
i32.const 1648
i32.load $0
i32.gt_u
if
@@ -209,7 +215,7 @@
local.get $1
i32.const 3
i32.shl
i32.const 1588
i32.const 1652
i32.add
i32.load $0
i32.const 32
@@ -774,10 +780,10 @@
if
unreachable
end
i32.const 18016
i32.const 18080
i32.const 0
i32.store $0
i32.const 19584
i32.const 19648
i32.const 0
i32.store $0
loop $for-loop|0
@@ -788,7 +794,7 @@
local.get $0
i32.const 2
i32.shl
i32.const 18016
i32.const 18080
i32.add
i32.const 0
i32.store $0 offset=4
@@ -806,7 +812,7 @@
i32.add
i32.const 2
i32.shl
i32.const 18016
i32.const 18080
i32.add
i32.const 0
i32.store $0 offset=96
@@ -824,20 +830,20 @@
br $for-loop|0
end
end
i32.const 18016
i32.const 19588
i32.const 18080
i32.const 19652
memory.size $0
i32.const 16
i32.shl
call $~lib/rt/tlsf/addMemory
i32.const 18016
i32.const 18080
global.set $~lib/rt/tlsf/ROOT
)
(func $~lib/rt/tlsf/__free (param $0 i32)
(local $1 i32)
(local $2 i32)
local.get $0
i32.const 18012
i32.const 18076
i32.lt_u
if
return
@@ -967,7 +973,7 @@
local.set $0
loop $while-continue|0
local.get $0
i32.const 18012
i32.const 18076
i32.lt_u
if
local.get $0
@@ -1067,7 +1073,7 @@
unreachable
end
local.get $0
i32.const 18012
i32.const 18076
i32.lt_u
if
local.get $0
@@ -1845,6 +1851,117 @@
local.get $0
call $~lib/rt/tlsf/__free
)
(func $~lib/string/String.__eq (param $0 i32) (result i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
local.get $0
i32.const 1600
i32.eq
if
i32.const 1
return
end
local.get $0
i32.eqz
if
i32.const 0
return
end
i32.const 1596
i32.load $0
i32.const 1
i32.shr_u
local.tee $2
local.get $0
i32.const 20
i32.sub
i32.load $0 offset=16
i32.const 1
i32.shr_u
i32.ne
if
i32.const 0
return
end
i32.const 1600
local.set $3
local.get $0
local.tee $1
i32.const 7
i32.and
i32.eqz
local.get $2
local.tee $0
i32.const 4
i32.ge_u
i32.and
if
loop $do-loop|0
local.get $3
i64.load $0
local.get $1
i64.load $0
i64.eq
if
local.get $3
i32.const 8
i32.add
local.set $3
local.get $1
i32.const 8
i32.add
local.set $1
local.get $0
i32.const 4
i32.sub
local.tee $0
i32.const 4
i32.ge_u
br_if $do-loop|0
end
end
end
block $__inlined_func$~lib/util/string/compareImpl
loop $while-continue|1
local.get $0
local.tee $2
i32.const 1
i32.sub
local.set $0
local.get $2
if
local.get $3
i32.load16_u $0
local.tee $4
local.get $1
i32.load16_u $0
local.tee $5
i32.sub
local.set $2
local.get $4
local.get $5
i32.ne
br_if $__inlined_func$~lib/util/string/compareImpl
local.get $3
i32.const 2
i32.add
local.set $3
local.get $1
i32.const 2
i32.add
local.set $1
br $while-continue|1
end
end
i32.const 0
local.set $2
end
local.get $2
i32.eqz
)
(func $start:simd
(local $0 i32)
(local $1 i32)
@@ -1855,19 +1972,19 @@
i32.const 4
i32.sub
global.set $~lib/memory/__stack_pointer
block $folding-inner0
block $folding-inner1
global.get $~lib/memory/__stack_pointer
i32.const 1628
i32.const 1692
i32.lt_s
br_if $folding-inner0
br_if $folding-inner1
global.get $~lib/memory/__stack_pointer
local.tee $0
i32.const 0
i32.store $0
memory.size $0
i32.const 16
i32.shl
i32.const 18012
i32.const 18076
i32.sub
i32.const 1
i32.shr_u
@@ -1901,9 +2018,9 @@
i32.sub
global.set $~lib/memory/__stack_pointer
global.get $~lib/memory/__stack_pointer
i32.const 1628
i32.const 1692
i32.lt_s
br_if $folding-inner0
br_if $folding-inner1
global.get $~lib/memory/__stack_pointer
local.tee $1
i32.const 0
@@ -2179,13 +2296,162 @@
local.get $0
call $~lib/rt/tlsf/__free
global.get $~lib/memory/__stack_pointer
i32.const 8
i32.sub
global.set $~lib/memory/__stack_pointer
global.get $~lib/memory/__stack_pointer
i32.const 1692
i32.lt_s
br_if $folding-inner1
global.get $~lib/memory/__stack_pointer
local.tee $0
i64.const 0
i64.store $0
local.get $0
i32.const 1600
i32.store $0
local.get $0
i32.const 1600
i32.store $0 offset=4
i32.const 1600
call $~lib/string/String.__eq
drop
global.get $~lib/memory/__stack_pointer
i32.const 1600
i32.store $0
global.get $~lib/memory/__stack_pointer
i32.const 1600
i32.store $0 offset=4
i32.const 1600
call $~lib/string/String.__eq
drop
global.get $~lib/memory/__stack_pointer
i32.const 1600
i32.store $0
global.get $~lib/memory/__stack_pointer
i32.const 1632
i32.store $0 offset=4
i32.const 1632
call $~lib/string/String.__eq
if
i32.const 0
i32.const 1552
i32.const 1137
i32.const 5
call $~lib/builtins/abort
unreachable
end
global.get $~lib/rt/tlsf/ROOT
i32.eqz
if
call $~lib/rt/tlsf/initialize
end
global.get $~lib/rt/tlsf/ROOT
i32.const 16
call $~lib/rt/tlsf/allocateBlock
i32.const 4
i32.add
local.tee $0
i32.const 42
i32.store $0
local.get $0
v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000
v128.load32_lane $0 0
i32x4.extract_lane 0
i32.const 42
i32.ne
if
i32.const 0
i32.const 1552
i32.const 1153
i32.const 5
call $~lib/builtins/abort
unreachable
end
local.get $0
call $~lib/rt/tlsf/__free
global.get $~lib/memory/__stack_pointer
i32.const 8
i32.add
global.set $~lib/memory/__stack_pointer
global.get $~lib/memory/__stack_pointer
i32.const 8
i32.sub
global.set $~lib/memory/__stack_pointer
global.get $~lib/memory/__stack_pointer
i32.const 1692
i32.lt_s
br_if $folding-inner1
global.get $~lib/memory/__stack_pointer
local.tee $0
i64.const 0
i64.store $0
local.get $0
i32.const 1600
i32.store $0
local.get $0
i32.const 1600
i32.store $0 offset=4
i32.const 1600
call $~lib/string/String.__eq
drop
global.get $~lib/memory/__stack_pointer
i32.const 1600
i32.store $0
global.get $~lib/memory/__stack_pointer
i32.const 1632
i32.store $0 offset=4
i32.const 1632
call $~lib/string/String.__eq
if
i32.const 0
i32.const 1552
i32.const 1197
i32.const 5
call $~lib/builtins/abort
unreachable
end
global.get $~lib/rt/tlsf/ROOT
i32.eqz
if
call $~lib/rt/tlsf/initialize
end
global.get $~lib/rt/tlsf/ROOT
i32.const 16
call $~lib/rt/tlsf/allocateBlock
i32.const 4
i32.add
local.tee $0
i32.const 42
i32.store $0
local.get $0
v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000
v128.load32_lane $0 0
i32x4.extract_lane 0
i32.const 42
i32.ne
if
i32.const 0
i32.const 1552
i32.const 1213
i32.const 5
call $~lib/builtins/abort
unreachable
end
local.get $0
call $~lib/rt/tlsf/__free
global.get $~lib/memory/__stack_pointer
i32.const 8
i32.add
global.set $~lib/memory/__stack_pointer
global.get $~lib/memory/__stack_pointer
i32.const 4
i32.add
global.set $~lib/memory/__stack_pointer
return
end
i32.const 18032
i32.const 18080
i32.const 18096
i32.const 18144
i32.const 1
i32.const 1
call $~lib/builtins/abort
136 changes: 136 additions & 0 deletions tests/compiler/simd.ts
Original file line number Diff line number Diff line change
@@ -1080,6 +1080,140 @@ function test_f64x2(): void {
f64x2(1.0, 4.0)
);
}
function test_usize(): void {
assert(
v128.mul<usize>(v128.splat<usize>(42), v128.splat<usize>(1))
==
v128.splat<usize>(42)
);
assert(
v128.mul<usize>(v128.splat<usize>(42), v128.splat<usize>(2))
==
v128.splat<usize>(84)
);
assert(
v128.add<usize>(v128.splat<usize>(42), v128.splat<usize>(24))
==
v128.splat<usize>(66)
);
assert(v128.extract_lane<usize>(v128.splat<usize>(42), 0) == 42);
assert(v128.extract_lane<usize>(v128.replace_lane<usize>(v128.splat<usize>(42), 0, 24), 0) == 24);
assert(v128.add<usize>(v128.splat<usize>(42), v128.splat<usize>(1)) == v128.splat<usize>(43));
assert(v128.sub<usize>(v128.splat<usize>(42), v128.splat<usize>(1)) == v128.splat<usize>(41));
assert(v128.eq<usize>(v128.splat<usize>(42), v128.splat<usize>(1)) == v128.splat<isize>(0));
assert(v128.eq<usize>(v128.splat<usize>(42), v128.splat<usize>(42)) == v128.splat<isize>(-1));
assert(v128.ne<usize>(v128.splat<usize>(42), v128.splat<usize>(1)) == v128.splat<isize>(-1));
assert(v128.ne<usize>(v128.splat<usize>(42), v128.splat<usize>(42)) == v128.splat<isize>(0));
if (process.arch == "wasm32") { // binary does not have opcode: LtU64x2, LeU64x2, GtU64x2, GeU64x2
assert(v128.le<usize>(v128.splat<usize>(1), v128.splat<usize>(42)) == v128.splat<isize>(-1));
assert(v128.le<usize>(v128.splat<usize>(1), v128.splat<usize>(1)) == v128.splat<isize>(-1));
assert(v128.lt<usize>(v128.splat<usize>(1), v128.splat<usize>(42)) == v128.splat<isize>(-1));
assert(v128.lt<usize>(v128.splat<usize>(1), v128.splat<usize>(1)) == v128.splat<isize>(0));
assert(v128.ge<usize>(v128.splat<usize>(42), v128.splat<usize>(1)) == v128.splat<isize>(-1));
assert(v128.ge<usize>(v128.splat<usize>(1), v128.splat<usize>(1)) == v128.splat<isize>(-1));
assert(v128.gt<usize>(v128.splat<usize>(42), v128.splat<usize>(1)) == v128.splat<isize>(-1));
assert(v128.gt<usize>(v128.splat<usize>(1), v128.splat<usize>(1)) == v128.splat<isize>(0));
}
assert(v128.neg<usize>(v128.splat<usize>(1)) == v128.splat<isize>(-1));
assert(v128.neg<usize>(v128.splat<usize>(usize.MAX_VALUE)) == v128.splat<isize>(1));
assert(v128.eq<usize>(v128.splat<usize>(42), v128.splat<usize>(42)) == v128.splat<isize>(-1));
assert(v128.abs<usize>(v128.splat<usize>(42)) == v128.splat<usize>(42));
assert(v128.shl<usize>(v128.splat<usize>(1), 1) == v128.splat<usize>(2));
assert(v128.shr<usize>(v128.splat<usize>(2), 1) == v128.splat<usize>(1));
assert(v128.all_true<usize>(v128.splat<usize>(1)));
if (process.arch == "wasm32") { // bitmask will return different value depends on compile target
assert(
v128.bitmask<usize>(v128.splat<usize>(usize.MAX_VALUE))
==
0xf
);
assert(
v128.bitmask<usize>(v128.splat<usize>(0))
==
0
);
}
if (process.arch == "wasm64") {
assert(
v128.bitmask<usize>(v128.splat<usize>(usize.MAX_VALUE))
==
0x3
);
assert(
v128.bitmask<usize>(v128.splat<usize>(0))
==
0
);
}
{
let ptr = __alloc(16);
store<usize>(ptr, 42);
let v: v128 = v128.splat<usize>(0);
v = v128.load_lane<usize>(ptr, v, 0);
assert(v128.extract_lane<usize>(v, 0) == 42);
__free(ptr);
}
}

function test_isize(): void {
assert(v128.extract_lane<isize>(v128.splat<usize>(42), 0) == 42);
assert(v128.extract_lane<isize>(v128.replace_lane<usize>(v128.splat<usize>(42), 0, 24), 0) == 24);
assert(v128.add<isize>(v128.splat<isize>(42), v128.splat<isize>(1)) == v128.splat<isize>(43));
assert(v128.mul<isize>(v128.splat<isize>(42), v128.splat<isize>(1)) == v128.splat<isize>(42));
assert(v128.sub<isize>(v128.splat<isize>(42), v128.splat<isize>(1)) == v128.splat<isize>(41));
assert(v128.eq<isize>(v128.splat<isize>(42), v128.splat<isize>(1)) == v128.splat<isize>(0));
assert(v128.eq<isize>(v128.splat<isize>(42), v128.splat<isize>(42)) == v128.splat<isize>(-1));
assert(v128.ne<isize>(v128.splat<isize>(42), v128.splat<isize>(1)) == v128.splat<isize>(-1));
assert(v128.ne<isize>(v128.splat<isize>(42), v128.splat<isize>(42)) == v128.splat<isize>(0));
assert(v128.le<isize>(v128.splat<isize>(1), v128.splat<isize>(42)) == v128.splat<isize>(-1));
assert(v128.le<isize>(v128.splat<isize>(1), v128.splat<isize>(1)) == v128.splat<isize>(-1));
assert(v128.lt<isize>(v128.splat<isize>(1), v128.splat<isize>(42)) == v128.splat<isize>(-1));
assert(v128.lt<isize>(v128.splat<isize>(1), v128.splat<isize>(1)) == v128.splat<isize>(0));
assert(v128.ge<isize>(v128.splat<isize>(42), v128.splat<isize>(1)) == v128.splat<isize>(-1));
assert(v128.ge<isize>(v128.splat<isize>(1), v128.splat<isize>(1)) == v128.splat<isize>(-1));
assert(v128.gt<isize>(v128.splat<isize>(42), v128.splat<isize>(1)) == v128.splat<isize>(-1));
assert(v128.gt<isize>(v128.splat<isize>(1), v128.splat<isize>(1)) == v128.splat<isize>(0));
assert(v128.eq<isize>(v128.splat<isize>(42), v128.splat<isize>(42)) == v128.splat<isize>(-1));
assert(v128.neg<isize>(v128.splat<isize>(1)) == v128.splat<isize>(-1));
assert(v128.neg<isize>(v128.splat<isize>(-1)) == v128.splat<isize>(1));
assert(v128.neg<isize>(v128.splat<isize>(usize.MAX_VALUE)) == v128.splat<isize>(1));
assert(v128.abs<isize>(v128.splat<isize>(42)) == v128.splat<isize>(42));
assert(v128.shl<isize>(v128.splat<isize>(1), 1) == v128.splat<isize>(2));
assert(v128.shr<isize>(v128.splat<isize>(2), 1) == v128.splat<isize>(1));
assert(v128.all_true<isize>(v128.splat<isize>(1)));
if (process.arch == "wasm32") { // bitmask will return different value depends on compile target
assert(
v128.bitmask<isize>(v128.splat<isize>(usize.MAX_VALUE))
==
0xf
);
assert(
v128.bitmask<isize>(v128.splat<isize>(0))
==
0
);
}
if (process.arch == "wasm64") {
assert(
v128.bitmask<isize>(v128.splat<isize>(usize.MAX_VALUE))
==
0x3
);
assert(
v128.bitmask<isize>(v128.splat<isize>(0))
==
0
);
}
{
let ptr = __alloc(16);
store<isize>(ptr, 42);
let v: v128 = v128.splat<isize>(0);
v = v128.load_lane<isize>(ptr, v, 0);
assert(v128.extract_lane<isize>(v, 0) == 42);
__free(ptr);
}
}

function test_const(): v128 {
const one = i32x4.splat(1); // should precompute
@@ -1163,4 +1297,6 @@ test_i32x4();
test_i64x2();
test_f32x4();
test_f64x2();
test_usize();
test_isize();
test_const();