diff options
author | Nathan Froyd <froydnj@gmail.com> | 2018-02-14 14:34:26 -0500 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2018-02-14 11:34:26 -0800 |
commit | b5ac1aa5f17cebac494228dc4380cfc509ee8846 (patch) | |
tree | 3d34b1d3813f96bc101afc5b8653d34a0f7dff2f | |
parent | 11a83d799d1b539f7c7a1eec987dc87119a098dd (diff) | |
download | binaryen-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.cpp | 51 | ||||
-rw-r--r-- | test/i64-lowering.2asm.js | 216 | ||||
-rw-r--r-- | test/wasm2asm/i64-lowering.wast | 269 |
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)) |