diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-04-21 12:18:21 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-04-21 12:18:21 -0700 |
commit | cc6a068830f3800185fbe68c6777f5013248feb2 (patch) | |
tree | a7839513d7ee75b2028ba62b3d44e0ca29b4f286 /src | |
parent | 9177722be399ead9f3699cc123e191b29c7c6195 (diff) |
support extraction of i64 values in ta2, and partial support for llvm_uadd_with_overflow_i64
Diffstat (limited to 'src')
-rw-r--r-- | src/jsifier.js | 11 | ||||
-rw-r--r-- | src/library.js | 9 |
2 files changed, 19 insertions, 1 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index 70fe0991..592433e1 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -1030,7 +1030,16 @@ function JSify(data, functionsOnly, givenFunctions) { makeFuncLineActor('extractvalue', function(item) { assert(item.indexes.length == 1); // TODO: use getelementptr parsing stuff, for depth. For now, we assume that LLVM aggregates are flat, // and we emulate them using simple JS objects { f1: , f2: , } etc., for speed - return item.ident + '.f' + item.indexes[0][0].text; + var index = item.indexes[0][0].text; + var valueType = Types.types[item.type].fields[index]; + if (USE_TYPED_ARRAYS != 2 || valueType != 'i64') { + return item.ident + '.f' + index; + } else { + var assignTo = item.assignTo; + item.assignTo = null; + return 'var ' + assignTo + '$0 = ' + item.ident + '.f' + index + '[0];' + + 'var ' + assignTo + '$1 = ' + item.ident + '.f' + index + '[1];'; + } }); makeFuncLineActor('insertvalue', function(item) { assert(item.indexes.length == 1); // TODO: see extractvalue diff --git a/src/library.js b/src/library.js index cead2bf8..2c1bb373 100644 --- a/src/library.js +++ b/src/library.js @@ -4703,6 +4703,15 @@ LibraryManager.library = { }; }, + llvm_uadd_with_overflow_i64__deps: [function() { preciseI64MathUsed = 1 }], + llvm_uadd_with_overflow_i64: function(xl, xh, yl, yh) { + i64Math.add(xl, xh, yl, yh); + return { + f0: i64Math.result, + f1: 0 // XXX Need to hack support for this in long.js + }; + }, + llvm_stacksave: function() { var self = _llvm_stacksave; if (!self.LLVM_SAVEDSTACKS) { |