summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/asm2wasm.h4
-rw-r--r--test/min.asm.js18
-rw-r--r--test/min.fromasm13
-rw-r--r--test/min.fromasm.imprecise13
4 files changed, 46 insertions, 2 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h
index e34bfc19e..7d9b9652b 100644
--- a/src/asm2wasm.h
+++ b/src/asm2wasm.h
@@ -1418,7 +1418,7 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) {
// (HEAP32[tempDoublePtr >> 2] = i, +HEAPF32[tempDoublePtr >> 2]); // i32->f32, no fround
// (HEAPF32[tempDoublePtr >> 2] = f, HEAP32[tempDoublePtr >> 2] | 0); // f32->i32
if (ast[1][0] == ASSIGN && ast[1][2][0] == SUB && ast[1][2][1][0] == NAME && ast[1][2][2][0] == BINARY && ast[1][2][2][1] == RSHIFT &&
- ast[1][2][2][2][0] == NAME && ast[1][2][2][2][1] == TEMP_DOUBLE_PTR && ast[1][2][2][3][0] == NUM && ast[1][2][2][3][1]->getNumber() == 2) {
+ ast[1][2][2][2][0] == NAME && ast[1][2][2][2][1] == tempDoublePtr && ast[1][2][2][3][0] == NUM && ast[1][2][2][3][1]->getNumber() == 2) {
// (?[tempDoublePtr >> 2] = ?, ?) so far
auto heap = ast[1][2][1][1]->getIString();
if (views.find(heap) != views.end()) {
@@ -1437,7 +1437,7 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) {
}
if (readType != ASM_NONE) {
if (readValue[0] == SUB && readValue[1][0] == NAME && readValue[2][0] == BINARY && readValue[2][1] == RSHIFT &&
- readValue[2][2][0] == NAME && readValue[2][2][1] == TEMP_DOUBLE_PTR && readValue[2][3][0] == NUM && readValue[2][3][1]->getNumber() == 2) {
+ readValue[2][2][0] == NAME && readValue[2][2][1] == tempDoublePtr && readValue[2][3][0] == NUM && readValue[2][3][1]->getNumber() == 2) {
// pattern looks right!
Ref writtenValue = ast[1][3];
if (writeType == ASM_INT && (readType == ASM_FLOAT || readType == ASM_DOUBLE)) {
diff --git a/test/min.asm.js b/test/min.asm.js
index 77e54caab..ed5d186f5 100644
--- a/test/min.asm.js
+++ b/test/min.asm.js
@@ -6,6 +6,17 @@ function (global, env, buffer) {
var fr = global.Math.fround;
+ var tDP = env.tempDoublePtr | 0;
+
+ var h8 = new global.Int8Array(buffer);
+ var h16 = new global.Int16Array(buffer);
+ var h32 = new global.Int32Array(buffer);
+ var hU8 = new global.Uint8Array(buffer);
+ var hU16 = new global.Uint16Array(buffer);
+ var hU32 = new global.Uint32Array(buffer);
+ var hF32 = new global.Float32Array(buffer);
+ var hF64 = new global.Float64Array(buffer);
+
function floats(f) {
f = fr(f);
var t = fr(0);
@@ -18,6 +29,13 @@ function (global, env, buffer) {
n = fr(-(c[k >> 2] = p, fr(g[k >> 2])));
return n;
}
+ function bitcasts(i, f) {
+ i = i | 0;
+ f = Math_fround(f);
+ (h32[tDP >> 2] = i, fr(hF32[tDP >> 2])); // i32->f32
+ (h32[tDP >> 2] = i, +hF32[tDP >> 2]); // i32->f32, no fround
+ (hF32[tDP >> 2] = f, h32[tDP >> 2] | 0); // f32->i32
+ }
return { floats: floats };
}
diff --git a/test/min.fromasm b/test/min.fromasm
index 839fd167c..564980a96 100644
--- a/test/min.fromasm
+++ b/test/min.fromasm
@@ -30,4 +30,17 @@
(get_local $n)
)
)
+ (func $bitcasts (param $i i32) (param $f f32)
+ (f32.reinterpret/i32
+ (get_local $i)
+ )
+ (f64.promote/f32
+ (f32.reinterpret/i32
+ (get_local $i)
+ )
+ )
+ (i32.reinterpret/f32
+ (get_local $f)
+ )
+ )
)
diff --git a/test/min.fromasm.imprecise b/test/min.fromasm.imprecise
index 839fd167c..564980a96 100644
--- a/test/min.fromasm.imprecise
+++ b/test/min.fromasm.imprecise
@@ -30,4 +30,17 @@
(get_local $n)
)
)
+ (func $bitcasts (param $i i32) (param $f f32)
+ (f32.reinterpret/i32
+ (get_local $i)
+ )
+ (f64.promote/f32
+ (f32.reinterpret/i32
+ (get_local $i)
+ )
+ )
+ (i32.reinterpret/f32
+ (get_local $f)
+ )
+ )
)