From 5198e47e36c8bceb2842570a7e3f4ec7fd8748e0 Mon Sep 17 00:00:00 2001 From: Nikolay Nikolov Date: Fri, 13 May 2022 20:55:12 +0300 Subject: [PATCH] + added the atomic memory access WebAssembly instructions from the threading proposal for WebAssembly --- compiler/wasm32/cpubase.pas | 29 ++++++++++++++++++++++++++++- compiler/wasm32/itcpugas.pas | 29 ++++++++++++++++++++++++++++- compiler/wasm32/strinst.inc | 29 ++++++++++++++++++++++++++++- 3 files changed, 84 insertions(+), 3 deletions(-) diff --git a/compiler/wasm32/cpubase.pas b/compiler/wasm32/cpubase.pas index 81fb3a3c52..b791b4eb12 100644 --- a/compiler/wasm32/cpubase.pas +++ b/compiler/wasm32/cpubase.pas @@ -87,7 +87,34 @@ uses // bulk memory operations a_memory_copy, a_memory_fill, // exceptions - a_try,a_catch,a_catch_all,a_delegate,a_throw,a_rethrow,a_end_try + a_try,a_catch,a_catch_all,a_delegate,a_throw,a_rethrow,a_end_try, + // atomic memory accesses - load/store + a_i32_atomic_load8_u, a_i32_atomic_load16_u, a_i32_atomic_load, + a_i64_atomic_load8_u, a_i64_atomic_load16_u, a_i64_atomic_load32_u, + a_i64_atomic_load, a_i32_atomic_store8, a_i32_atomic_store16, + a_i32_atomic_store, a_i64_atomic_store8, a_i64_atomic_store16, + a_i64_atomic_store32, a_i64_atomic_store, + // atomic memory accesses - read-modify-write + a_i32_atomic_rmw8_add_u, a_i32_atomic_rmw16_add_u, a_i32_atomic_rmw_add, + a_i64_atomic_rmw8_add_u, a_i64_atomic_rmw16_add_u, a_i64_atomic_rmw32_add_u, + a_i64_atomic_rmw_add, a_i32_atomic_rmw8_sub_u, a_i32_atomic_rmw16_sub_u, + a_i32_atomic_rmw_sub, a_i64_atomic_rmw8_sub_u, a_i64_atomic_rmw16_sub_u, + a_i64_atomic_rmw32_sub_u, a_i64_atomic_rmw_sub, a_i32_atomic_rmw8_and_u, + a_i32_atomic_rmw16_and_u, a_i32_atomic_rmw_and, a_i64_atomic_rmw8_and_u, + a_i64_atomic_rmw16_and_u, a_i64_atomic_rmw32_and_u, a_i64_atomic_rmw_and, + a_i32_atomic_rmw8_or_u, a_i32_atomic_rmw16_or_u, a_i32_atomic_rmw_or, + a_i64_atomic_rmw8_or_u, a_i64_atomic_rmw16_or_u, a_i64_atomic_rmw32_or_u, + a_i64_atomic_rmw_or, a_i32_atomic_rmw8_xor_u, a_i32_atomic_rmw16_xor_u, + a_i32_atomic_rmw_xor, a_i64_atomic_rmw8_xor_u, a_i64_atomic_rmw16_xor_u, + a_i64_atomic_rmw32_xor_u, a_i64_atomic_rmw_xor, a_i32_atomic_rmw8_xchg_u, + a_i32_atomic_rmw16_xchg_u, a_i32_atomic_rmw_xchg, a_i64_atomic_rmw8_xchg_u, + a_i64_atomic_rmw16_xchg_u, a_i64_atomic_rmw32_xchg_u, a_i64_atomic_rmw_xchg, + // atomic memory accesses - compare exchange + a_i32_atomic_rmw8_cmpxchg_u, a_i32_atomic_rmw16_cmpxchg_u, a_i32_atomic_rmw_cmpxchg, + a_i64_atomic_rmw8_cmpxchg_u, a_i64_atomic_rmw16_cmpxchg_u, a_i64_atomic_rmw32_cmpxchg_u, + a_i64_atomic_rmw_cmpxchg, + // atomic memory accesses - wait and notify operators + a_memory_atomic_wait32, a_memory_atomic_wait64, a_memory_atomic_notify, a_atomic_fence ); TWasmBasicType = (wbt_i32, wbt_i64, wbt_f32, wbt_f64); diff --git a/compiler/wasm32/itcpugas.pas b/compiler/wasm32/itcpugas.pas index 07a8a97cf6..34690096a2 100644 --- a/compiler/wasm32/itcpugas.pas +++ b/compiler/wasm32/itcpugas.pas @@ -86,7 +86,34 @@ interface // bulk memory operations 'memory.copy 0,0', 'memory.fill 0', // exceptions - 'try','catch','catch_all','delegate','throw','rethrow','end_try' + 'try','catch','catch_all','delegate','throw','rethrow','end_try', + // atomic memory accesses - load/store + 'i32.atomic.load8_u', 'i32.atomic.load16_u', 'i32.atomic.load', + 'i64.atomic.load8_u', 'i64.atomic.load16_u', 'i64.atomic.load32_u', + 'i64.atomic.load', 'i32.atomic.store8', 'i32.atomic.store16', + 'i32.atomic.store', 'i64.atomic.store8', 'i64.atomic.store16', + 'i64.atomic.store32', 'i64.atomic.store', + // atomic memory accesses - read-modify-write + 'i32.atomic.rmw8.add_u', 'i32.atomic.rmw16.add_u', 'i32.atomic.rmw.add', + 'i64.atomic.rmw8.add_u', 'i64.atomic.rmw16.add_u', 'i64.atomic.rmw32.add_u', + 'i64.atomic.rmw.add', 'i32.atomic.rmw8.sub_u', 'i32.atomic.rmw16.sub_u', + 'i32.atomic.rmw.sub', 'i64.atomic.rmw8.sub_u', 'i64.atomic.rmw16.sub_u', + 'i64.atomic.rmw32.sub_u', 'i64.atomic.rmw.sub', 'i32.atomic.rmw8.and_u', + 'i32.atomic.rmw16.and_u', 'i32.atomic.rmw.and', 'i64.atomic.rmw8.and_u', + 'i64.atomic.rmw16.and_u', 'i64.atomic.rmw32.and_u', 'i64.atomic.rmw.and', + 'i32.atomic.rmw8.or_u', 'i32.atomic.rmw16.or_u', 'i32.atomic.rmw.or', + 'i64.atomic.rmw8.or_u', 'i64.atomic.rmw16.or_u', 'i64.atomic.rmw32.or_u', + 'i64.atomic.rmw.or', 'i32.atomic.rmw8.xor_u', 'i32.atomic.rmw16.xor_u', + 'i32.atomic.rmw.xor', 'i64.atomic.rmw8.xor_u', 'i64.atomic.rmw16.xor_u', + 'i64.atomic.rmw32.xor_u', 'i64.atomic.rmw.xor', 'i32.atomic.rmw8.xchg_u', + 'i32.atomic.rmw16.xchg_u', 'i32.atomic.rmw.xchg', 'i64.atomic.rmw8.xchg_u', + 'i64.atomic.rmw16.xchg_u', 'i64.atomic.rmw32.xchg_u', 'i64.atomic.rmw.xchg', + // atomic memory accesses - compare exchange + 'i32.atomic.rmw8.cmpxchg_u', 'i32.atomic.rmw16.cmpxchg_u', 'i32.atomic.rmw.cmpxchg', + 'i64.atomic.rmw8.cmpxchg_u', 'i64.atomic.rmw16.cmpxchg_u', 'i64.atomic.rmw32.cmpxchg_u', + 'i64.atomic.rmw.cmpxchg', + // atomic memory accesses - wait and notify operators + 'memory.atomic.wait32', 'memory.atomic.wait64', 'memory.atomic.notify', 'atomic.fence' ); gas_wasm_basic_type_str : array [TWasmBasicType] of string = ('i32','i64','f32','f64'); diff --git a/compiler/wasm32/strinst.inc b/compiler/wasm32/strinst.inc index 92548afe70..acd3633ec8 100644 --- a/compiler/wasm32/strinst.inc +++ b/compiler/wasm32/strinst.inc @@ -70,5 +70,32 @@ // bulk memory operations 'memory.copy', 'memory.fill', // exceptions - 'try','catch','catch_all','delegate','throw','rethrow','end' + 'try','catch','catch_all','delegate','throw','rethrow','end', + // atomic memory accesses - load/store + 'i32.atomic.load8_u', 'i32.atomic.load16_u', 'i32.atomic.load', + 'i64.atomic.load8_u', 'i64.atomic.load16_u', 'i64.atomic.load32_u', + 'i64.atomic.load', 'i32.atomic.store8', 'i32.atomic.store16', + 'i32.atomic.store', 'i64.atomic.store8', 'i64.atomic.store16', + 'i64.atomic.store32', 'i64.atomic.store', + // atomic memory accesses - read-modify-write + 'i32.atomic.rmw8.add_u', 'i32.atomic.rmw16.add_u', 'i32.atomic.rmw.add', + 'i64.atomic.rmw8.add_u', 'i64.atomic.rmw16.add_u', 'i64.atomic.rmw32.add_u', + 'i64.atomic.rmw.add', 'i32.atomic.rmw8.sub_u', 'i32.atomic.rmw16.sub_u', + 'i32.atomic.rmw.sub', 'i64.atomic.rmw8.sub_u', 'i64.atomic.rmw16.sub_u', + 'i64.atomic.rmw32.sub_u', 'i64.atomic.rmw.sub', 'i32.atomic.rmw8.and_u', + 'i32.atomic.rmw16.and_u', 'i32.atomic.rmw.and', 'i64.atomic.rmw8.and_u', + 'i64.atomic.rmw16.and_u', 'i64.atomic.rmw32.and_u', 'i64.atomic.rmw.and', + 'i32.atomic.rmw8.or_u', 'i32.atomic.rmw16.or_u', 'i32.atomic.rmw.or', + 'i64.atomic.rmw8.or_u', 'i64.atomic.rmw16.or_u', 'i64.atomic.rmw32.or_u', + 'i64.atomic.rmw.or', 'i32.atomic.rmw8.xor_u', 'i32.atomic.rmw16.xor_u', + 'i32.atomic.rmw.xor', 'i64.atomic.rmw8.xor_u', 'i64.atomic.rmw16.xor_u', + 'i64.atomic.rmw32.xor_u', 'i64.atomic.rmw.xor', 'i32.atomic.rmw8.xchg_u', + 'i32.atomic.rmw16.xchg_u', 'i32.atomic.rmw.xchg', 'i64.atomic.rmw8.xchg_u', + 'i64.atomic.rmw16.xchg_u', 'i64.atomic.rmw32.xchg_u', 'i64.atomic.rmw.xchg', + // atomic memory accesses - compare exchange + 'i32.atomic.rmw8.cmpxchg_u', 'i32.atomic.rmw16.cmpxchg_u', 'i32.atomic.rmw.cmpxchg', + 'i64.atomic.rmw8.cmpxchg_u', 'i64.atomic.rmw16.cmpxchg_u', 'i64.atomic.rmw32.cmpxchg_u', + 'i64.atomic.rmw.cmpxchg', + // atomic memory accesses - wait and notify operators + 'memory.atomic.wait32', 'memory.atomic.wait64', 'memory.atomic.notify', 'atomic.fence'