mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-12 14:31:28 +00:00
Add atomic definitions (#524)
This commit is contained in:
@ -126,6 +126,11 @@ tests.forEach(filename => {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (config.asc_flags) {
|
||||
config.asc_flags.forEach(flag => {
|
||||
Array.prototype.push.apply(asc_flags, flag.split(" "));
|
||||
});
|
||||
}
|
||||
|
||||
var failed = false;
|
||||
|
||||
|
9
tests/compiler/threads.json
Normal file
9
tests/compiler/threads.json
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"features": [
|
||||
"threads"
|
||||
],
|
||||
"asc_flags": [
|
||||
"--memoryBase 8",
|
||||
"--sharedMemory 1"
|
||||
]
|
||||
}
|
545
tests/compiler/threads.optimized.wat
Normal file
545
tests/compiler/threads.optimized.wat
Normal file
@ -0,0 +1,545 @@
|
||||
(module
|
||||
(type $FUNCSIG$v (func))
|
||||
(memory $0 (shared 1 1))
|
||||
(table $0 1 funcref)
|
||||
(elem (i32.const 0) $null)
|
||||
(export "memory" (memory $0))
|
||||
(export "table" (table $0))
|
||||
(start $start)
|
||||
(func $threads/testAtomic (; 0 ;) (type $FUNCSIG$v)
|
||||
i32.const 0
|
||||
i32.atomic.load8_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.atomic.load16_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.atomic.load
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load8_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load16_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load32_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load
|
||||
drop
|
||||
i32.const 8
|
||||
i64.atomic.load
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store8
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store16
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store8
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store16
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store32
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store
|
||||
i32.const 8
|
||||
i64.const 1
|
||||
i64.atomic.store
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.add
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.add
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.add offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.sub
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.sub
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.sub offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.and
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.and
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.and offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.or
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.or
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.or offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.xor
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xor
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xor offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.xchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xchg offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw8.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw16.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw.cmpxchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw8.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw16.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw32.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw.cmpxchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw.cmpxchg offset=8
|
||||
drop
|
||||
)
|
||||
(func $threads/testAtomicAsm (; 1 ;) (type $FUNCSIG$v)
|
||||
i32.const 0
|
||||
i32.atomic.load8_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.atomic.load16_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.atomic.load
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load8_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load16_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load32_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store8
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store16
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store8
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store16
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store32
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.add
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.add
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.sub
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.sub
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.and
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.and
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.or
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.or
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.xor
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xor
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.xchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xchg
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw8.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw16.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw.cmpxchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw8.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw16.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw32.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw.cmpxchg
|
||||
drop
|
||||
)
|
||||
(func $start (; 2 ;) (type $FUNCSIG$v)
|
||||
call $threads/testAtomic
|
||||
call $threads/testAtomicAsm
|
||||
)
|
||||
(func $null (; 3 ;) (type $FUNCSIG$v)
|
||||
nop
|
||||
)
|
||||
)
|
172
tests/compiler/threads.ts
Normal file
172
tests/compiler/threads.ts
Normal file
@ -0,0 +1,172 @@
|
||||
function testAtomic(): void {
|
||||
atomic.load<u8>(0); // i32.atomic.load8_u
|
||||
atomic.load<u16>(0); // i32.atomic.load16_u
|
||||
atomic.load<u32>(0); // i32.atomic.load
|
||||
<u64>atomic.load<u8>(0); // i64.atomic.load8_u
|
||||
<u64>atomic.load<u16>(0); // i64.atomic.load16_u
|
||||
<u64>atomic.load<u32>(0); // i64.atomic.load32_u
|
||||
atomic.load<u64>(0); // i64.atomic.load
|
||||
atomic.load<u64>(0, 8); // with offset
|
||||
|
||||
atomic.store<u8>(0, 1); // i32.atomic.store8
|
||||
atomic.store<u16>(0, 1); // i32.atomic.store16
|
||||
atomic.store<u32>(0, 1); // i32.atomic.store
|
||||
atomic.store<u8>(0, <u64>1); // i64.atomic.store8
|
||||
atomic.store<u16>(0, <u64>1); // i64.atomic.store16
|
||||
atomic.store<u32>(0, <u64>1); // i64.atomic.store32
|
||||
atomic.store<u64>(0, 1); // i64.atomic.store
|
||||
atomic.store<u64>(0, 1, 8); // with offset
|
||||
|
||||
atomic.add<u8>(0, 1); // i32.atomic.rmw8.add_u
|
||||
atomic.add<u16>(0, 1); // i32.atomic.rmw16.add_u
|
||||
atomic.add<u32>(0, 1); // i32.atomic.rmw.add
|
||||
atomic.add<u8>(0, <u64>1); // i64.atomic.rmw8.add_u
|
||||
atomic.add<u16>(0, <u64>1); // i64.atomic.rmw16.add_u
|
||||
atomic.add<u32>(0, <u64>1); // i64.atomic.rmw32.add_u
|
||||
atomic.add<u64>(0, 1); // i64.atomic.rmw.add
|
||||
atomic.add<u64>(0, 1, 8); // with offset
|
||||
|
||||
atomic.sub<u8>(0, 1); // i32.atomic.rmw8.sub_u
|
||||
atomic.sub<u16>(0, 1); // i32.atomic.rmw16.sub_u
|
||||
atomic.sub<u32>(0, 1); // i32.atomic.rmw.sub
|
||||
atomic.sub<u8>(0, <u64>1); // i64.atomic.rmw8.sub_u
|
||||
atomic.sub<u16>(0, <u64>1); // i64.atomic.rmw16.sub_u
|
||||
atomic.sub<u32>(0, <u64>1); // i64.atomic.rmw32.sub_u
|
||||
atomic.sub<u64>(0, 1); // i64.atomic.rmw.sub
|
||||
atomic.sub<u64>(0, 1, 8); // with offset
|
||||
|
||||
atomic.and<u8>(0, 1); // i32.atomic.rmw8.and_u
|
||||
atomic.and<u16>(0, 1); // i32.atomic.rmw16.and_u
|
||||
atomic.and<u32>(0, 1); // i32.atomic.rmw.and
|
||||
atomic.and<u8>(0, <u64>1); // i64.atomic.rmw8.and_u
|
||||
atomic.and<u16>(0, <u64>1); // i64.atomic.rmw16.and_u
|
||||
atomic.and<u32>(0, <u64>1); // i64.atomic.rmw32.and_u
|
||||
atomic.and<u64>(0, 1); // i64.atomic.rmw.and
|
||||
atomic.and<u64>(0, 1, 8); // with offset
|
||||
|
||||
atomic.or<u8>(0, 1); // i32.atomic.rmw8.or_u
|
||||
atomic.or<u16>(0, 1); // i32.atomic.rmw16.or_u
|
||||
atomic.or<u32>(0, 1); // i32.atomic.rmw.or
|
||||
atomic.or<u8>(0, <u64>1); // i64.atomic.rmw8.or_u
|
||||
atomic.or<u16>(0, <u64>1); // i64.atomic.rmw16.or_u
|
||||
atomic.or<u32>(0, <u64>1); // i64.atomic.rmw32.or_u
|
||||
atomic.or<u64>(0, 1); // i64.atomic.rmw.or
|
||||
atomic.or<u64>(0, 1, 8); // with offset
|
||||
|
||||
atomic.xor<u8>(0, 1); // i32.atomic.rmw8.xor_u
|
||||
atomic.xor<u16>(0, 1); // i32.atomic.rmw16.xor_u
|
||||
atomic.xor<u32>(0, 1); // i32.atomic.rmw.xor
|
||||
atomic.xor<u8>(0, <u64>1); // i64.atomic.rmw8.xor_u
|
||||
atomic.xor<u16>(0, <u64>1); // i64.atomic.rmw16.xor_u
|
||||
atomic.xor<u32>(0, <u64>1); // i64.atomic.rmw32.xor_u
|
||||
atomic.xor<u64>(0, 1); // i64.atomic.rmw.xor
|
||||
atomic.xor<u64>(0, 1, 8); // with offset
|
||||
|
||||
atomic.xchg<u8>(0, 1); // i32.atomic.rmw8.xchg_u
|
||||
atomic.xchg<u16>(0, 1); // i32.atomic.rmw16.xchg_u
|
||||
atomic.xchg<u32>(0, 1); // i32.atomic.rmw.xchg
|
||||
atomic.xchg<u8>(0, <u64>1); // i64.atomic.rmw8.xchg_u
|
||||
atomic.xchg<u16>(0, <u64>1); // i64.atomic.rmw16.xchg_u
|
||||
atomic.xchg<u32>(0, <u64>1); // i64.atomic.rmw32.xchg_u
|
||||
atomic.xchg<u64>(0, 1); // i64.atomic.rmw.xchg
|
||||
atomic.xchg<u64>(0, 1, 8); // with offset
|
||||
|
||||
atomic.cmpxchg<u8>(0, 1, 2); // i32.atomic.rmw8.xchg_u
|
||||
atomic.cmpxchg<u16>(0, 1, 2); // i32.atomic.rmw16.xchg_u
|
||||
atomic.cmpxchg<u32>(0, 1, 2); // i32.atomic.rmw.xchg
|
||||
atomic.cmpxchg<u8>(0, <u64>1, 2); // i64.atomic.rmw8.xchg_u
|
||||
atomic.cmpxchg<u16>(0, <u64>1, 2); // i64.atomic.rmw16.xchg_u
|
||||
atomic.cmpxchg<u32>(0, <u64>1, 2); // i64.atomic.rmw32.xchg_u
|
||||
atomic.cmpxchg<u64>(0, 1, 2); // i64.atomic.rmw.xchg
|
||||
atomic.cmpxchg<u64>(0, 1, 2, 8); // with offset
|
||||
|
||||
// atomic.wait<i32>(0, 0, -1); // i32.atomic.wait
|
||||
// atomic.wait<i64>(0, 0, -1); // i32.atomic.notify
|
||||
// atomic.notify<i32>(0, 1); // i64.atomic.wait
|
||||
// atomic.notify<i64>(0, 1); // i64.atomic.notify
|
||||
}
|
||||
|
||||
function testAtomicAsm(): void {
|
||||
|
||||
i32.atomic.load8_u(0);
|
||||
i32.atomic.load16_u(0);
|
||||
i32.atomic.load(0);
|
||||
i64.atomic.load8_u(0);
|
||||
i64.atomic.load16_u(0);
|
||||
i64.atomic.load32_u(0);
|
||||
i64.atomic.load(0);
|
||||
|
||||
i32.atomic.store8(0, 1);
|
||||
i32.atomic.store16(0, 1);
|
||||
i32.atomic.store(0, 1);
|
||||
i64.atomic.store8(0, <i64>1);
|
||||
i64.atomic.store16(0, <i64>1);
|
||||
i64.atomic.store32(0, <i64>1);
|
||||
i64.atomic.store(0, 1);
|
||||
|
||||
i32.atomic.rmw8.add_u(0, 1);
|
||||
i32.atomic.rmw16.add_u(0, 1);
|
||||
i32.atomic.rmw.add(0, 1);
|
||||
i64.atomic.rmw8.add_u(0, <i64>1);
|
||||
i64.atomic.rmw16.add_u(0, <i64>1);
|
||||
i64.atomic.rmw32.add_u(0, <i64>1);
|
||||
i64.atomic.rmw.add(0, 1);
|
||||
|
||||
i32.atomic.rmw8.sub_u(0, 1);
|
||||
i32.atomic.rmw16.sub_u(0, 1);
|
||||
i32.atomic.rmw.sub(0, 1);
|
||||
i64.atomic.rmw8.sub_u(0, <i64>1);
|
||||
i64.atomic.rmw16.sub_u(0, <i64>1);
|
||||
i64.atomic.rmw32.sub_u(0, <i64>1);
|
||||
i64.atomic.rmw.sub(0, 1);
|
||||
|
||||
i32.atomic.rmw8.and_u(0, 1);
|
||||
i32.atomic.rmw16.and_u(0, 1);
|
||||
i32.atomic.rmw.and(0, 1);
|
||||
i64.atomic.rmw8.and_u(0, <i64>1);
|
||||
i64.atomic.rmw16.and_u(0, <i64>1);
|
||||
i64.atomic.rmw32.and_u(0, <i64>1);
|
||||
i64.atomic.rmw.and(0, 1);
|
||||
|
||||
i32.atomic.rmw8.or_u(0, 1);
|
||||
i32.atomic.rmw16.or_u(0, 1);
|
||||
i32.atomic.rmw.or(0, 1);
|
||||
i64.atomic.rmw8.or_u(0, <i64>1);
|
||||
i64.atomic.rmw16.or_u(0, <i64>1);
|
||||
i64.atomic.rmw32.or_u(0, <i64>1);
|
||||
i64.atomic.rmw.or(0, 1);
|
||||
|
||||
i32.atomic.rmw8.xor_u(0, 1);
|
||||
i32.atomic.rmw16.xor_u(0, 1);
|
||||
i32.atomic.rmw.xor(0, 1);
|
||||
i64.atomic.rmw8.xor_u(0, <i64>1);
|
||||
i64.atomic.rmw16.xor_u(0, <i64>1);
|
||||
i64.atomic.rmw32.xor_u(0, <i64>1);
|
||||
i64.atomic.rmw.xor(0, 1);
|
||||
|
||||
i32.atomic.rmw8.xchg_u(0, 1);
|
||||
i32.atomic.rmw16.xchg_u(0, 1);
|
||||
i32.atomic.rmw.xchg(0, 1);
|
||||
i64.atomic.rmw8.xchg_u(0, <i64>1);
|
||||
i64.atomic.rmw16.xchg_u(0, <i64>1);
|
||||
i64.atomic.rmw32.xchg_u(0, <i64>1);
|
||||
i64.atomic.rmw.xchg(0, 1);
|
||||
|
||||
i32.atomic.rmw8.cmpxchg_u(0, 1, 2);
|
||||
i32.atomic.rmw16.cmpxchg_u(0, 1, 2);
|
||||
i32.atomic.rmw.cmpxchg(0, 1, 2);
|
||||
i64.atomic.rmw8.cmpxchg_u(0, <i64>1, 2);
|
||||
i64.atomic.rmw16.cmpxchg_u(0, <i64>1, 2);
|
||||
i64.atomic.rmw32.cmpxchg_u(0, <i64>1, 2);
|
||||
i64.atomic.rmw.cmpxchg(0, 1, 2);
|
||||
|
||||
// i32.atomic.wait(0, 0, -1);
|
||||
// i64.atomic.wait(0, 0, -1);
|
||||
// i32.atomic.notify(0, 1);
|
||||
// i64.atomic.notify(0, 1);
|
||||
}
|
||||
|
||||
if (ASC_FEATURE_THREADS) {
|
||||
testAtomic();
|
||||
testAtomicAsm();
|
||||
}
|
549
tests/compiler/threads.untouched.wat
Normal file
549
tests/compiler/threads.untouched.wat
Normal file
@ -0,0 +1,549 @@
|
||||
(module
|
||||
(type $FUNCSIG$v (func))
|
||||
(memory $0 (shared 1 1))
|
||||
(table $0 1 funcref)
|
||||
(elem (i32.const 0) $null)
|
||||
(global $~lib/ASC_FEATURE_THREADS i32 (i32.const 0))
|
||||
(global $~lib/memory/HEAP_BASE i32 (i32.const 8))
|
||||
(export "memory" (memory $0))
|
||||
(export "table" (table $0))
|
||||
(start $start)
|
||||
(func $threads/testAtomic (; 0 ;) (type $FUNCSIG$v)
|
||||
i32.const 0
|
||||
i32.atomic.load8_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.atomic.load16_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.atomic.load
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load8_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load16_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load32_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store8
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store16
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store8
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store16
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store32
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store offset=8
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.add
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.add
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.add offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.sub
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.sub
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.sub offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.and
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.and
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.and offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.or
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.or
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.or offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.xor
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xor
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xor offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.xchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xchg offset=8
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw8.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw16.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw.cmpxchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw8.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw16.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw32.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw.cmpxchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw.cmpxchg offset=8
|
||||
drop
|
||||
)
|
||||
(func $threads/testAtomicAsm (; 1 ;) (type $FUNCSIG$v)
|
||||
i32.const 0
|
||||
i32.atomic.load8_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.atomic.load16_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.atomic.load
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load8_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load16_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load32_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.atomic.load
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store8
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store16
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.store
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store8
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store16
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store32
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.store
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.add
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.add_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.add
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.sub
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.sub_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.sub
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.and
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.and_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.and
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.or
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.or_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.or
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.xor
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.xor_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xor
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw8.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw16.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.atomic.rmw.xchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw8.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw16.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw32.xchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.atomic.rmw.xchg
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw8.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw16.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i32.const 1
|
||||
i32.const 2
|
||||
i32.atomic.rmw.cmpxchg
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw8.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw16.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw32.cmpxchg_u
|
||||
drop
|
||||
i32.const 0
|
||||
i64.const 1
|
||||
i64.const 2
|
||||
i64.atomic.rmw.cmpxchg
|
||||
drop
|
||||
)
|
||||
(func $start:threads (; 2 ;) (type $FUNCSIG$v)
|
||||
call $threads/testAtomic
|
||||
call $threads/testAtomicAsm
|
||||
)
|
||||
(func $start (; 3 ;) (type $FUNCSIG$v)
|
||||
call $start:threads
|
||||
)
|
||||
(func $null (; 4 ;) (type $FUNCSIG$v)
|
||||
)
|
||||
)
|
@ -6,5 +6,13 @@
|
||||
"v8_flags": [
|
||||
"--experimental-wasm-simd"
|
||||
]
|
||||
},
|
||||
"threads": {
|
||||
"asc_flags": [
|
||||
"--enable threads"
|
||||
],
|
||||
"v8_flags": [
|
||||
"--experimental-wasm-threads"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user