Skip to content

Commit 8e5b9c7

Browse files
authored
Add atomic definitions (AssemblyScript#524)
1 parent f3aa762 commit 8e5b9c7

File tree

11 files changed

+1884
-400
lines changed

11 files changed

+1884
-400
lines changed

src/ast.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1350,6 +1350,26 @@ export class CallExpression extends Expression {
13501350
typeArguments: CommonTypeNode[] | null;
13511351
/** Provided arguments. */
13521352
arguments: Expression[];
1353+
1354+
/** Gets the type arguments range for reporting. */
1355+
get typeArgumentsRange(): Range {
1356+
var typeArguments = this.typeArguments;
1357+
var numTypeArguments: i32;
1358+
if (typeArguments && (numTypeArguments = typeArguments.length)) {
1359+
return Range.join(typeArguments[0].range, typeArguments[numTypeArguments - 1].range);
1360+
}
1361+
return this.expression.range;
1362+
}
1363+
1364+
/** Gets the arguments range for reporting. */
1365+
get argumentsRange(): Range {
1366+
var args = this.arguments;
1367+
var numArguments = args.length;
1368+
if (numArguments) {
1369+
return Range.join(args[0].range, args[numArguments - 1].range);
1370+
}
1371+
return this.expression.range;
1372+
}
13531373
}
13541374

13551375
/** Represents a class expression using the 'class' keyword. */

src/builtins.ts

Lines changed: 291 additions & 312 deletions
Large diffs are not rendered by default.

src/compiler.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,8 @@ export class Compiler extends DiagnosticEmitter {
411411
isSharedMemory ? options.sharedMemory : Module.UNLIMITED_MEMORY,
412412
this.memorySegments,
413413
options.target,
414-
"memory"
414+
"memory",
415+
isSharedMemory
415416
);
416417

417418
// import memory if requested (default memory is named '0' by Binaryen)

std/assembly/builtins.ts

Lines changed: 64 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,24 @@
4848

4949
export namespace atomic {
5050
@builtin export declare function load<T>(offset: usize, immOffset?: usize): T;
51-
@builtin export declare function store<T>(offset: usize, value: void, immOffset?: usize): void;
51+
@builtin export declare function store<T>(offset: usize, value: T, immOffset?: usize): void;
5252
@builtin export declare function add<T>(ptr: usize, value: T, immOffset?: usize): T;
5353
@builtin export declare function sub<T>(ptr: usize, value: T, immOffset?: usize): T;
5454
@builtin export declare function and<T>(ptr: usize, value: T, immOffset?: usize): T;
5555
@builtin export declare function or<T>(ptr: usize, value: T, immOffset?: usize): T;
5656
@builtin export declare function xor<T>(ptr: usize, value: T, immOffset?: usize): T;
5757
@builtin export declare function xchg<T>(ptr: usize, value: T, immOffset?: usize): T;
58-
@builtin export declare function cmpxchg<T>(ptr: usize, expected:T, replacement: T, immOffset?: usize): T;
59-
@builtin export declare function wait<T>(ptr: usize, expected:T, timeout:i64): i32;
58+
@builtin export declare function cmpxchg<T>(ptr: usize, expected: T, replacement: T, immOffset?: usize): T;
59+
@builtin export declare function wait<T>(ptr: usize, expected: T, timeout: i64): AtomicWaitResult;
6060
@builtin export declare function notify<T>(ptr: usize, count: u32): u32;
6161
}
6262

63+
@lazy export const enum AtomicWaitResult {
64+
OK = 0,
65+
NOT_EQUAL = 1,
66+
TIMED_OUT = 2
67+
}
68+
6369
@builtin export declare function i8(value: void): i8;
6470
export namespace i8 {
6571
@lazy export const MIN_VALUE: i8 = -128;
@@ -92,45 +98,41 @@ export namespace i32 {
9298
@builtin export declare function store(offset: usize, value: i32, immOffset?: usize, immAlign?: usize): void;
9399

94100
export namespace atomic {
95-
@builtin export declare function load8_s(offset: usize, immOffset?: usize): i32;
96101
@builtin export declare function load8_u(offset: usize, immOffset?: usize): i32;
97-
@builtin export declare function load16_s(offset: usize, immOffset?: usize): i32;
98102
@builtin export declare function load16_u(offset: usize, immOffset?: usize): i32;
99103
@builtin export declare function load(offset: usize, immOffset?: usize): i32;
100104
@builtin export declare function store8(offset: usize, value: i32, immOffset?: usize): void;
101105
@builtin export declare function store16(offset: usize, value: i32, immOffset?: usize): void;
102106
@builtin export declare function store(offset: usize, value: i32, immOffset?: usize): void;
103-
@builtin export declare function wait(ptr: usize, expected:i32, timeout:i64): i32;
104-
@builtin export declare function notify(ptr: usize, count:u32): u32;
105-
106-
export namespace rmw8_u {
107-
@builtin export declare function add(offset: usize, value: i32, immOffset?: usize): i32;
108-
@builtin export declare function sub(offset: usize, value: i32, immOffset?: usize): i32;
109-
@builtin export declare function and(offset: usize, value: i32, immOffset?: usize): i32;
110-
@builtin export declare function or(offset: usize, value: i32, immOffset?: usize): i32;
111-
@builtin export declare function xor(offset: usize, value: i32, immOffset?: usize): i32;
112-
@builtin export declare function xchg(offset: usize, value: i32, immOffset?: usize): i32;
113-
@builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, immOffset?: usize): i32;
107+
@builtin export declare function wait(ptr: usize, expected: i32, timeout: i64): AtomicWaitResult;
108+
@builtin export declare function notify(ptr: usize, count: i32): i32;
109+
110+
export namespace rmw8 {
111+
@builtin export declare function add_u(offset: usize, value: i32, immOffset?: usize): i32;
112+
@builtin export declare function sub_u(offset: usize, value: i32, immOffset?: usize): i32;
113+
@builtin export declare function and_u(offset: usize, value: i32, immOffset?: usize): i32;
114+
@builtin export declare function or_u(offset: usize, value: i32, immOffset?: usize): i32;
115+
@builtin export declare function xor_u(offset: usize, value: i32, immOffset?: usize): i32;
116+
@builtin export declare function xchg_u(offset: usize, value: i32, immOffset?: usize): i32;
117+
@builtin export declare function cmpxchg_u(offset: usize, expected: i32, replacement: i32, immOffset?: usize): i32;
114118
}
115-
116-
export namespace rmw16_u {
117-
@builtin export declare function add(offset: usize, value: i32, immOffset?: usize): i32;
118-
@builtin export declare function sub(offset: usize, value: i32, immOffset?: usize): i32;
119-
@builtin export declare function and(offset: usize, value: i32, immOffset?: usize): i32;
120-
@builtin export declare function or(offset: usize, value: i32, immOffset?: usize): i32;
121-
@builtin export declare function xor(offset: usize, value: i32, immOffset?: usize): i32;
122-
@builtin export declare function xchg(offset: usize, value: i32, immOffset?: usize): i32;
123-
@builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, immOffset?: usize): i32;
119+
export namespace rmw16 {
120+
@builtin export declare function add_u(offset: usize, value: i32, immOffset?: usize): i32;
121+
@builtin export declare function sub_u(offset: usize, value: i32, immOffset?: usize): i32;
122+
@builtin export declare function and_u(offset: usize, value: i32, immOffset?: usize): i32;
123+
@builtin export declare function or_u(offset: usize, value: i32, immOffset?: usize): i32;
124+
@builtin export declare function xor_u(offset: usize, value: i32, immOffset?: usize): i32;
125+
@builtin export declare function xchg_u(offset: usize, value: i32, immOffset?: usize): i32;
126+
@builtin export declare function cmpxchg_u(offset: usize, expected: i32, replacement: i32, immOffset?: usize): i32;
124127
}
125-
126128
export namespace rmw {
127129
@builtin export declare function add(offset: usize, value: i32, immOffset?: usize): i32;
128130
@builtin export declare function sub(offset: usize, value: i32, immOffset?: usize): i32;
129131
@builtin export declare function and(offset: usize, value: i32, immOffset?: usize): i32;
130132
@builtin export declare function or(offset: usize, value: i32, immOffset?: usize): i32;
131133
@builtin export declare function xor(offset: usize, value: i32, immOffset?: usize): i32;
132134
@builtin export declare function xchg(offset: usize, value: i32, immOffset?: usize): i32;
133-
@builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, immOffset?: usize): i32;
135+
@builtin export declare function cmpxchg(offset: usize, expected: i32, replacement: i32, immOffset?: usize): i32;
134136
}
135137
}
136138
}
@@ -142,11 +144,11 @@ export namespace i64 {
142144
@builtin export declare function clz(value: i64): i64;
143145
@builtin export declare function ctz(value: i64): i64;
144146
@builtin export declare function load8_s(offset: usize, immOffset?: usize, immAlign?: usize): i64;
145-
@builtin export declare function load8_u(offset: usize, immOffset?: usize, immAlign?: usize): u64;
147+
@builtin export declare function load8_u(offset: usize, immOffset?: usize, immAlign?: usize): i64;
146148
@builtin export declare function load16_s(offset: usize, immOffset?: usize, immAlign?: usize): i64;
147-
@builtin export declare function load16_u(offset: usize, immOffset?: usize, immAlign?: usize): u64;
149+
@builtin export declare function load16_u(offset: usize, immOffset?: usize, immAlign?: usize): i64;
148150
@builtin export declare function load32_s(offset: usize, immOffset?: usize, immAlign?: usize): i64;
149-
@builtin export declare function load32_u(offset: usize, immOffset?: usize, immAlign?: usize): u64;
151+
@builtin export declare function load32_u(offset: usize, immOffset?: usize, immAlign?: usize): i64;
150152
@builtin export declare function load(offset: usize, immOffset?: usize): i64;
151153
@builtin export declare function popcnt(value: i64): i64;
152154
@builtin export declare function rotl(value: i64, shift: i64): i64;
@@ -157,58 +159,55 @@ export namespace i64 {
157159
@builtin export declare function store32(offset: usize, value: i64, immOffset?: usize, immAlign?: usize): void;
158160
@builtin export declare function store(offset: usize, value: i64, immOffset?: usize, immAlign?: usize): void;
159161

160-
namespace atomic {
161-
@builtin export declare function load8_s(offset: usize, immOffset?: usize): i64;
162+
export namespace atomic {
162163
@builtin export declare function load8_u(offset: usize, immOffset?: usize): i64;
163-
@builtin export declare function load16_s(offset: usize, immOffset?: usize): i64;
164164
@builtin export declare function load16_u(offset: usize, immOffset?: usize): i64;
165+
@builtin export declare function load32_u(offset: usize, immOffset?: usize): i64;
165166
@builtin export declare function load(offset: usize, immOffset?: usize): i64;
166167
@builtin export declare function store8(offset: usize, value: i64, immOffset?: usize): void;
167168
@builtin export declare function store16(offset: usize, value: i64, immOffset?: usize): void;
169+
@builtin export declare function store32(offset: usize, value: i64, immOffset?: usize): void;
168170
@builtin export declare function store(offset: usize, value: i64, immOffset?: usize): void;
169-
@builtin export declare function wait(ptr: usize, expected:i64, timeout:i64): i32;
170-
@builtin export declare function notify(ptr: usize, count:u32): u32;
171-
172-
export namespace rmw8_u {
173-
@builtin export declare function add(offset: usize, value: i64, immOffset?: usize): i64;
174-
@builtin export declare function sub(offset: usize, value: i64, immOffset?: usize): i64;
175-
@builtin export declare function and(offset: usize, value: i64, immOffset?: usize): i64;
176-
@builtin export declare function or(offset: usize, value: i64, immOffset?: usize): i64;
177-
@builtin export declare function xor(offset: usize, value: i64, immOffset?: usize): i64;
178-
@builtin export declare function xchg(offset: usize, value: i64, immOffset?: usize): i64;
179-
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, immOffset?: usize): i64;
171+
@builtin export declare function wait(ptr: usize, expected: i64, timeout: i64): AtomicWaitResult;
172+
@builtin export declare function notify(ptr: usize, count: i32): i32;
173+
174+
export namespace rmw8 {
175+
@builtin export declare function add_u(offset: usize, value: i64, immOffset?: usize): i64;
176+
@builtin export declare function sub_u(offset: usize, value: i64, immOffset?: usize): i64;
177+
@builtin export declare function and_u(offset: usize, value: i64, immOffset?: usize): i64;
178+
@builtin export declare function or_u(offset: usize, value: i64, immOffset?: usize): i64;
179+
@builtin export declare function xor_u(offset: usize, value: i64, immOffset?: usize): i64;
180+
@builtin export declare function xchg_u(offset: usize, value: i64, immOffset?: usize): i64;
181+
@builtin export declare function cmpxchg_u(offset: usize, expected: i64, replacement: i64, immOffset?: usize): i64;
180182
}
181-
182-
export namespace rmw16_u {
183-
@builtin export declare function add(offset: usize, value: i64, immOffset?: usize): i64;
184-
@builtin export declare function sub(offset: usize, value: i64, immOffset?: usize): i64;
185-
@builtin export declare function and(offset: usize, value: i64, immOffset?: usize): i64;
186-
@builtin export declare function or(offset: usize, value: i64, immOffset?: usize): i64;
187-
@builtin export declare function xor(offset: usize, value: i64, immOffset?: usize): i64;
188-
@builtin export declare function xchg(offset: usize, value: i64, immOffset?: usize): i64;
189-
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, immOffset?: usize): i64;
183+
export namespace rmw16 {
184+
@builtin export declare function add_u(offset: usize, value: i64, immOffset?: usize): i64;
185+
@builtin export declare function sub_u(offset: usize, value: i64, immOffset?: usize): i64;
186+
@builtin export declare function and_u(offset: usize, value: i64, immOffset?: usize): i64;
187+
@builtin export declare function or_u(offset: usize, value: i64, immOffset?: usize): i64;
188+
@builtin export declare function xor_u(offset: usize, value: i64, immOffset?: usize): i64;
189+
@builtin export declare function xchg_u(offset: usize, value: i64, immOffset?: usize): i64;
190+
@builtin export declare function cmpxchg_u(offset: usize, expected: i64, replacement: i64, immOffset?: usize): i64;
190191
}
191-
192-
export namespace rmw32_u {
193-
@builtin export declare function add(offset: usize, value: i64, immOffset?: usize): i64;
194-
@builtin export declare function sub(offset: usize, value: i64, immOffset?: usize): i64;
195-
@builtin export declare function and(offset: usize, value: i64, immOffset?: usize): i64;
196-
@builtin export declare function or(offset: usize, value: i64, immOffset?: usize): i64;
197-
@builtin export declare function xor(offset: usize, value: i64, immOffset?: usize): i64;
198-
@builtin export declare function xchg(offset: usize, value: i64, immOffset?: usize): i64;
199-
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, immOffset?: usize): i64;
192+
export namespace rmw32 {
193+
@builtin export declare function add_u(offset: usize, value: i64, immOffset?: usize): i64;
194+
@builtin export declare function sub_u(offset: usize, value: i64, immOffset?: usize): i64;
195+
@builtin export declare function and_u(offset: usize, value: i64, immOffset?: usize): i64;
196+
@builtin export declare function or_u(offset: usize, value: i64, immOffset?: usize): i64;
197+
@builtin export declare function xor_u(offset: usize, value: i64, immOffset?: usize): i64;
198+
@builtin export declare function xchg_u(offset: usize, value: i64, immOffset?: usize): i64;
199+
@builtin export declare function cmpxchg_u(offset: usize, expected: i64, replacement: i64, immOffset?: usize): i64;
200200
}
201-
202201
export namespace rmw {
203202
@builtin export declare function add(offset: usize, value: i64, immOffset?: usize): i64;
204203
@builtin export declare function sub(offset: usize, value: i64, immOffset?: usize): i64;
205204
@builtin export declare function and(offset: usize, value: i64, immOffset?: usize): i64;
206205
@builtin export declare function or(offset: usize, value: i64, immOffset?: usize): i64;
207206
@builtin export declare function xor(offset: usize, value: i64, immOffset?: usize): i64;
208207
@builtin export declare function xchg(offset: usize, value: i64, immOffset?: usize): i64;
209-
@builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, immOffset?: usize): i64;
208+
@builtin export declare function cmpxchg(offset: usize, expected: i64, replacement: i64, immOffset?: usize): i64;
210209
}
211-
}
210+
}
212211
}
213212

214213
@builtin export declare function isize(value: void): isize;

0 commit comments

Comments
 (0)