aboutsummaryrefslogtreecommitdiff
path: root/src/preamble.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-06-05 19:17:53 -0700
committerAlon Zakai <alonzakai@gmail.com>2011-06-05 19:17:53 -0700
commite068f02137c1de07480886c0f6181150d77816dd (patch)
treeffc61c76fe4c0bf9fd58e6c7105c3c4378501698 /src/preamble.js
parent5b2f181ab4662dca21f3605aeca8c2e0cd212b20 (diff)
fix alignment issues with USE_TYPED_ARRAYS == 2
Diffstat (limited to 'src/preamble.js')
-rw-r--r--src/preamble.js66
1 files changed, 53 insertions, 13 deletions
diff --git a/src/preamble.js b/src/preamble.js
index dd7f9f3e..e0f97f48 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -52,6 +52,10 @@ function SAFE_HEAP_ACCESS(dest, type, store, ignore) {
}
}
function SAFE_HEAP_STORE(dest, value, type, ignore) {
+#if SAFE_HEAP_LOG
+ print('SAFE_HEAP store: ' + [dest, type, value, ignore]);
+#endif
+
if (!ignore && !value && value !== 0 && value !== false) { // false can be the result of a mathop comparator
throw('Warning: Writing an invalid value of ' + JSON.stringify(value) + ' at ' + dest + ' :: ' + new Error().stack + '\n');
}
@@ -75,11 +79,11 @@ function SAFE_HEAP_STORE(dest, value, type, ignore) {
if (type[type.length-1] === '*') type = 'i32'; // hardcoded pointers as 32-bit
switch(type) {
case 'i8': HEAP8[dest] = value; break;
- case 'i16': HEAP16[dest>>1] = value; break;
- case 'i32': HEAP32[dest>>2] = value; break;
- case 'i64': abort('no HEAP64'); break;
- case 'float': HEAPF32[dest>>2] = value; break;
- case 'double': HEAPF64[dest>>3] = value; break;
+ case 'i16': assert(dest % 2 === 0, type + ' loads must be aligned'); HEAP16[dest>>1] = value; break;
+ case 'i32': assert(dest % 4 === 0, type + ' loads must be aligned'); HEAP32[dest>>2] = value; break;
+ case 'i64': assert(dest % 4 === 0, type + ' loads must be aligned'); HEAP32[dest>>2] = value; break; // XXX store int64 as int32
+ case 'float': assert(dest % 4 === 0, type + ' loads must be aligned'); HEAPF32[dest>>2] = value; break;
+ case 'double': assert(dest % 4 === 0, type + ' loads must be aligned'); HEAPF32[dest>>2] = value; break; // XXX store doubles as floats
default: throw 'weird type for typed array II: ' + type + new Error().stack;
}
#else
@@ -92,24 +96,61 @@ function SAFE_HEAP_LOAD(dest, type, ignore) {
#if USE_TYPED_ARRAYS == 1
if (type in Runtime.FLOAT_TYPES) {
+#if SAFE_HEAP_LOG
+ print('SAFE_HEAP load: ' + [dest, type, FHEAP[dest], ignore]);
+#endif
return FHEAP[dest];
} else {
+#if SAFE_HEAP_LOG
+ print('SAFE_HEAP load: ' + [dest, type, IHEAP[dest], ignore]);
+#endif
return IHEAP[dest];
}
#else
#if USE_TYPED_ARRAYS == 2
+#if SAFE_HEAP_LOG
+ var originalType = type;
+#endif
if (type[type.length-1] === '*') type = 'i32'; // hardcoded pointers as 32-bit
switch(type) {
- case 'i8': return HEAP8[dest]; break;
- case 'i16': return HEAP16[dest>>1]; break;
- case 'i32': return HEAP32[dest>>2]; break;
- case 'i64': abort('no HEAP64'); break;
- case 'float': return HEAPF32[dest>>2]; break;
- case 'double': return HEAPF64[dest>>3]; break;
+ case 'i8': {
+#if SAFE_HEAP_LOG
+ print('SAFE_HEAP load: ' + [dest, originalType, HEAP8[dest], ignore]);
+#endif
+ return HEAP8[dest];
+ break;
+ }
+ case 'i16': {
+#if SAFE_HEAP_LOG
+ print('SAFE_HEAP load: ' + [dest, originalType, HEAP16[dest], ignore]);
+#endif
+ assert(dest % 2 === 0, type + ' loads must be aligned');
+ return HEAP16[dest>>1];
+ break;
+ }
+ case 'i32': case 'i64': { // XXX store int64 as int32
+#if SAFE_HEAP_LOG
+ print('SAFE_HEAP load: ' + [dest, originalType, HEAP32[dest], ignore]);
+#endif
+ assert(dest % 4 === 0, type + ' loads must be aligned');
+ return HEAP32[dest>>2];
+ break;
+ }
+ case 'float': case 'double': { // XXX store doubles as floats
+#if SAFE_HEAP_LOG
+ print('SAFE_HEAP load: ' + [dest, originalType, HEAPF32[dest], ignore]);
+#endif
+ assert(dest % 4 === 0, type + ' loads must be aligned');
+ return HEAPF32[dest>>2];
+ break;
+ }
default: throw 'weird type for typed array II: ' + type;
}
return null;
#else
+#if SAFE_HEAP_LOG
+ print('SAFE_HEAP load: ' + [dest, type, HEAP[dest], ignore]);
+#endif
return HEAP[dest];
#endif
#endif
@@ -350,7 +391,7 @@ var HEAP;
var IHEAP, FHEAP;
#endif
#if USE_TYPED_ARRAYS == 2
-var HEAP8, HEAP16, HEAP32, HEAPF32, HEAPF64;
+var HEAP8, HEAP16, HEAP32, HEAPF32;
#endif
var STACK_ROOT, STACKTOP, STACK_MAX;
@@ -377,7 +418,6 @@ function __initializeRuntime__() {
HEAP16 = new Int16Array(buffer);
HEAP32 = new Int32Array(buffer);
HEAPF32 = new Float32Array(buffer);
- HEAPF64 = new Float64Array(buffer);
#endif
} else
#endif