Browse Source

+ 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.

Nikolay Nikolov 3 years ago
parent
commit
d8f06aa4f1
4 changed files with 356 additions and 3 deletions
  1. 49 1
      compiler/wasm32/ccpuinnr.inc
  2. 209 2
      compiler/wasm32/nwasminl.pas
  3. 49 0
      rtl/wasm32/cpuh.inc
  4. 49 0
      rtl/wasm32/cpuinnr.inc

+ 49 - 1
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
 

+ 209 - 2
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;

+ 49 - 0
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];
+

+ 49 - 0
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;
+