summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Froyd <froydnj@gmail.com>2018-02-14 14:34:26 -0500
committerAlon Zakai <alonzakai@gmail.com>2018-02-14 11:34:26 -0800
commitb5ac1aa5f17cebac494228dc4380cfc509ee8846 (patch)
tree3d34b1d3813f96bc101afc5b8653d34a0f7dff2f
parent11a83d799d1b539f7c7a1eec987dc87119a098dd (diff)
downloadbinaryen-b5ac1aa5f17cebac494228dc4380cfc509ee8846.tar.gz
binaryen-b5ac1aa5f17cebac494228dc4380cfc509ee8846.tar.bz2
binaryen-b5ac1aa5f17cebac494228dc4380cfc509ee8846.zip
add wasm2asm lowering for 64-bit signed comparisons (#1421)
Plus some tests, to make sure we implemented things correctly.
-rw-r--r--src/passes/I64ToI32Lowering.cpp51
-rw-r--r--test/i64-lowering.2asm.js216
-rw-r--r--test/wasm2asm/i64-lowering.wast269
3 files changed, 535 insertions, 1 deletions
diff --git a/src/passes/I64ToI32Lowering.cpp b/src/passes/I64ToI32Lowering.cpp
index 4135cb154..fd61a687c 100644
--- a/src/passes/I64ToI32Lowering.cpp
+++ b/src/passes/I64ToI32Lowering.cpp
@@ -1015,6 +1015,50 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> {
);
}
+ Block* lowerSComp(BinaryOp op, Block* result, TempVar&& leftLow,
+ TempVar&& leftHigh, TempVar&& rightLow,
+ TempVar&& rightHigh) {
+ BinaryOp highOp1, highOp2, lowOp;
+ switch (op) {
+ case LtSInt64: highOp1 = LtSInt32; highOp2 = LeSInt32; lowOp = GeUInt32; break;
+ case LeSInt64: highOp1 = LtSInt32; highOp2 = LeSInt32; lowOp = GtUInt32; break;
+ case GtSInt64: highOp1 = GtSInt32; highOp2 = GeSInt32; lowOp = LeUInt32; break;
+ case GeSInt64: highOp1 = GtSInt32; highOp2 = GeSInt32; lowOp = LtUInt32; break;
+ default: abort();
+ }
+ Binary* compHigh1 = builder->makeBinary(
+ highOp1,
+ builder->makeGetLocal(leftHigh, i32),
+ builder->makeGetLocal(rightHigh, i32)
+ );
+ Binary* compHigh2 = builder->makeBinary(
+ highOp2,
+ builder->makeGetLocal(leftHigh, i32),
+ builder->makeGetLocal(rightHigh, i32)
+ );
+ Binary* compLow = builder->makeBinary(
+ lowOp,
+ builder->makeGetLocal(leftLow, i32),
+ builder->makeGetLocal(rightLow, i32)
+ );
+ If* lowIf = builder->makeIf(
+ compLow,
+ builder->makeConst(Literal(int32_t(0))),
+ builder->makeConst(Literal(int32_t(1)))
+ );
+ If* highIf2 = builder->makeIf(
+ compHigh2,
+ lowIf,
+ builder->makeConst(Literal(int32_t(0)))
+ );
+ If* highIf1 = builder->makeIf(
+ compHigh1,
+ builder->makeConst(Literal(int32_t(1))),
+ highIf2
+ );
+ return builder->blockify(result, highIf1);
+ }
+
bool binaryNeedsLowering(BinaryOp op) {
switch (op) {
case AddInt64:
@@ -1131,7 +1175,12 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> {
case LtSInt64:
case LeSInt64:
case GtSInt64:
- case GeSInt64: goto err;
+ case GeSInt64:
+ replaceCurrent(
+ lowerSComp(curr->op, result, std::move(leftLow), std::move(leftHigh),
+ std::move(rightLow), std::move(rightHigh))
+ );
+ break;
case LtUInt64:
case LeUInt64:
case GtUInt64:
diff --git a/test/i64-lowering.2asm.js b/test/i64-lowering.2asm.js
new file mode 100644
index 000000000..e326ed93d
--- /dev/null
+++ b/test/i64-lowering.2asm.js
@@ -0,0 +1,216 @@
+function asmFunc(global, env, buffer) {
+ "use asm";
+ var HEAP8 = new global.Int8Array(buffer);
+ var HEAP16 = new global.Int16Array(buffer);
+ var HEAP32 = new global.Int32Array(buffer);
+ var HEAPU8 = new global.Uint8Array(buffer);
+ var HEAPU16 = new global.Uint16Array(buffer);
+ var HEAPU32 = new global.Uint32Array(buffer);
+ var HEAPF32 = new global.Float32Array(buffer);
+ var HEAPF64 = new global.Float64Array(buffer);
+ var Math_imul = global.Math.imul;
+ var Math_fround = global.Math.fround;
+ var Math_abs = global.Math.abs;
+ var Math_clz32 = global.Math.clz32;
+ function dummy() {
+
+ }
+
+ function $$1($$0, $$0$hi, $$1, $$1$hi) {
+ $$0 = $$0 | 0;
+ $$0$hi = $$0$hi | 0;
+ $$1 = $$1 | 0;
+ $$1$hi = $$1$hi | 0;
+ var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, $$21 = 0, $$22 = 0, $$23 = 0, $$24 = 0, wasm2asm_i32$0 = 0;
+ return ($$0 | 0) == ($$1 | 0) & ($$0$hi | 0) == ($$1$hi | 0) | 0 | 0;
+ return wasm2asm_i32$0 | 0;
+ }
+
+ function $$2($$0, $$0$hi, $$1, $$1$hi) {
+ $$0 = $$0 | 0;
+ $$0$hi = $$0$hi | 0;
+ $$1 = $$1 | 0;
+ $$1$hi = $$1$hi | 0;
+ var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, $$21 = 0, $$22 = 0, $$23 = 0, $$24 = 0, wasm2asm_i32$0 = 0;
+ return ($$0 | 0) != ($$1 | 0) | ($$0$hi | 0) != ($$1$hi | 0) | 0 | 0;
+ return wasm2asm_i32$0 | 0;
+ }
+
+ function $$3($$0, $$0$hi, $$1, $$1$hi) {
+ $$0 = $$0 | 0;
+ $$0$hi = $$0$hi | 0;
+ $$1 = $$1 | 0;
+ $$1$hi = $$1$hi | 0;
+ var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, $$21 = 0, $$22 = 0, $$23 = 0, $$24 = 0, $$25 = 0, $$26 = 0, $$27 = 0, $$28 = 0, $$29 = 0, $$30 = 0, $$31 = 0, $$32 = 0;
+ i64toi32_i32$0 = $$0$hi;
+ i64toi32_i32$2 = $$0;
+ i64toi32_i32$1 = $$1$hi;
+ i64toi32_i32$3 = $$1;
+ if ((i64toi32_i32$0 | 0) > (i64toi32_i32$1 | 0)) $$29 = 1; else {
+ if ((i64toi32_i32$0 | 0) >= (i64toi32_i32$1 | 0)) {
+ if (i64toi32_i32$2 >>> 0 < i64toi32_i32$3 >>> 0) $$25 = 0; else $$25 = 1;
+ $$27 = $$25;
+ } else $$27 = 0;
+ $$29 = $$27;
+ }
+ return $$29 | 0;
+ }
+
+ function $$4($$0, $$0$hi, $$1, $$1$hi) {
+ $$0 = $$0 | 0;
+ $$0$hi = $$0$hi | 0;
+ $$1 = $$1 | 0;
+ $$1$hi = $$1$hi | 0;
+ var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, $$21 = 0, $$22 = 0, $$23 = 0, $$24 = 0, $$25 = 0, $$26 = 0, $$27 = 0, $$28 = 0, $$29 = 0, $$30 = 0, $$31 = 0, $$32 = 0;
+ i64toi32_i32$0 = $$0$hi;
+ i64toi32_i32$2 = $$0;
+ i64toi32_i32$1 = $$1$hi;
+ i64toi32_i32$3 = $$1;
+ if ((i64toi32_i32$0 | 0) > (i64toi32_i32$1 | 0)) $$29 = 1; else {
+ if ((i64toi32_i32$0 | 0) >= (i64toi32_i32$1 | 0)) {
+ if (i64toi32_i32$2 >>> 0 <= i64toi32_i32$3 >>> 0) $$25 = 0; else $$25 = 1;
+ $$27 = $$25;
+ } else $$27 = 0;
+ $$29 = $$27;
+ }
+ return $$29 | 0;
+ }
+
+ function $$5($$0, $$0$hi, $$1, $$1$hi) {
+ $$0 = $$0 | 0;
+ $$0$hi = $$0$hi | 0;
+ $$1 = $$1 | 0;
+ $$1$hi = $$1$hi | 0;
+ var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, $$21 = 0, $$22 = 0, $$23 = 0, $$24 = 0, $$25 = 0, $$26 = 0, $$27 = 0, $$28 = 0, $$29 = 0, $$30 = 0, $$31 = 0, $$32 = 0;
+ i64toi32_i32$0 = $$0$hi;
+ i64toi32_i32$2 = $$0;
+ i64toi32_i32$1 = $$1$hi;
+ i64toi32_i32$3 = $$1;
+ if ((i64toi32_i32$0 | 0) < (i64toi32_i32$1 | 0)) $$29 = 1; else {
+ if ((i64toi32_i32$0 | 0) <= (i64toi32_i32$1 | 0)) {
+ if (i64toi32_i32$2 >>> 0 > i64toi32_i32$3 >>> 0) $$25 = 0; else $$25 = 1;
+ $$27 = $$25;
+ } else $$27 = 0;
+ $$29 = $$27;
+ }
+ return $$29 | 0;
+ }
+
+ function $$6($$0, $$0$hi, $$1, $$1$hi) {
+ $$0 = $$0 | 0;
+ $$0$hi = $$0$hi | 0;
+ $$1 = $$1 | 0;
+ $$1$hi = $$1$hi | 0;
+ var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, $$21 = 0, $$22 = 0, $$23 = 0, $$24 = 0, $$25 = 0, $$26 = 0, $$27 = 0, $$28 = 0, $$29 = 0, $$30 = 0, $$31 = 0, $$32 = 0;
+ i64toi32_i32$0 = $$0$hi;
+ i64toi32_i32$2 = $$0;
+ i64toi32_i32$1 = $$1$hi;
+ i64toi32_i32$3 = $$1;
+ if ((i64toi32_i32$0 | 0) < (i64toi32_i32$1 | 0)) $$29 = 1; else {
+ if ((i64toi32_i32$0 | 0) <= (i64toi32_i32$1 | 0)) {
+ if (i64toi32_i32$2 >>> 0 >= i64toi32_i32$3 >>> 0) $$25 = 0; else $$25 = 1;
+ $$27 = $$25;
+ } else $$27 = 0;
+ $$29 = $$27;
+ }
+ return $$29 | 0;
+ }
+
+ function $$7($$0, $$0$hi, $$1, $$1$hi) {
+ $$0 = $$0 | 0;
+ $$0$hi = $$0$hi | 0;
+ $$1 = $$1 | 0;
+ $$1$hi = $$1$hi | 0;
+ var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, $$21 = 0, $$22 = 0, $$23 = 0, $$24 = 0, $$25 = 0, $$26 = 0, $$27 = 0, $$28 = 0;
+ i64toi32_i32$0 = $$0$hi;
+ i64toi32_i32$1 = $$1$hi;
+ return i64toi32_i32$0 >>> 0 > i64toi32_i32$1 >>> 0 | ((i64toi32_i32$0 | 0) == (i64toi32_i32$1 | 0) & $$0 >>> 0 >= $$1 >>> 0 | 0) | 0 | 0;
+ }
+
+ function $$8($$0, $$0$hi, $$1, $$1$hi) {
+ $$0 = $$0 | 0;
+ $$0$hi = $$0$hi | 0;
+ $$1 = $$1 | 0;
+ $$1$hi = $$1$hi | 0;
+ var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, $$21 = 0, $$22 = 0, $$23 = 0, $$24 = 0, $$25 = 0, $$26 = 0, $$27 = 0, $$28 = 0;
+ i64toi32_i32$0 = $$0$hi;
+ i64toi32_i32$1 = $$1$hi;
+ return i64toi32_i32$0 >>> 0 > i64toi32_i32$1 >>> 0 | ((i64toi32_i32$0 | 0) == (i64toi32_i32$1 | 0) & $$0 >>> 0 > $$1 >>> 0 | 0) | 0 | 0;
+ }
+
+ function $$9($$0, $$0$hi, $$1, $$1$hi) {
+ $$0 = $$0 | 0;
+ $$0$hi = $$0$hi | 0;
+ $$1 = $$1 | 0;
+ $$1$hi = $$1$hi | 0;
+ var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, $$21 = 0, $$22 = 0, $$23 = 0, $$24 = 0, $$25 = 0, $$26 = 0, $$27 = 0, $$28 = 0;
+ i64toi32_i32$0 = $$0$hi;
+ i64toi32_i32$1 = $$1$hi;
+ return i64toi32_i32$0 >>> 0 < i64toi32_i32$1 >>> 0 | ((i64toi32_i32$0 | 0) == (i64toi32_i32$1 | 0) & $$0 >>> 0 <= $$1 >>> 0 | 0) | 0 | 0;
+ }
+
+ function $$10($$0, $$0$hi, $$1, $$1$hi) {
+ $$0 = $$0 | 0;
+ $$0$hi = $$0$hi | 0;
+ $$1 = $$1 | 0;
+ $$1$hi = $$1$hi | 0;
+ var i64toi32_i32$0 = 0, i64toi32_i32$1 = 0, i64toi32_i32$2 = 0, i64toi32_i32$3 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, $$21 = 0, $$22 = 0, $$23 = 0, $$24 = 0, $$25 = 0, $$26 = 0, $$27 = 0, $$28 = 0;
+ i64toi32_i32$0 = $$0$hi;
+ i64toi32_i32$1 = $$1$hi;
+ return i64toi32_i32$0 >>> 0 < i64toi32_i32$1 >>> 0 | ((i64toi32_i32$0 | 0) == (i64toi32_i32$1 | 0) & $$0 >>> 0 < $$1 >>> 0 | 0) | 0 | 0;
+ }
+
+ function __wasm_ctz_i32(x) {
+ x = x | 0;
+ var $$1 = 0, $$2 = 0, $$3 = 0, $$4 = 0, $$5 = 0, $$6 = 0, $$7 = 0, $$8 = 0, $$9 = 0, $$10 = 0;
+ if ((x | 0) == (0 | 0)) $$9 = 32; else $$9 = 31 - Math_clz32(x ^ (x - 1 | 0) | 0) | 0;
+ return $$9 | 0;
+ }
+
+ function __wasm_popcnt_i32(x) {
+ x = x | 0;
+ var count = 0, $$2 = 0, $$3 = 0, $$4 = 0, $$5 = 0, $$6 = 0, $$7 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0;
+ count = 0;
+ b : {
+ l : do {
+ $$5 = count;
+ if ((x | 0) == (0 | 0)) break b;
+ x = x & (x - 1 | 0) | 0;
+ count = count + 1 | 0;
+ continue l;
+ break l;
+ } while (1);
+ };
+ return $$5 | 0;
+ }
+
+ function __wasm_rotl_i32(x, k) {
+ x = x | 0;
+ k = k | 0;
+ var $$2 = 0, $$3 = 0, $$4 = 0, $$5 = 0, $$6 = 0, $$7 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, wasm2asm_i32$0 = 0;
+ return ((4294967295 >>> (k & 31 | 0) | 0) & x | 0) << (k & 31 | 0) | 0 | (((4294967295 << (32 - (k & 31 | 0) | 0) | 0) & x | 0) >>> (32 - (k & 31 | 0) | 0) | 0) | 0 | 0;
+ return wasm2asm_i32$0 | 0;
+ }
+
+ function __wasm_rotr_i32(x, k) {
+ x = x | 0;
+ k = k | 0;
+ var $$2 = 0, $$3 = 0, $$4 = 0, $$5 = 0, $$6 = 0, $$7 = 0, $$8 = 0, $$9 = 0, $$10 = 0, $$11 = 0, $$12 = 0, $$13 = 0, $$14 = 0, $$15 = 0, $$16 = 0, $$17 = 0, $$18 = 0, $$19 = 0, $$20 = 0, wasm2asm_i32$0 = 0;
+ return ((4294967295 << (k & 31 | 0) | 0) & x | 0) >>> (k & 31 | 0) | 0 | (((4294967295 >>> (32 - (k & 31 | 0) | 0) | 0) & x | 0) << (32 - (k & 31 | 0) | 0) | 0) | 0 | 0;
+ return wasm2asm_i32$0 | 0;
+ }
+
+ return {
+ eq_i64: $$1,
+ ne_i64: $$2,
+ ge_s_i64: $$3,
+ gt_s_i64: $$4,
+ le_s_i64: $$5,
+ lt_s_i64: $$6,
+ ge_u_i64: $$7,
+ gt_u_i64: $$8,
+ le_u_i64: $$9,
+ lt_u_i64: $$10
+ };
+}
+
diff --git a/test/wasm2asm/i64-lowering.wast b/test/wasm2asm/i64-lowering.wast
new file mode 100644
index 000000000..1276b54c6
--- /dev/null
+++ b/test/wasm2asm/i64-lowering.wast
@@ -0,0 +1,269 @@
+;; Testing i64 lowering.
+
+(module
+ (func $dummy)
+
+ (func (export "eq_i64") (param $0 i64) (param $1 i64) (result i32)
+ (i64.eq (get_local $0) (get_local $1)))
+
+ (func (export "ne_i64") (param $0 i64) (param $1 i64) (result i32)
+ (i64.ne (get_local $0) (get_local $1)))
+
+ (func (export "ge_s_i64") (param $0 i64) (param $1 i64) (result i32)
+ (i64.ge_s (get_local $0) (get_local $1)))
+
+ (func (export "gt_s_i64") (param $0 i64) (param $1 i64) (result i32)
+ (i64.gt_s (get_local $0) (get_local $1)))
+
+ (func (export "le_s_i64") (param $0 i64) (param $1 i64) (result i32)
+ (i64.le_s (get_local $0) (get_local $1)))
+
+ (func (export "lt_s_i64") (param $0 i64) (param $1 i64) (result i32)
+ (i64.lt_s (get_local $0) (get_local $1)))
+
+ (func (export "ge_u_i64") (param $0 i64) (param $1 i64) (result i32)
+ (i64.ge_u (get_local $0) (get_local $1)))
+
+ (func (export "gt_u_i64") (param $0 i64) (param $1 i64) (result i32)
+ (i64.gt_u (get_local $0) (get_local $1)))
+
+ (func (export "le_u_i64") (param $0 i64) (param $1 i64) (result i32)
+ (i64.le_u (get_local $0) (get_local $1)))
+
+ (func (export "lt_u_i64") (param $0 i64) (param $1 i64) (result i32)
+ (i64.lt_u (get_local $0) (get_local $1)))
+)
+
+;; TODO: change things so we can invoke with i64 args and automatically lower
+;; the arguments, rather than doing it manually.
+(assert_return (invoke "eq_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "eq_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 0))
+(assert_return (invoke "eq_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 0))
+
+(assert_return (invoke "ne_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "ne_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 1))
+(assert_return (invoke "ne_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 1))
+
+(assert_return (invoke "lt_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "lt_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "lt_u_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "lt_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 1))
+(assert_return (invoke "lt_u_i64" (i32.const 0) (i32.const 1)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "lt_u_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+
+(assert_return (invoke "gt_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "gt_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "gt_u_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "gt_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 0))
+(assert_return (invoke "gt_u_i64" (i32.const 0) (i32.const 1)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "gt_u_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+
+(assert_return (invoke "le_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "le_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "le_u_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "le_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 1))
+(assert_return (invoke "le_u_i64" (i32.const 0) (i32.const 1)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "le_u_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+
+(assert_return (invoke "ge_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "ge_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "ge_u_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "ge_u_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 0))
+(assert_return (invoke "ge_u_i64" (i32.const 0) (i32.const 1)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "ge_u_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+
+(assert_return (invoke "lt_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "lt_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "lt_s_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "lt_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 1))
+(assert_return (invoke "lt_s_i64" (i32.const 0) (i32.const 1)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "lt_s_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "lt_s_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0xffffffff))
+ (i32.const 0))
+(assert_return (invoke "lt_s_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0xffffffff))
+ (i32.const 1))
+(assert_return (invoke "lt_s_i64" (i32.const 1) (i32.const 0xffffffff)
+ (i32.const 0) (i32.const 0xffffffff))
+ (i32.const 0))
+(assert_return (invoke "lt_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0x80000000))
+ (i32.const 0))
+(assert_return (invoke "lt_s_i64" (i32.const 0) (i32.const 0x80000000)
+ (i32.const 0) (i32.const 0))
+ (i32.const 1))
+
+(assert_return (invoke "gt_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "gt_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "gt_s_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "gt_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 0))
+(assert_return (invoke "gt_s_i64" (i32.const 0) (i32.const 1)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "gt_s_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "gt_s_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0xffffffff))
+ (i32.const 1))
+(assert_return (invoke "gt_s_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0xffffffff))
+ (i32.const 0))
+(assert_return (invoke "gt_s_i64" (i32.const 1) (i32.const 0xffffffff)
+ (i32.const 0) (i32.const 0xffffffff))
+ (i32.const 1))
+(assert_return (invoke "gt_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0x80000000))
+ (i32.const 1))
+(assert_return (invoke "gt_s_i64" (i32.const 0) (i32.const 0x80000000)
+ (i32.const 0) (i32.const 0))
+ (i32.const 0))
+
+(assert_return (invoke "le_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "le_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "le_s_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "le_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 1))
+(assert_return (invoke "le_s_i64" (i32.const 0) (i32.const 1)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "le_s_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "le_s_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0xffffffff))
+ (i32.const 0))
+(assert_return (invoke "le_s_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0xffffffff))
+ (i32.const 1))
+(assert_return (invoke "le_s_i64" (i32.const 1) (i32.const 0xffffffff)
+ (i32.const 0) (i32.const 0xffffffff))
+ (i32.const 0))
+(assert_return (invoke "le_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0x80000000))
+ (i32.const 0))
+(assert_return (invoke "le_s_i64" (i32.const 0) (i32.const 0x80000000)
+ (i32.const 0) (i32.const 0))
+ (i32.const 1))
+
+(assert_return (invoke "ge_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "ge_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "ge_s_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "ge_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 1))
+ (i32.const 0))
+(assert_return (invoke "ge_s_i64" (i32.const 0) (i32.const 1)
+ (i32.const 1) (i32.const 0))
+ (i32.const 1))
+(assert_return (invoke "ge_s_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0))
+ (i32.const 0))
+(assert_return (invoke "ge_s_i64" (i32.const 1) (i32.const 0)
+ (i32.const 0) (i32.const 0xffffffff))
+ (i32.const 1))
+(assert_return (invoke "ge_s_i64" (i32.const 0) (i32.const 0xffffffff)
+ (i32.const 1) (i32.const 0xffffffff))
+ (i32.const 0))
+(assert_return (invoke "ge_s_i64" (i32.const 1) (i32.const 0xffffffff)
+ (i32.const 0) (i32.const 0xffffffff))
+ (i32.const 1))
+(assert_return (invoke "ge_s_i64" (i32.const 0) (i32.const 0)
+ (i32.const 0) (i32.const 0x80000000))
+ (i32.const 1))
+(assert_return (invoke "ge_s_i64" (i32.const 0) (i32.const 0x80000000)
+ (i32.const 0) (i32.const 0))
+ (i32.const 0))