aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/intertyper.js17
-rw-r--r--src/jsifier.js14
2 files changed, 31 insertions, 0 deletions
diff --git a/src/intertyper.js b/src/intertyper.js
index 7bc23653..6b46cdbb 100644
--- a/src/intertyper.js
+++ b/src/intertyper.js
@@ -366,6 +366,8 @@ function intertyper(data, sidePass, baseLineNums) {
return '/dev/null';
if (tokensLength >= 3 && token0Text == 'invoke')
return 'Invoke';
+ if (tokensLength >= 3 && token0Text == 'atomicrmw' || token0Text == 'cmpxchg')
+ return 'Atomic';
} else {
// Already intertyped
if (item.parentSlot)
@@ -739,6 +741,21 @@ function intertyper(data, sidePass, baseLineNums) {
return result.ret;
}
});
+ substrate.addActor('Atomic', {
+ processItem: function(item) {
+ item.intertype = 'atomic';
+ if (item.tokens[0].text == 'atomicrmw') {
+ item.op = item.tokens[1].text;
+ item.tokens.splice(1, 1);
+ } else {
+ assert(item.tokens[0].text == 'cmpxchg')
+ item.op = 'cmpxchg';
+ }
+ var last = getTokenIndexByText(item.tokens, ';');
+ item.params = splitTokenList(item.tokens.slice(1, last)).map(parseLLVMSegment);
+ this.forwardItem(item, 'Reintegrator');
+ }
+ });
// 'landingpad' - just a stub implementation
substrate.addActor('Landingpad', {
processItem: function(item) {
diff --git a/src/jsifier.js b/src/jsifier.js
index db6936f6..69a64d1a 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -944,6 +944,20 @@ function JSify(data, functionsOnly, givenFunctions) {
+ ' } else { ' + getPhiSetsForLabel(phiSets, item.unwindLabel) + makeBranch(item.unwindLabel, item.currLabelId) + ' }';
return ret;
});
+ makeFuncLineActor('atomic', function(item) {
+ var type = item.params[0].type;
+ var param1 = finalizeLLVMParameter(item.params[0]);
+ var param2 = finalizeLLVMParameter(item.params[1]);
+ switch (item.op) {
+ case 'add': return '(tempValue=' + makeGetValue(param1, 0, type) + ',' + makeSetValue(param1, 0, 'tempValue+' + param2, type) + ',tempValue)';
+ case 'xchg': return '(tempValue=' + makeGetValue(param1, 0, type) + ',' + makeSetValue(param1, 0, param2, type) + ',tempValue)';
+ case 'cmpxchg': {
+ var param3 = finalizeLLVMParameter(item.params[2]);
+ return '(tempValue=' + makeGetValue(param1, 0, type) + ',(' + makeGetValue(param1, 0, type) + '==' + param2 + ' && (' + makeSetValue(param1, 0, param3, type) + ')),tempValue)';
+ }
+ default: throw 'unhandled atomic op: ' + item.op;
+ }
+ });
makeFuncLineActor('landingpad', function(item) {
// Just a stub
return '{ f0: ' + makeGetValue('_llvm_eh_exception.buf', '0', 'void*') +