From d8f06aa4f163efae1c2938662c5e816e25a42b64 Mon Sep 17 00:00:00 2001 From: Nikolay Nikolov Date: Fri, 20 May 2022 17:36:37 +0300 Subject: [PATCH] + added instrinsic support for the all the 2-parameter read-modify-write WebAssembly atomic operations (add, sub, and, or, xor, xchg). Note that they are not implemented in the internal assembler, yet. --- compiler/wasm32/ccpuinnr.inc | 50 ++++++++- compiler/wasm32/nwasminl.pas | 211 ++++++++++++++++++++++++++++++++++- rtl/wasm32/cpuh.inc | 49 ++++++++ rtl/wasm32/cpuinnr.inc | 49 ++++++++ 4 files changed, 356 insertions(+), 3 deletions(-) diff --git a/compiler/wasm32/ccpuinnr.inc b/compiler/wasm32/ccpuinnr.inc index aae388bb45..e592a6fc86 100644 --- a/compiler/wasm32/ccpuinnr.inc +++ b/compiler/wasm32/ccpuinnr.inc @@ -18,5 +18,53 @@ in_wasm32_throw_fpcexception = in_cpu_first+3, in_wasm32_memory_copy = in_cpu_first+4, in_wasm32_memory_fill = in_cpu_first+5, - in_wasm32_atomic_fence = in_cpu_first+6 + in_wasm32_atomic_fence = in_cpu_first+6, + + in_wasm32_i32_atomic_rmw8_add_u = in_cpu_first+7, + in_wasm32_i32_atomic_rmw16_add_u = in_cpu_first+8, + in_wasm32_i32_atomic_rmw_add = in_cpu_first+9, + in_wasm32_i64_atomic_rmw8_add_u = in_cpu_first+10, + in_wasm32_i64_atomic_rmw16_add_u = in_cpu_first+11, + in_wasm32_i64_atomic_rmw32_add_u = in_cpu_first+12, + in_wasm32_i64_atomic_rmw_add = in_cpu_first+13, + + in_wasm32_i32_atomic_rmw8_sub_u = in_cpu_first+14, + in_wasm32_i32_atomic_rmw16_sub_u = in_cpu_first+15, + in_wasm32_i32_atomic_rmw_sub = in_cpu_first+16, + in_wasm32_i64_atomic_rmw8_sub_u = in_cpu_first+17, + in_wasm32_i64_atomic_rmw16_sub_u = in_cpu_first+18, + in_wasm32_i64_atomic_rmw32_sub_u = in_cpu_first+19, + in_wasm32_i64_atomic_rmw_sub = in_cpu_first+20, + + in_wasm32_i32_atomic_rmw8_and_u = in_cpu_first+21, + in_wasm32_i32_atomic_rmw16_and_u = in_cpu_first+22, + in_wasm32_i32_atomic_rmw_and = in_cpu_first+23, + in_wasm32_i64_atomic_rmw8_and_u = in_cpu_first+24, + in_wasm32_i64_atomic_rmw16_and_u = in_cpu_first+25, + in_wasm32_i64_atomic_rmw32_and_u = in_cpu_first+26, + in_wasm32_i64_atomic_rmw_and = in_cpu_first+27, + + in_wasm32_i32_atomic_rmw8_or_u = in_cpu_first+28, + in_wasm32_i32_atomic_rmw16_or_u = in_cpu_first+29, + in_wasm32_i32_atomic_rmw_or = in_cpu_first+30, + in_wasm32_i64_atomic_rmw8_or_u = in_cpu_first+31, + in_wasm32_i64_atomic_rmw16_or_u = in_cpu_first+32, + in_wasm32_i64_atomic_rmw32_or_u = in_cpu_first+33, + in_wasm32_i64_atomic_rmw_or = in_cpu_first+34, + + in_wasm32_i32_atomic_rmw8_xor_u = in_cpu_first+35, + in_wasm32_i32_atomic_rmw16_xor_u = in_cpu_first+36, + in_wasm32_i32_atomic_rmw_xor = in_cpu_first+37, + in_wasm32_i64_atomic_rmw8_xor_u = in_cpu_first+38, + in_wasm32_i64_atomic_rmw16_xor_u = in_cpu_first+39, + in_wasm32_i64_atomic_rmw32_xor_u = in_cpu_first+40, + in_wasm32_i64_atomic_rmw_xor = in_cpu_first+41, + + in_wasm32_i32_atomic_rmw8_xchg_u = in_cpu_first+42, + in_wasm32_i32_atomic_rmw16_xchg_u = in_cpu_first+43, + in_wasm32_i32_atomic_rmw_xchg = in_cpu_first+44, + in_wasm32_i64_atomic_rmw8_xchg_u = in_cpu_first+45, + in_wasm32_i64_atomic_rmw16_xchg_u = in_cpu_first+46, + in_wasm32_i64_atomic_rmw32_xchg_u = in_cpu_first+47, + in_wasm32_i64_atomic_rmw_xchg = in_cpu_first+48 diff --git a/compiler/wasm32/nwasminl.pas b/compiler/wasm32/nwasminl.pas index 339fda42bb..25b6267c01 100644 --- a/compiler/wasm32/nwasminl.pas +++ b/compiler/wasm32/nwasminl.pas @@ -26,7 +26,7 @@ unit nwasminl; interface uses - node,ncginl; + node,ncginl,cpubase; type @@ -52,6 +52,7 @@ interface procedure second_unreachable; procedure second_throw_fpcexception; procedure second_atomic_fence; + procedure second_atomic_rmw_x_y(op: TAsmOp); protected function first_sqr_real: tnode; override; public @@ -66,7 +67,6 @@ implementation uses ninl,ncal,compinnr, - cpubase, aasmbase,aasmdata,aasmcpu, cgbase,cgutils, hlcgobj,hlcgcpu, @@ -404,6 +404,35 @@ implementation end; + procedure twasminlinenode.second_atomic_rmw_x_y(op: TAsmOp); + begin + secondpass(tcallparanode(tcallparanode(left).right).left); + hlcg.location_force_reg(current_asmdata.CurrAsmList, + tcallparanode(tcallparanode(left).right).left.location, + tcallparanode(tcallparanode(left).right).left.resultdef, + tcallparanode(tcallparanode(left).right).left.resultdef,false); + thlcgwasm(hlcg).a_load_reg_stack(current_asmdata.CurrAsmList, + tcallparanode(tcallparanode(left).right).left.resultdef, + tcallparanode(tcallparanode(left).right).left.location.register); + + secondpass(tcallparanode(left).left); + hlcg.location_force_reg(current_asmdata.CurrAsmList, + tcallparanode(left).left.location, + tcallparanode(left).left.resultdef, + tcallparanode(left).left.resultdef,false); + thlcgwasm(hlcg).a_load_reg_stack(current_asmdata.CurrAsmList, + tcallparanode(left).left.resultdef, + tcallparanode(left).left.location.register); + + current_asmdata.CurrAsmList.Concat(taicpu.op_const(op,0)); + thlcgwasm(hlcg).decstack(current_asmdata.CurrAsmList,1); + + location_reset(location,LOC_REGISTER,def_cgsize(resultdef)); + location.register:=hlcg.getregisterfordef(current_asmdata.CurrAsmList,resultdef); + thlcgwasm(hlcg).a_load_stack_loc(current_asmdata.CurrAsmList,resultdef,location); + end; + + function twasminlinenode.first_sqr_real: tnode; begin expectloc:=LOC_FPUREGISTER; @@ -450,6 +479,57 @@ implementation CheckParameters(0); resultdef:=voidtype; end; + + in_wasm32_i32_atomic_rmw8_add_u, + in_wasm32_i32_atomic_rmw16_add_u, + in_wasm32_i32_atomic_rmw_add, + in_wasm32_i32_atomic_rmw8_sub_u, + in_wasm32_i32_atomic_rmw16_sub_u, + in_wasm32_i32_atomic_rmw_sub, + in_wasm32_i32_atomic_rmw8_and_u, + in_wasm32_i32_atomic_rmw16_and_u, + in_wasm32_i32_atomic_rmw_and, + in_wasm32_i32_atomic_rmw8_or_u, + in_wasm32_i32_atomic_rmw16_or_u, + in_wasm32_i32_atomic_rmw_or, + in_wasm32_i32_atomic_rmw8_xor_u, + in_wasm32_i32_atomic_rmw16_xor_u, + in_wasm32_i32_atomic_rmw_xor, + in_wasm32_i32_atomic_rmw8_xchg_u, + in_wasm32_i32_atomic_rmw16_xchg_u, + in_wasm32_i32_atomic_rmw_xchg: + begin + CheckParameters(2); + resultdef:=u32inttype; + end; + in_wasm32_i64_atomic_rmw8_add_u, + in_wasm32_i64_atomic_rmw16_add_u, + in_wasm32_i64_atomic_rmw32_add_u, + in_wasm32_i64_atomic_rmw_add, + in_wasm32_i64_atomic_rmw8_sub_u, + in_wasm32_i64_atomic_rmw16_sub_u, + in_wasm32_i64_atomic_rmw32_sub_u, + in_wasm32_i64_atomic_rmw_sub, + in_wasm32_i64_atomic_rmw8_and_u, + in_wasm32_i64_atomic_rmw16_and_u, + in_wasm32_i64_atomic_rmw32_and_u, + in_wasm32_i64_atomic_rmw_and, + in_wasm32_i64_atomic_rmw8_or_u, + in_wasm32_i64_atomic_rmw16_or_u, + in_wasm32_i64_atomic_rmw32_or_u, + in_wasm32_i64_atomic_rmw_or, + in_wasm32_i64_atomic_rmw8_xor_u, + in_wasm32_i64_atomic_rmw16_xor_u, + in_wasm32_i64_atomic_rmw32_xor_u, + in_wasm32_i64_atomic_rmw_xor, + in_wasm32_i64_atomic_rmw8_xchg_u, + in_wasm32_i64_atomic_rmw16_xchg_u, + in_wasm32_i64_atomic_rmw32_xchg_u, + in_wasm32_i64_atomic_rmw_xchg: + begin + CheckParameters(2); + resultdef:=u64inttype; + end; else Result:=inherited pass_typecheck_cpu; end; @@ -469,6 +549,49 @@ implementation in_wasm32_throw_fpcexception, in_wasm32_atomic_fence: expectloc:=LOC_VOID; + in_wasm32_i32_atomic_rmw8_add_u, + in_wasm32_i32_atomic_rmw16_add_u, + in_wasm32_i32_atomic_rmw_add, + in_wasm32_i64_atomic_rmw8_add_u, + in_wasm32_i64_atomic_rmw16_add_u, + in_wasm32_i64_atomic_rmw32_add_u, + in_wasm32_i64_atomic_rmw_add, + in_wasm32_i32_atomic_rmw8_sub_u, + in_wasm32_i32_atomic_rmw16_sub_u, + in_wasm32_i32_atomic_rmw_sub, + in_wasm32_i64_atomic_rmw8_sub_u, + in_wasm32_i64_atomic_rmw16_sub_u, + in_wasm32_i64_atomic_rmw32_sub_u, + in_wasm32_i64_atomic_rmw_sub, + in_wasm32_i32_atomic_rmw8_and_u, + in_wasm32_i32_atomic_rmw16_and_u, + in_wasm32_i32_atomic_rmw_and, + in_wasm32_i64_atomic_rmw8_and_u, + in_wasm32_i64_atomic_rmw16_and_u, + in_wasm32_i64_atomic_rmw32_and_u, + in_wasm32_i64_atomic_rmw_and, + in_wasm32_i32_atomic_rmw8_or_u, + in_wasm32_i32_atomic_rmw16_or_u, + in_wasm32_i32_atomic_rmw_or, + in_wasm32_i64_atomic_rmw8_or_u, + in_wasm32_i64_atomic_rmw16_or_u, + in_wasm32_i64_atomic_rmw32_or_u, + in_wasm32_i64_atomic_rmw_or, + in_wasm32_i32_atomic_rmw8_xor_u, + in_wasm32_i32_atomic_rmw16_xor_u, + in_wasm32_i32_atomic_rmw_xor, + in_wasm32_i64_atomic_rmw8_xor_u, + in_wasm32_i64_atomic_rmw16_xor_u, + in_wasm32_i64_atomic_rmw32_xor_u, + in_wasm32_i64_atomic_rmw_xor, + in_wasm32_i32_atomic_rmw8_xchg_u, + in_wasm32_i32_atomic_rmw16_xchg_u, + in_wasm32_i32_atomic_rmw_xchg, + in_wasm32_i64_atomic_rmw8_xchg_u, + in_wasm32_i64_atomic_rmw16_xchg_u, + in_wasm32_i64_atomic_rmw32_xchg_u, + in_wasm32_i64_atomic_rmw_xchg: + expectloc:=LOC_REGISTER; else Result:=inherited first_cpu; end; @@ -492,6 +615,90 @@ implementation second_throw_fpcexception; in_wasm32_atomic_fence: second_atomic_fence; + in_wasm32_i32_atomic_rmw8_add_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw8_add_u); + in_wasm32_i32_atomic_rmw16_add_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw16_add_u); + in_wasm32_i32_atomic_rmw_add: + second_atomic_rmw_x_y(a_i32_atomic_rmw_add); + in_wasm32_i64_atomic_rmw8_add_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw8_add_u); + in_wasm32_i64_atomic_rmw16_add_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw16_add_u); + in_wasm32_i64_atomic_rmw32_add_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw32_add_u); + in_wasm32_i64_atomic_rmw_add: + second_atomic_rmw_x_y(a_i64_atomic_rmw_add); + in_wasm32_i32_atomic_rmw8_sub_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw8_sub_u); + in_wasm32_i32_atomic_rmw16_sub_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw16_sub_u); + in_wasm32_i32_atomic_rmw_sub: + second_atomic_rmw_x_y(a_i32_atomic_rmw_sub); + in_wasm32_i64_atomic_rmw8_sub_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw8_sub_u); + in_wasm32_i64_atomic_rmw16_sub_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw16_sub_u); + in_wasm32_i64_atomic_rmw32_sub_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw32_sub_u); + in_wasm32_i64_atomic_rmw_sub: + second_atomic_rmw_x_y(a_i64_atomic_rmw_sub); + in_wasm32_i32_atomic_rmw8_and_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw8_and_u); + in_wasm32_i32_atomic_rmw16_and_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw16_and_u); + in_wasm32_i32_atomic_rmw_and: + second_atomic_rmw_x_y(a_i32_atomic_rmw_and); + in_wasm32_i64_atomic_rmw8_and_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw8_and_u); + in_wasm32_i64_atomic_rmw16_and_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw16_and_u); + in_wasm32_i64_atomic_rmw32_and_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw32_and_u); + in_wasm32_i64_atomic_rmw_and: + second_atomic_rmw_x_y(a_i64_atomic_rmw_and); + in_wasm32_i32_atomic_rmw8_or_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw8_or_u); + in_wasm32_i32_atomic_rmw16_or_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw16_or_u); + in_wasm32_i32_atomic_rmw_or: + second_atomic_rmw_x_y(a_i32_atomic_rmw_or); + in_wasm32_i64_atomic_rmw8_or_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw8_or_u); + in_wasm32_i64_atomic_rmw16_or_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw16_or_u); + in_wasm32_i64_atomic_rmw32_or_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw32_or_u); + in_wasm32_i64_atomic_rmw_or: + second_atomic_rmw_x_y(a_i64_atomic_rmw_or); + in_wasm32_i32_atomic_rmw8_xor_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw8_xor_u); + in_wasm32_i32_atomic_rmw16_xor_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw16_xor_u); + in_wasm32_i32_atomic_rmw_xor: + second_atomic_rmw_x_y(a_i32_atomic_rmw_xor); + in_wasm32_i64_atomic_rmw8_xor_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw8_xor_u); + in_wasm32_i64_atomic_rmw16_xor_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw16_xor_u); + in_wasm32_i64_atomic_rmw32_xor_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw32_xor_u); + in_wasm32_i64_atomic_rmw_xor: + second_atomic_rmw_x_y(a_i64_atomic_rmw_xor); + in_wasm32_i32_atomic_rmw8_xchg_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw8_xchg_u); + in_wasm32_i32_atomic_rmw16_xchg_u: + second_atomic_rmw_x_y(a_i32_atomic_rmw16_xchg_u); + in_wasm32_i32_atomic_rmw_xchg: + second_atomic_rmw_x_y(a_i32_atomic_rmw_xchg); + in_wasm32_i64_atomic_rmw8_xchg_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw8_xchg_u); + in_wasm32_i64_atomic_rmw16_xchg_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw16_xchg_u); + in_wasm32_i64_atomic_rmw32_xchg_u: + second_atomic_rmw_x_y(a_i64_atomic_rmw32_xchg_u); + in_wasm32_i64_atomic_rmw_xchg: + second_atomic_rmw_x_y(a_i64_atomic_rmw_xchg); else inherited pass_generate_code_cpu; end; diff --git a/rtl/wasm32/cpuh.inc b/rtl/wasm32/cpuh.inc index ba168b1ce9..3ec697a539 100644 --- a/rtl/wasm32/cpuh.inc +++ b/rtl/wasm32/cpuh.inc @@ -24,3 +24,52 @@ procedure fpc_wasm32_throw_fpcexception;[internproc:fpc_in_wasm32_throw_fpcexcep procedure fpc_wasm32_memory_fill(d,val,n: longword);[internproc:fpc_in_wasm32_memory_fill]; procedure fpc_wasm32_memory_copy(d,s,n: longword);[internproc:fpc_in_wasm32_memory_copy]; procedure fpc_wasm32_atomic_fence;[internproc:fpc_in_wasm32_atomic_fence]; + +function fpc_wasm32_i32_atomic_rmw8_add_u(Dest: PByte; x: Byte): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw8_add_u]; +function fpc_wasm32_i32_atomic_rmw16_add_u(Dest: PWord; x: Word): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw16_add_u]; +function fpc_wasm32_i32_atomic_rmw_add(Dest: PLongWord; x: LongWord): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw_add]; +function fpc_wasm32_i64_atomic_rmw8_add_u(Dest: PByte; x: Byte): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw8_add_u]; +function fpc_wasm32_i64_atomic_rmw16_add_u(Dest: PWord; x: Word): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw16_add_u]; +function fpc_wasm32_i64_atomic_rmw32_add_u(Dest: PLongWord; x: LongWord): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw_add]; +function fpc_wasm32_i64_atomic_rmw_add(Dest: PQWord; x: QWord): QWord;[internproc:fpc_in_wasm32_i64_atomic_rmw_add]; + +function fpc_wasm32_i32_atomic_rmw8_sub_u(Dest: PByte; x: Byte): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw8_sub_u]; +function fpc_wasm32_i32_atomic_rmw16_sub_u(Dest: PWord; x: Word): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw16_sub_u]; +function fpc_wasm32_i32_atomic_rmw_sub(Dest: PLongWord; x: LongWord): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw_sub]; +function fpc_wasm32_i64_atomic_rmw8_sub_u(Dest: PByte; x: Byte): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw8_sub_u]; +function fpc_wasm32_i64_atomic_rmw16_sub_u(Dest: PWord; x: Word): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw16_sub_u]; +function fpc_wasm32_i64_atomic_rmw32_sub_u(Dest: PLongWord; x: LongWord): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw_sub]; +function fpc_wasm32_i64_atomic_rmw_sub(Dest: PQWord; x: QWord): QWord;[internproc:fpc_in_wasm32_i64_atomic_rmw_sub]; + +function fpc_wasm32_i32_atomic_rmw8_and_u(Dest: PByte; x: Byte): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw8_and_u]; +function fpc_wasm32_i32_atomic_rmw16_and_u(Dest: PWord; x: Word): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw16_and_u]; +function fpc_wasm32_i32_atomic_rmw_and(Dest: PLongWord; x: LongWord): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw_and]; +function fpc_wasm32_i64_atomic_rmw8_and_u(Dest: PByte; x: Byte): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw8_and_u]; +function fpc_wasm32_i64_atomic_rmw16_and_u(Dest: PWord; x: Word): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw16_and_u]; +function fpc_wasm32_i64_atomic_rmw32_and_u(Dest: PLongWord; x: LongWord): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw_and]; +function fpc_wasm32_i64_atomic_rmw_and(Dest: PQWord; x: QWord): QWord;[internproc:fpc_in_wasm32_i64_atomic_rmw_and]; + +function fpc_wasm32_i32_atomic_rmw8_or_u(Dest: PByte; x: Byte): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw8_or_u]; +function fpc_wasm32_i32_atomic_rmw16_or_u(Dest: PWord; x: Word): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw16_or_u]; +function fpc_wasm32_i32_atomic_rmw_or(Dest: PLongWord; x: LongWord): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw_or]; +function fpc_wasm32_i64_atomic_rmw8_or_u(Dest: PByte; x: Byte): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw8_or_u]; +function fpc_wasm32_i64_atomic_rmw16_or_u(Dest: PWord; x: Word): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw16_or_u]; +function fpc_wasm32_i64_atomic_rmw32_or_u(Dest: PLongWord; x: LongWord): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw_or]; +function fpc_wasm32_i64_atomic_rmw_or(Dest: PQWord; x: QWord): QWord;[internproc:fpc_in_wasm32_i64_atomic_rmw_or]; + +function fpc_wasm32_i32_atomic_rmw8_xor_u(Dest: PByte; x: Byte): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw8_xor_u]; +function fpc_wasm32_i32_atomic_rmw16_xor_u(Dest: PWord; x: Word): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw16_xor_u]; +function fpc_wasm32_i32_atomic_rmw_xor(Dest: PLongWord; x: LongWord): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw_xor]; +function fpc_wasm32_i64_atomic_rmw8_xor_u(Dest: PByte; x: Byte): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw8_xor_u]; +function fpc_wasm32_i64_atomic_rmw16_xor_u(Dest: PWord; x: Word): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw16_xor_u]; +function fpc_wasm32_i64_atomic_rmw32_xor_u(Dest: PLongWord; x: LongWord): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw_xor]; +function fpc_wasm32_i64_atomic_rmw_xor(Dest: PQWord; x: QWord): QWord;[internproc:fpc_in_wasm32_i64_atomic_rmw_xor]; + +function fpc_wasm32_i32_atomic_rmw8_xchg_u(Dest: PByte; x: Byte): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw8_xchg_u]; +function fpc_wasm32_i32_atomic_rmw16_xchg_u(Dest: PWord; x: Word): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw16_xchg_u]; +function fpc_wasm32_i32_atomic_rmw_xchg(Dest: PLongWord; x: LongWord): longword;[internproc:fpc_in_wasm32_i32_atomic_rmw_xchg]; +function fpc_wasm32_i64_atomic_rmw8_xchg_u(Dest: PByte; x: Byte): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw8_xchg_u]; +function fpc_wasm32_i64_atomic_rmw16_xchg_u(Dest: PWord; x: Word): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw16_xchg_u]; +function fpc_wasm32_i64_atomic_rmw32_xchg_u(Dest: PLongWord; x: LongWord): qword;[internproc:fpc_in_wasm32_i64_atomic_rmw_xchg]; +function fpc_wasm32_i64_atomic_rmw_xchg(Dest: PQWord; x: QWord): QWord;[internproc:fpc_in_wasm32_i64_atomic_rmw_xchg]; + diff --git a/rtl/wasm32/cpuinnr.inc b/rtl/wasm32/cpuinnr.inc index b933382dbc..2bd0760ab5 100644 --- a/rtl/wasm32/cpuinnr.inc +++ b/rtl/wasm32/cpuinnr.inc @@ -19,3 +19,52 @@ fpc_in_wasm32_memory_copy = fpc_in_cpu_first+4; fpc_in_wasm32_memory_fill = fpc_in_cpu_first+5; fpc_in_wasm32_atomic_fence = fpc_in_cpu_first+6; + + fpc_in_wasm32_i32_atomic_rmw8_add_u = fpc_in_cpu_first+7; + fpc_in_wasm32_i32_atomic_rmw16_add_u = fpc_in_cpu_first+8; + fpc_in_wasm32_i32_atomic_rmw_add = fpc_in_cpu_first+9; + fpc_in_wasm32_i64_atomic_rmw8_add_u = fpc_in_cpu_first+10; + fpc_in_wasm32_i64_atomic_rmw16_add_u = fpc_in_cpu_first+11; + fpc_in_wasm32_i64_atomic_rmw32_add_u = fpc_in_cpu_first+12; + fpc_in_wasm32_i64_atomic_rmw_add = fpc_in_cpu_first+13; + + fpc_in_wasm32_i32_atomic_rmw8_sub_u = fpc_in_cpu_first+14; + fpc_in_wasm32_i32_atomic_rmw16_sub_u = fpc_in_cpu_first+15; + fpc_in_wasm32_i32_atomic_rmw_sub = fpc_in_cpu_first+16; + fpc_in_wasm32_i64_atomic_rmw8_sub_u = fpc_in_cpu_first+17; + fpc_in_wasm32_i64_atomic_rmw16_sub_u = fpc_in_cpu_first+18; + fpc_in_wasm32_i64_atomic_rmw32_sub_u = fpc_in_cpu_first+19; + fpc_in_wasm32_i64_atomic_rmw_sub = fpc_in_cpu_first+20; + + fpc_in_wasm32_i32_atomic_rmw8_and_u = fpc_in_cpu_first+21; + fpc_in_wasm32_i32_atomic_rmw16_and_u = fpc_in_cpu_first+22; + fpc_in_wasm32_i32_atomic_rmw_and = fpc_in_cpu_first+23; + fpc_in_wasm32_i64_atomic_rmw8_and_u = fpc_in_cpu_first+24; + fpc_in_wasm32_i64_atomic_rmw16_and_u = fpc_in_cpu_first+25; + fpc_in_wasm32_i64_atomic_rmw32_and_u = fpc_in_cpu_first+26; + fpc_in_wasm32_i64_atomic_rmw_and = fpc_in_cpu_first+27; + + fpc_in_wasm32_i32_atomic_rmw8_or_u = fpc_in_cpu_first+28; + fpc_in_wasm32_i32_atomic_rmw16_or_u = fpc_in_cpu_first+29; + fpc_in_wasm32_i32_atomic_rmw_or = fpc_in_cpu_first+30; + fpc_in_wasm32_i64_atomic_rmw8_or_u = fpc_in_cpu_first+31; + fpc_in_wasm32_i64_atomic_rmw16_or_u = fpc_in_cpu_first+32; + fpc_in_wasm32_i64_atomic_rmw32_or_u = fpc_in_cpu_first+33; + fpc_in_wasm32_i64_atomic_rmw_or = fpc_in_cpu_first+34; + + fpc_in_wasm32_i32_atomic_rmw8_xor_u = fpc_in_cpu_first+35; + fpc_in_wasm32_i32_atomic_rmw16_xor_u = fpc_in_cpu_first+36; + fpc_in_wasm32_i32_atomic_rmw_xor = fpc_in_cpu_first+37; + fpc_in_wasm32_i64_atomic_rmw8_xor_u = fpc_in_cpu_first+38; + fpc_in_wasm32_i64_atomic_rmw16_xor_u = fpc_in_cpu_first+39; + fpc_in_wasm32_i64_atomic_rmw32_xor_u = fpc_in_cpu_first+40; + fpc_in_wasm32_i64_atomic_rmw_xor = fpc_in_cpu_first+41; + + fpc_in_wasm32_i32_atomic_rmw8_xchg_u = fpc_in_cpu_first+42; + fpc_in_wasm32_i32_atomic_rmw16_xchg_u = fpc_in_cpu_first+43; + fpc_in_wasm32_i32_atomic_rmw_xchg = fpc_in_cpu_first+44; + fpc_in_wasm32_i64_atomic_rmw8_xchg_u = fpc_in_cpu_first+45; + fpc_in_wasm32_i64_atomic_rmw16_xchg_u = fpc_in_cpu_first+46; + fpc_in_wasm32_i64_atomic_rmw32_xchg_u = fpc_in_cpu_first+47; + fpc_in_wasm32_i64_atomic_rmw_xchg = fpc_in_cpu_first+48; +