Add atomic built-ins (#440)

This commit is contained in:
Nidin Vinayakan
2019-02-07 15:25:49 +01:00
committed by Daniel Wirtz
parent 41a89fa773
commit 7ce3296b5e
3 changed files with 614 additions and 3 deletions

View File

@ -43,6 +43,20 @@
@builtin export declare function call_indirect<T>(target: void, ...args: void[]): T;
@builtin export declare function instantiate<T>(...args: void[]): T;
export namespace Atomic {
@builtin export declare function load<T>(offset: usize, constantOffset?: usize): T;
@builtin export declare function store<T>(offset: usize, value: void, constantOffset?: usize): void;
@builtin export declare function add<T>(ptr: usize, value: T, constantOffset?: usize): T;
@builtin export declare function sub<T>(ptr: usize, value: T, constantOffset?: usize): T;
@builtin export declare function and<T>(ptr: usize, value: T, constantOffset?: usize): T;
@builtin export declare function or<T>(ptr: usize, value: T, constantOffset?: usize): T;
@builtin export declare function xor<T>(ptr: usize, value: T, constantOffset?: usize): T;
@builtin export declare function xchg<T>(ptr: usize, value: T, constantOffset?: usize): T;
@builtin export declare function cmpxchg<T>(ptr: usize, expected:T, replacement: T, constantOffset?: usize): T;
@builtin export declare function wait<T>(ptr: usize, expected:T, timeout:i64): i32;
@builtin export declare function notify<T>(ptr: usize, count: u32): u32;
}
@builtin export declare function i8(value: void): i8;
export namespace i8 {
export const MIN_VALUE: i8 = -128;
@ -73,6 +87,49 @@ export namespace i32 {
@builtin export declare function store8(offset: usize, value: i32, constantOffset?: usize): void;
@builtin export declare function store16(offset: usize, value: i32, constantOffset?: usize): void;
@builtin export declare function store(offset: usize, value: i32, constantOffset?: usize): void;
namespace atomic {
@builtin export declare function load8_s(offset: usize, constantOffset?: usize): i32;
@builtin export declare function load8_u(offset: usize, constantOffset?: usize): i32;
@builtin export declare function load16_s(offset: usize, constantOffset?: usize): i32;
@builtin export declare function load16_u(offset: usize, constantOffset?: usize): i32;
@builtin export declare function load(offset: usize, constantOffset?: usize): i32;
@builtin export declare function store8(offset: usize, value: i32, constantOffset?: usize): void;
@builtin export declare function store16(offset: usize, value: i32, constantOffset?: usize): void;
@builtin export declare function store(offset: usize, value: i32, constantOffset?: usize): void;
@builtin export declare function wait(ptr: usize, expected:i32, timeout:i64): i32;
@builtin export declare function notify(ptr: usize, count:u32): u32;
namespace rmw8_u {
@builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;
}
namespace rmw16_u {
@builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;
}
namespace rmw {
@builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32
@builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;
}
}
}
@builtin export declare function i64(value: void): i64;
@ -96,6 +153,59 @@ export namespace i64 {
@builtin export declare function store16(offset: usize, value: i64, constantOffset?: usize): void;
@builtin export declare function store32(offset: usize, value: i64, constantOffset?: usize): void;
@builtin export declare function store(offset: usize, value: i64, constantOffset?: usize): void;
namespace atomic {
@builtin export declare function load8_s(offset: usize, constantOffset?: usize): i64;
@builtin export declare function load8_u(offset: usize, constantOffset?: usize): i64;
@builtin export declare function load16_s(offset: usize, constantOffset?: usize): i64;
@builtin export declare function load16_u(offset: usize, constantOffset?: usize): i64;
@builtin export declare function load(offset: usize, constantOffset?: usize): i64;
@builtin export declare function store8(offset: usize, value: i64, constantOffset?: usize): void;
@builtin export declare function store16(offset: usize, value: i64, constantOffset?: usize): void;
@builtin export declare function store(offset: usize, value: i64, constantOffset?: usize): void;
@builtin export declare function wait(ptr: usize, expected:i64, timeout:i64): i32;
@builtin export declare function notify(ptr: usize, count:u32): u32;
namespace rmw8_u {
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;
}
namespace rmw16_u {
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;
}
namespace rmw32_u {
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;
}
namespace rmw {
@builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;
}
}
}
@builtin export declare function isize(value: void): isize;