Skip to content

Commit 07c5475

Browse files
dcodeIOkripken
authored andcommitted
Add atomic load/store to binaryen-c/.js (#1298)
1 parent a6c4f10 commit 07c5475

File tree

8 files changed

+1659
-425
lines changed

8 files changed

+1659
-425
lines changed

bin/binaryen.js

Lines changed: 757 additions & 247 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bin/wasm.js

Lines changed: 721 additions & 177 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build-js.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,8 @@ export_function "_BinaryenReturn"
343343
export_function "_BinaryenHost"
344344
export_function "_BinaryenNop"
345345
export_function "_BinaryenUnreachable"
346+
export_function "_BinaryenAtomicLoad"
347+
export_function "_BinaryenAtomicStore"
346348
export_function "_BinaryenAtomicRMW"
347349
export_function "_BinaryenAtomicCmpxchg"
348350
export_function "_BinaryenAtomicWait"

src/binaryen-c.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,26 @@ BinaryenExpressionRef BinaryenUnreachable(BinaryenModuleRef module) {
732732

733733
return static_cast<Expression*>(ret);
734734
}
735+
BinaryenExpressionRef BinaryenAtomicLoad(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, BinaryenType type, BinaryenExpressionRef ptr) {
736+
auto* ret = Builder(*((Module*)module)).makeAtomicLoad(bytes, offset, (Expression*)ptr, WasmType(type));
737+
738+
if (tracing) {
739+
auto id = noteExpression(ret);
740+
std::cout << " expressions[" << id << "] = BinaryenAtomicLoad(the_module, " << bytes << ", " << offset << ", " << type << ", expressions[" << expressions[ptr] << "]);\n";
741+
}
742+
743+
return static_cast<Expression*>(ret);
744+
}
745+
BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type) {
746+
auto* ret = Builder(*((Module*)module)).makeAtomicStore(bytes, offset, (Expression*)ptr, (Expression*)value, WasmType(type));
747+
748+
if (tracing) {
749+
auto id = noteExpression(ret);
750+
std::cout << " expressions[" << id << "] = BinaryenAtomicStore(the_module, " << bytes << ", " << offset << ", expressions[" << expressions[ptr] << "], expressions[" << expressions[value] << "], " << type << ");\n";
751+
}
752+
753+
return static_cast<Expression*>(ret);
754+
}
735755
BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module, BinaryenOp op, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type) {
736756
auto* ret = Builder(*((Module*)module)).makeAtomicRMW(AtomicRMWOp(op), bytes, offset, (Expression*)ptr, (Expression*)value, WasmType(type));
737757

@@ -1102,7 +1122,9 @@ int BinaryenModuleValidate(BinaryenModuleRef module) {
11021122
}
11031123

11041124
Module* wasm = (Module*)module;
1105-
return WasmValidator().validate(*wasm) ? 1 : 0;
1125+
// TODO add feature selection support to C API
1126+
FeatureSet features = Feature::Atomics;
1127+
return WasmValidator().validate(*wasm, features) ? 1 : 0;
11061128
}
11071129

11081130
void BinaryenModuleOptimize(BinaryenModuleRef module) {

src/binaryen-c.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,8 @@ BinaryenExpressionRef BinaryenReturn(BinaryenModuleRef module, BinaryenExpressio
360360
BinaryenExpressionRef BinaryenHost(BinaryenModuleRef module, BinaryenOp op, const char* name, BinaryenExpressionRef* operands, BinaryenIndex numOperands);
361361
BinaryenExpressionRef BinaryenNop(BinaryenModuleRef module);
362362
BinaryenExpressionRef BinaryenUnreachable(BinaryenModuleRef module);
363+
BinaryenExpressionRef BinaryenAtomicLoad(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, BinaryenType type, BinaryenExpressionRef ptr);
364+
BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module, uint32_t bytes, uint32_t offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type);
363365
BinaryenExpressionRef BinaryenAtomicRMW(BinaryenModuleRef module, BinaryenOp op, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef value, BinaryenType type);
364366
BinaryenExpressionRef BinaryenAtomicCmpxchg(BinaryenModuleRef module, BinaryenIndex bytes, BinaryenIndex offset, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef replacement, BinaryenType type);
365367
BinaryenExpressionRef BinaryenAtomicWait(BinaryenModuleRef module, BinaryenExpressionRef ptr, BinaryenExpressionRef expected, BinaryenExpressionRef timeout, BinaryenType type);

src/js/binaryen.js-post.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,24 @@
429429
return Module['_BinaryenBinary'](module, Module['GeUInt32'], left, right);
430430
},
431431
'atomic':{
432+
'load': function(offset, ptr) {
433+
return Module['_BinaryenAtomicLoad'](module, 4, offset, Module['i32'], ptr);
434+
},
435+
'load8_u': function(offset, ptr) {
436+
return Module['_BinaryenAtomicLoad'](module, 1, offset, Module['i32'], ptr);
437+
},
438+
'load16_u': function(offset, ptr) {
439+
return Module['_BinaryenAtomicLoad'](module, 2, offset, Module['i32'], ptr);
440+
},
441+
'store': function(offset, ptr, value) {
442+
return Module['_BinaryenAtomicStore'](module, 4, offset, ptr, value, Module['i32']);
443+
},
444+
'store8': function(offset, ptr, value) {
445+
return Module['_BinaryenAtomicStore'](module, 1, offset, ptr, value, Module['i32']);
446+
},
447+
'store16': function(offset, ptr, value) {
448+
return Module['_BinaryenAtomicStore'](module, 2, offset, ptr, value, Module['i32']);
449+
},
432450
'rmw': {
433451
'add': function(offset, ptr, value) {
434452
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAdd'], 4, offset, ptr, value, Module['i32']);
@@ -655,6 +673,30 @@
655673
return Module['_BinaryenBinary'](module, Module['GeUInt64'], left, right);
656674
},
657675
'atomic':{
676+
'load': function(offset, ptr) {
677+
return Module['_BinaryenAtomicLoad'](module, 8, offset, Module['i64'], ptr);
678+
},
679+
'load8_u': function(offset, ptr) {
680+
return Module['_BinaryenAtomicLoad'](module, 1, offset, Module['i64'], ptr);
681+
},
682+
'load16_u': function(offset, ptr) {
683+
return Module['_BinaryenAtomicLoad'](module, 2, offset, Module['i64'], ptr);
684+
},
685+
'load32_u': function(offset, ptr) {
686+
return Module['_BinaryenAtomicLoad'](module, 4, offset, Module['i64'], ptr);
687+
},
688+
'store': function(offset, ptr, value) {
689+
return Module['_BinaryenAtomicStore'](module, 8, offset, ptr, value, Module['i64']);
690+
},
691+
'store8': function(offset, ptr, value) {
692+
return Module['_BinaryenAtomicStore'](module, 1, offset, ptr, value, Module['i64']);
693+
},
694+
'store16': function(offset, ptr, value) {
695+
return Module['_BinaryenAtomicStore'](module, 2, offset, ptr, value, Module['i64']);
696+
},
697+
'store32': function(offset, ptr, value) {
698+
return Module['_BinaryenAtomicStore'](module, 4, offset, ptr, value, Module['i64']);
699+
},
658700
'rmw': {
659701
'add': function(offset, ptr, value) {
660702
return Module['_BinaryenAtomicRMW'](module, Module['AtomicRMWAdd'], 8, offset, ptr, value, Module['i64']);

test/binaryen.js/atomics.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
var module = Binaryen.parseText(`
2+
(module
3+
(memory $0 (shared 1 1))
4+
)
5+
`);
6+
7+
var signature = module.addFunctionType("v", Binaryen.none, []);
8+
9+
// i32/i64.atomic.load/store
10+
module.addFunction("main", signature, [], module.block("", [
11+
// i32
12+
module.i32.atomic.store(0,
13+
module.i32.const(0),
14+
module.i32.atomic.load(0,
15+
module.i32.const(0)
16+
)
17+
),
18+
// i32 as u8
19+
module.i32.atomic.store8(0,
20+
module.i32.const(0),
21+
module.i32.atomic.load8_u(0,
22+
module.i32.const(0)
23+
)
24+
),
25+
// i32 as u16
26+
module.i32.atomic.store16(0,
27+
module.i32.const(0),
28+
module.i32.atomic.load16_u(0,
29+
module.i32.const(0)
30+
)
31+
),
32+
// i64
33+
module.i64.atomic.store(0,
34+
module.i32.const(0),
35+
module.i64.atomic.load(0,
36+
module.i32.const(0)
37+
)
38+
),
39+
// i64 as u8
40+
module.i64.atomic.store8(0,
41+
module.i32.const(0),
42+
module.i64.atomic.load8_u(0,
43+
module.i32.const(0)
44+
)
45+
),
46+
// i64 as u16
47+
module.i64.atomic.store16(0,
48+
module.i32.const(0),
49+
module.i64.atomic.load16_u(0,
50+
module.i32.const(0)
51+
)
52+
),
53+
// i64 as u32
54+
module.i64.atomic.store32(0,
55+
module.i32.const(0),
56+
module.i64.atomic.load32_u(0,
57+
module.i32.const(0)
58+
)
59+
)
60+
]));
61+
62+
module.validate();
63+
console.log(module.emitText());

test/binaryen.js/atomics.js.txt

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
(module
2+
(type $v (func))
3+
(memory $0 (shared 1 1))
4+
(func $main (; 0 ;) (type $v)
5+
(i32.atomic.store
6+
(i32.const 0)
7+
(i32.atomic.load
8+
(i32.const 0)
9+
)
10+
)
11+
(i32.atomic.store8
12+
(i32.const 0)
13+
(i32.atomic.load8_u
14+
(i32.const 0)
15+
)
16+
)
17+
(i32.atomic.store16
18+
(i32.const 0)
19+
(i32.atomic.load16_u
20+
(i32.const 0)
21+
)
22+
)
23+
(i64.atomic.store
24+
(i32.const 0)
25+
(i64.atomic.load
26+
(i32.const 0)
27+
)
28+
)
29+
(i64.atomic.store8
30+
(i32.const 0)
31+
(i64.atomic.load8_u
32+
(i32.const 0)
33+
)
34+
)
35+
(i64.atomic.store16
36+
(i32.const 0)
37+
(i64.atomic.load16_u
38+
(i32.const 0)
39+
)
40+
)
41+
(i64.atomic.store32
42+
(i32.const 0)
43+
(i64.atomic.load32_u
44+
(i32.const 0)
45+
)
46+
)
47+
)
48+
)
49+

0 commit comments

Comments
 (0)