aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralon@honor <none@none>2010-10-09 23:25:31 -0700
committeralon@honor <none@none>2010-10-09 23:25:31 -0700
commita75307b84dc14ba8508eac5a64e798d0db7672a6 (patch)
treec6d24ba808c30c3128b72263b03d662008edd878
parent27d8e4cfa4400773cec9a5a60f8e25c800998d94 (diff)
pass types to makeGetValue/makeSetValue
-rw-r--r--src/analyzer.js1
-rw-r--r--src/intertyper.js2
-rw-r--r--src/jsifier.js33
-rw-r--r--tests/runner.py3
4 files changed, 19 insertions, 20 deletions
diff --git a/src/analyzer.js b/src/analyzer.js
index 44e62ad2..c6c7b028 100644
--- a/src/analyzer.js
+++ b/src/analyzer.js
@@ -719,6 +719,7 @@ function analyzer(data) {
a.ident == b.value.ident && func.variables[a.ident].uses == 1) {
// print("// LOADSUSPECT: " + i + ',' + (i+1) + ':' + a.ident + ':' + b.value.ident);
a.intertype = 'fastgetelementptrload';
+ a.value.valueType = b.value.valueType;
a.ident = b.ident;
b.intertype = null;
i++;
diff --git a/src/intertyper.js b/src/intertyper.js
index 23a0b864..86bf4a24 100644
--- a/src/intertyper.js
+++ b/src/intertyper.js
@@ -346,7 +346,7 @@ function intertyper(data) {
processItem: function(item) {
if (item.tokens[0].text == 'volatile') item.tokens.shift(0);
item.pointerType = item.tokens[1].text;
- item.type = removePointing(item.pointerType);
+ item.valueType = item.type = removePointing(item.pointerType);
if (item.tokens[2].text == 'getelementptr') {
var last = getTokenIndexByText(item.tokens, ';');
var data = parseLLVMFunctionCall(item.tokens.slice(1, last));
diff --git a/src/jsifier.js b/src/jsifier.js
index f32e60c8..f69a22ee 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -19,8 +19,7 @@ function JSify(data) {
},
});
- function makePointer(slab, pos, allocator) {
- // XXX hardcoded ptr impl
+ function makePointer(slab, pos, allocator, type) { // type is FFU
if (slab == 'HEAP') return pos;
if (slab[0] != '[') {
slab = '[' + slab + ']';
@@ -29,13 +28,11 @@ function JSify(data) {
}
function makeGetSlab(ptr) {
- // XXX hardcoded ptr impl
// return ptr + '.slab';
return 'HEAP';
}
function makeGetPos(ptr) {
- // XXX hardcoded ptr impl
// return ptr + '.pos';
return ptr;
}
@@ -45,11 +42,11 @@ function JSify(data) {
return getFastValue(offset, '+', pos);
}
- function makeGetValue(ptr, pos, noNeedFirst) {
+ function makeGetValue(ptr, pos, noNeedFirst, type) {
return makeGetSlab(ptr) + '[' + calcFastOffset(ptr, pos, noNeedFirst) + ']';
}
- function makeSetValue(ptr, pos, value, noNeedFirst) {
+ function makeSetValue(ptr, pos, value, noNeedFirst, type) {
var offset = calcFastOffset(ptr, pos, noNeedFirst);
if (SAFE_HEAP) {
return 'SAFE_HEAP_STORE(' + offset + ', ' + value + ')';
@@ -101,12 +98,12 @@ function JSify(data) {
function parseConst(value, type) {
dprint('gconst', '//yyyyy ' + JSON.stringify(value) + ',' + type + '\n');
if (isNumberType(type) || pointingLevels(type) == 1) {
- return makePointer(parseNumerical(value.text), null, 'ALLOC_STATIC');
+ return makePointer(parseNumerical(value.text), null, 'ALLOC_STATIC', type);
} else if (value.text == 'zeroinitializer') {
- return makePointer(JSON.stringify(makeEmptyStruct(type)), null, 'ALLOC_STATIC');
+ return makePointer(JSON.stringify(makeEmptyStruct(type)), null, 'ALLOC_STATIC', type);
} else if (value.text && value.text[0] == '"') {
value.text = value.text.substr(1, value.text.length-2);
- return makePointer(JSON.stringify(parseLLVMString(value.text)) + ' /* ' + value.text + '*/', null, 'ALLOC_STATIC');
+ return makePointer(JSON.stringify(parseLLVMString(value.text)) + ' /* ' + value.text + '*/', null, 'ALLOC_STATIC', type);
} else {
// Gets an array of constant items, separated by ',' tokens
function handleSegments(tokens) {
@@ -142,12 +139,12 @@ function JSify(data) {
}
if (value.item) {
// list of items
- return makePointer('[ ' + alignStruct(handleSegments(value.item[0].tokens), type).join(', ') + ' ]', null, 'ALLOC_STATIC');
+ return makePointer('[ ' + alignStruct(handleSegments(value.item[0].tokens), type).join(', ') + ' ]', null, 'ALLOC_STATIC', type);
} else if (value.type == '{') {
// struct
- return makePointer('[ ' + alignStruct(handleSegments(value.tokens), type).join(', ') + ' ]', null, 'ALLOC_STATIC');
+ return makePointer('[ ' + alignStruct(handleSegments(value.tokens), type).join(', ') + ' ]', null, 'ALLOC_STATIC', type);
} else if (value[0]) {
- return makePointer('[ ' + alignStruct(handleSegments(value[0].tokens), type).join(', ') + ' ]', null, 'ALLOC_STATIC');
+ return makePointer('[ ' + alignStruct(handleSegments(value[0].tokens), type).join(', ') + ' ]', null, 'ALLOC_STATIC', type);
} else {
throw '// failzzzzzzzzzzzzzz ' + dump(value.item) + ' ::: ' + dump(value);
}
@@ -433,9 +430,9 @@ function JSify(data) {
break;
case VAR_EMULATED:
if (item.pointer.intertype == 'value') {
- return makeSetValue(item.ident, 0, value) + ';';
+ return makeSetValue(item.ident, 0, value, null, item.valueType) + ';';
} else {
- return makeSetValue(0, getGetElementPtrIndexes(item.pointer), value) + ';';
+ return makeSetValue(0, getGetElementPtrIndexes(item.pointer), value, null, item.valueType) + ';';
}
break;
default:
@@ -545,7 +542,7 @@ function JSify(data) {
case VAR_NATIVIZED: {
return ident; // We have the actual value here
}
- case VAR_EMULATED: return makeGetValue(ident);
+ case VAR_EMULATED: return makeGetValue(ident, null, null, item.type);
default: return "unknown [load] impl: " + impl;
}
});
@@ -724,7 +721,7 @@ function JSify(data) {
function finalizeLLVMFunctionCall(item) {
switch(item.intertype) {
case 'getelementptr':
- return makePointer(makeGetSlab(item.ident), getGetElementPtrIndexes(item));
+ return makePointer(makeGetSlab(item.ident), getGetElementPtrIndexes(item), null, item.type);
case 'bitcast':
case 'inttoptr':
case 'ptrtoint':
@@ -781,10 +778,10 @@ function JSify(data) {
// Optimzed intertypes
makeFuncLineZyme('fastgetelementptrload', function(item) {
- return 'var ' + item.ident + ' = ' + makeGetValue(parseNumerical(item.value.ident), getGetElementPtrIndexes(item.value), true) + ';';
+ return 'var ' + item.ident + ' = ' + makeGetValue(parseNumerical(item.value.ident), getGetElementPtrIndexes(item.value), true, item.value.valueType) + ';';
});
makeFuncLineZyme('fastgetelementptrstore', function(item) {
- return makeSetValue(item.value.ident, getGetElementPtrIndexes(item.value), parseNumerical(item.ident), true) + ';';
+ return makeSetValue(item.value.ident, getGetElementPtrIndexes(item.value), parseNumerical(item.ident), true, item.type) + ';';
});
makeFuncLineZyme('unreachable', function(item) { return '// unreachable' });
diff --git a/tests/runner.py b/tests/runner.py
index 1952efff..659dd5dc 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -879,7 +879,8 @@ else:
sys.argv = filter(lambda x: x != 'benchmark', sys.argv)
COMPILER = LLVM_GCC
- PARSER_ENGINE = JS_ENGINE = V8_ENGINE
+ PARSER_ENGINE = V8_ENGINE
+ JS_ENGINE = SPIDERMONKEY_ENGINE
RELOOP = OPTIMIZE = 1
GUARD_MEMORY = 0
QUANTUM_SIZE = 1