Browse Source

+ support intrinsics for the WebAssembly memory.atomic.wait32 and memory.atomic.wait64 instructions

Nikolay Nikolov 3 years ago
parent
commit
86643710c4
4 changed files with 25 additions and 2 deletions
  1. 5 1
      compiler/wasm32/ccpuinnr.inc
  2. 13 1
      compiler/wasm32/nwasminl.pas
  3. 3 0
      rtl/wasm32/cpuh.inc
  4. 4 0
      rtl/wasm32/cpuinnr.inc

+ 5 - 1
compiler/wasm32/ccpuinnr.inc

@@ -74,5 +74,9 @@
   in_wasm32_i64_atomic_rmw8_cmpxchg_u  = in_cpu_first+52,
   in_wasm32_i64_atomic_rmw8_cmpxchg_u  = in_cpu_first+52,
   in_wasm32_i64_atomic_rmw16_cmpxchg_u = in_cpu_first+53,
   in_wasm32_i64_atomic_rmw16_cmpxchg_u = in_cpu_first+53,
   in_wasm32_i64_atomic_rmw32_cmpxchg_u = in_cpu_first+54,
   in_wasm32_i64_atomic_rmw32_cmpxchg_u = in_cpu_first+54,
-  in_wasm32_i64_atomic_rmw_cmpxchg     = in_cpu_first+55
+  in_wasm32_i64_atomic_rmw_cmpxchg     = in_cpu_first+55,
+
+  in_wasm32_memory_atomic_wait32 = in_cpu_first+56,
+  in_wasm32_memory_atomic_wait64 = in_cpu_first+57,
+  in_wasm32_memory_atomic_notify = in_cpu_first+58
 
 

+ 13 - 1
compiler/wasm32/nwasminl.pas

@@ -583,6 +583,12 @@ implementation
               CheckParameters(3);
               CheckParameters(3);
               resultdef:=u64inttype;
               resultdef:=u64inttype;
             end;
             end;
+          in_wasm32_memory_atomic_wait32,
+          in_wasm32_memory_atomic_wait64:
+            begin
+              CheckParameters(3);
+              resultdef:=s32inttype;
+            end;
           else
           else
             Result:=inherited pass_typecheck_cpu;
             Result:=inherited pass_typecheck_cpu;
         end;
         end;
@@ -650,7 +656,9 @@ implementation
           in_wasm32_i64_atomic_rmw8_cmpxchg_u,
           in_wasm32_i64_atomic_rmw8_cmpxchg_u,
           in_wasm32_i64_atomic_rmw16_cmpxchg_u,
           in_wasm32_i64_atomic_rmw16_cmpxchg_u,
           in_wasm32_i64_atomic_rmw32_cmpxchg_u,
           in_wasm32_i64_atomic_rmw32_cmpxchg_u,
-          in_wasm32_i64_atomic_rmw_cmpxchg:
+          in_wasm32_i64_atomic_rmw_cmpxchg,
+          in_wasm32_memory_atomic_wait32,
+          in_wasm32_memory_atomic_wait64:
             expectloc:=LOC_REGISTER;
             expectloc:=LOC_REGISTER;
           else
           else
             Result:=inherited first_cpu;
             Result:=inherited first_cpu;
@@ -773,6 +781,10 @@ implementation
             second_atomic_rmw_x_y_z(a_i64_atomic_rmw32_cmpxchg_u);
             second_atomic_rmw_x_y_z(a_i64_atomic_rmw32_cmpxchg_u);
           in_wasm32_i64_atomic_rmw_cmpxchg:
           in_wasm32_i64_atomic_rmw_cmpxchg:
             second_atomic_rmw_x_y_z(a_i64_atomic_rmw_cmpxchg);
             second_atomic_rmw_x_y_z(a_i64_atomic_rmw_cmpxchg);
+          in_wasm32_memory_atomic_wait32:
+            second_atomic_rmw_x_y_z(a_memory_atomic_wait32);
+          in_wasm32_memory_atomic_wait64:
+            second_atomic_rmw_x_y_z(a_memory_atomic_wait64);
           else
           else
             inherited pass_generate_code_cpu;
             inherited pass_generate_code_cpu;
         end;
         end;

+ 3 - 0
rtl/wasm32/cpuh.inc

@@ -81,3 +81,6 @@ function fpc_wasm32_i64_atomic_rmw16_cmpxchg_u(Dest: PWord; Expected, Replacemen
 function fpc_wasm32_i64_atomic_rmw32_cmpxchg_u(Dest: PWord; Expected, Replacement: QWord): QWord;[internproc:fpc_in_wasm32_i64_atomic_rmw32_cmpxchg_u];
 function fpc_wasm32_i64_atomic_rmw32_cmpxchg_u(Dest: PWord; Expected, Replacement: QWord): QWord;[internproc:fpc_in_wasm32_i64_atomic_rmw32_cmpxchg_u];
 function fpc_wasm32_i64_atomic_rmw_cmpxchg_u(Dest: PLongWord; Expected, Replacement: QWord): QWord;[internproc:fpc_in_wasm32_i64_atomic_rmw_cmpxchg];
 function fpc_wasm32_i64_atomic_rmw_cmpxchg_u(Dest: PLongWord; Expected, Replacement: QWord): QWord;[internproc:fpc_in_wasm32_i64_atomic_rmw_cmpxchg];
 
 
+function fpc_wasm32_memory_atomic_wait32(Dest: PLongWord; Expected: LongWord; Timeout: Int64): LongInt;[internproc:fpc_in_wasm32_memory_atomic_wait32];
+function fpc_wasm32_memory_atomic_wait64(Dest: PQWord; Expected: QWord; Timeout: Int64): LongInt;[internproc:fpc_in_wasm32_memory_atomic_wait64];
+

+ 4 - 0
rtl/wasm32/cpuinnr.inc

@@ -76,3 +76,7 @@
   fpc_in_wasm32_i64_atomic_rmw32_cmpxchg_u = fpc_in_cpu_first+54;
   fpc_in_wasm32_i64_atomic_rmw32_cmpxchg_u = fpc_in_cpu_first+54;
   fpc_in_wasm32_i64_atomic_rmw_cmpxchg     = fpc_in_cpu_first+55;
   fpc_in_wasm32_i64_atomic_rmw_cmpxchg     = fpc_in_cpu_first+55;
 
 
+  fpc_in_wasm32_memory_atomic_wait32 = fpc_in_cpu_first+56;
+  fpc_in_wasm32_memory_atomic_wait64 = fpc_in_cpu_first+57;
+  fpc_in_wasm32_memory_atomic_notify = fpc_in_cpu_first+58;
+