aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/analyzer.js22
-rw-r--r--tests/cases/legalizer_ta2.ll11
-rw-r--r--tests/cases/legalizer_ta2.txt1
3 files changed, 30 insertions, 4 deletions
diff --git a/src/analyzer.js b/src/analyzer.js
index 67c6aabf..7eca1d5a 100644
--- a/src/analyzer.js
+++ b/src/analyzer.js
@@ -257,9 +257,28 @@ function analyzer(data, sidePass) {
if (isIllegalType(value.type)) {
dprint('legalizer', 'Legalizing mathop at line ' + item.lineNum);
label.lines.splice(i, 1);
+ var toAdd = [];
assert(value.param1.intertype == 'value', 'TODO: unfolding');
var sourceBits = getBits(value.param1.type);
- var sourceElements = getLegalVars(value.param1.ident, sourceBits);
+ var sourceElements;
+ if (sourceBits <= 64) {
+ // The input is a legal type
+ if (sourceBits <= 32) {
+ sourceElements = [{ ident: value.param1.ident, bits: sourceBits }];
+ } else if (sourceBits == 64 && I64_MODE == 1) {
+ sourceElements = [{ ident: value.param1.ident + '[0]', bits: 32 },
+ { ident: value.param1.ident + '[1]', bits: 32 }];
+ // Add the source element as a param so that it is not eliminated as unneeded (the idents are not a simple ident here)
+ toAdd.push({
+ intertype: 'value', ident: ';', type: 'rawJS',
+ params: [{ intertype: 'value', ident: value.param1.ident, type: 'i32' }]
+ });
+ } else {
+ throw 'Invalid legal type as source of legalization ' + sourceBits;
+ }
+ } else {
+ sourceElements = getLegalVars(value.param1.ident, sourceBits);
+ }
// All mathops can be parametrized by how many shifts we do, and how big the source is
var shifts = 0;
var targetBits;
@@ -291,7 +310,6 @@ function analyzer(data, sidePass) {
var shiftOpReverse = shifts >= 0 ? 'lshr' : 'shl';
var whole = shifts >= 0 ? Math.floor(shifts/32) : Math.ceil(shifts/32);
var fraction = Math.abs(shifts % 32);
- var toAdd = [];
for (var j = 0; j < targetElements.length; j++) {
var result = {
intertype: 'value',
diff --git a/tests/cases/legalizer_ta2.ll b/tests/cases/legalizer_ta2.ll
index 4043d8d2..45cdf432 100644
--- a/tests/cases/legalizer_ta2.ll
+++ b/tests/cases/legalizer_ta2.ll
@@ -64,12 +64,19 @@ entry:
call i32 (i8*)* @puts(i8* %buffer)
; zext
- %pre32 = zext i32 6382179 to i32
+ store i104 0, i104* %bundled, align 4 ; wipe it out
+ %pre32 = or i32 6382179, 0
%big = zext i32 %pre32 to i104
store i104 %big, i104* %bundled, align 4
call i32 (i8*)* @puts(i8* %buffer)
-; TODO: extend an i64, and extend an i32
+ store i104 0, i104* %bundled, align 4 ; wipe it out
+ %pre64 = zext i32 1684366951 to i64
+ %post64 = shl i64 %pre64, 32
+ %big64 = or i64 %pre64, %post64
+ %bigb = zext i64 %big64 to i104
+ store i104 %bigb, i104* %bundled, align 4
+ call i32 (i8*)* @puts(i8* %buffer)
ret i32 1
}
diff --git a/tests/cases/legalizer_ta2.txt b/tests/cases/legalizer_ta2.txt
index 845f9ae0..ae9b4a47 100644
--- a/tests/cases/legalizer_ta2.txt
+++ b/tests/cases/legalizer_ta2.txt
@@ -10,3 +10,4 @@ hell
he
hello, w
cba
+gfedgfed