diff options
Diffstat (limited to 'src/passes/I64ToI32Lowering.cpp')
-rw-r--r-- | src/passes/I64ToI32Lowering.cpp | 301 |
1 files changed, 155 insertions, 146 deletions
diff --git a/src/passes/I64ToI32Lowering.cpp b/src/passes/I64ToI32Lowering.cpp index c9a4f46ea..c3ed6fb04 100644 --- a/src/passes/I64ToI32Lowering.cpp +++ b/src/passes/I64ToI32Lowering.cpp @@ -109,13 +109,13 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { // add new globals for high bits for (size_t i = 0, globals = module->globals.size(); i < globals; ++i) { auto* curr = module->globals[i].get(); - if (curr->type != i64) { + if (curr->type != Type::i64) { continue; } originallyI64Globals.insert(curr->name); - curr->type = i32; + curr->type = Type::i32; auto* high = builder->makeGlobal(makeHighName(curr->name), - i32, + Type::i32, builder->makeConst(Literal(int32_t(0))), Builder::Mutable); module->addGlobal(high); @@ -125,21 +125,22 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { if (auto* c = curr->init->dynCast<Const>()) { uint64_t value = c->value.geti64(); c->value = Literal(uint32_t(value)); - c->type = i32; + c->type = Type::i32; high->init = builder->makeConst(Literal(uint32_t(value >> 32))); } else if (auto* get = curr->init->dynCast<GlobalGet>()) { - high->init = builder->makeGlobalGet(makeHighName(get->name), i32); + high->init = + builder->makeGlobalGet(makeHighName(get->name), Type::i32); } else { WASM_UNREACHABLE("unexpected expression type"); } - curr->init->type = i32; + curr->init->type = Type::i32; } } // For functions that return 64-bit values, we use this global variable // to return the high 32 bits. auto* highBits = new Global(); - highBits->type = i32; + highBits->type = Type::i32; highBits->name = INT64_TO_32_HIGH_BITS; highBits->init = builder->makeConst(Literal(int32_t(0))); highBits->mutable_ = true; @@ -173,7 +174,7 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { (i < oldFunc->getVarIndexBase()) ? Builder::addParam : static_cast<Index (*)(Function*, Name, Type)>(Builder::addVar); - if (paramType == i64) { + if (paramType == Type::i64) { builderFunc(func, lowName, Type::i32); builderFunc(func, highName, Type::i32); indexMap[i] = newIdx; @@ -199,8 +200,8 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { TempVar lowBits = getTemp(); LocalSet* setLow = builder->makeLocalSet(lowBits, func->body); GlobalSet* setHigh = builder->makeGlobalSet( - INT64_TO_32_HIGH_BITS, builder->makeLocalGet(highBits, i32)); - LocalGet* getLow = builder->makeLocalGet(lowBits, i32); + INT64_TO_32_HIGH_BITS, builder->makeLocalGet(highBits, Type::i32)); + LocalGet* getLow = builder->makeLocalGet(lowBits, Type::i32); func->body = builder->blockify(setLow, setHigh, getLow); } } @@ -224,7 +225,7 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { args.push_back(e); if (hasOutParam(e)) { TempVar argHighBits = fetchOutParam(e); - args.push_back(builder->makeLocalGet(argHighBits, i32)); + args.push_back(builder->makeLocalGet(argHighBits, Type::i32)); fixed = true; } } @@ -238,8 +239,8 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { auto* call = callBuilder(args, Type::i32); LocalSet* doCall = builder->makeLocalSet(lowBits, call); LocalSet* setHigh = builder->makeLocalSet( - highBits, builder->makeGlobalGet(INT64_TO_32_HIGH_BITS, i32)); - LocalGet* getLow = builder->makeLocalGet(lowBits, i32); + highBits, builder->makeGlobalGet(INT64_TO_32_HIGH_BITS, Type::i32)); + LocalGet* getLow = builder->makeLocalGet(lowBits, Type::i32); Block* result = builder->blockify(doCall, setHigh, getLow); setOutParam(result, std::move(highBits)); replaceCurrent(result); @@ -289,13 +290,13 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { // Need to remap the local into the new naming scheme, regardless of // the type of the local. curr->index = mappedIndex; - if (curr->type != i64) { + if (curr->type != Type::i64) { return; } - curr->type = i32; + curr->type = Type::i32; TempVar highBits = getTemp(); LocalSet* setHighBits = builder->makeLocalSet( - highBits, builder->makeLocalGet(mappedIndex + 1, i32)); + highBits, builder->makeLocalGet(mappedIndex + 1, Type::i32)); Block* result = builder->blockify(setHighBits, curr); replaceCurrent(result); setOutParam(result, std::move(highBits)); @@ -304,11 +305,11 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { void lowerTee(LocalSet* curr) { TempVar highBits = fetchOutParam(curr->value); TempVar tmp = getTemp(); - curr->type = i32; + curr->type = Type::i32; LocalSet* setLow = builder->makeLocalSet(tmp, curr); LocalSet* setHigh = builder->makeLocalSet( - curr->index + 1, builder->makeLocalGet(highBits, i32)); - LocalGet* getLow = builder->makeLocalGet(tmp, i32); + curr->index + 1, builder->makeLocalGet(highBits, Type::i32)); + LocalGet* getLow = builder->makeLocalGet(tmp, Type::i32); Block* result = builder->blockify(setLow, setHigh, getLow); replaceCurrent(result); setOutParam(result, std::move(highBits)); @@ -327,8 +328,8 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { return; } TempVar highBits = fetchOutParam(curr->value); - auto* setHigh = builder->makeLocalSet(mappedIndex + 1, - builder->makeLocalGet(highBits, i32)); + auto* setHigh = builder->makeLocalSet( + mappedIndex + 1, builder->makeLocalGet(highBits, Type::i32)); Block* result = builder->blockify(curr, setHigh); replaceCurrent(result); } @@ -340,10 +341,10 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { if (!originallyI64Globals.count(curr->name)) { return; } - curr->type = i32; + curr->type = Type::i32; TempVar highBits = getTemp(); LocalSet* setHighBits = builder->makeLocalSet( - highBits, builder->makeGlobalGet(makeHighName(curr->name), i32)); + highBits, builder->makeGlobalGet(makeHighName(curr->name), Type::i32)); Block* result = builder->blockify(setHighBits, curr); replaceCurrent(result); setOutParam(result, std::move(highBits)); @@ -358,12 +359,12 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { } TempVar highBits = fetchOutParam(curr->value); auto* setHigh = builder->makeGlobalSet( - makeHighName(curr->name), builder->makeLocalGet(highBits, i32)); + makeHighName(curr->name), builder->makeLocalGet(highBits, Type::i32)); replaceCurrent(builder->makeSequence(curr, setHigh)); } void visitLoad(Load* curr) { - if (curr->type != i64) { + if (curr->type != Type::i64) { return; } assert(!curr->isAtomic && "atomic load not implemented"); @@ -379,26 +380,27 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { curr->signed_, curr->offset + 4, std::min(uint32_t(curr->align), uint32_t(4)), - builder->makeLocalGet(ptrTemp, i32), - i32)); + builder->makeLocalGet(ptrTemp, Type::i32), + Type::i32)); } else if (curr->signed_) { loadHigh = builder->makeLocalSet( highBits, builder->makeBinary(ShrSInt32, - builder->makeLocalGet(lowBits, i32), + builder->makeLocalGet(lowBits, Type::i32), builder->makeConst(Literal(int32_t(31))))); } else { loadHigh = builder->makeLocalSet(highBits, builder->makeConst(Literal(int32_t(0)))); } - curr->type = i32; + curr->type = Type::i32; curr->bytes = std::min(curr->bytes, uint8_t(4)); curr->align = std::min(uint32_t(curr->align), uint32_t(4)); - curr->ptr = builder->makeLocalGet(ptrTemp, i32); - Block* result = builder->blockify(setPtr, - builder->makeLocalSet(lowBits, curr), - loadHigh, - builder->makeLocalGet(lowBits, i32)); + curr->ptr = builder->makeLocalGet(ptrTemp, Type::i32); + Block* result = + builder->blockify(setPtr, + builder->makeLocalSet(lowBits, curr), + loadHigh, + builder->makeLocalGet(lowBits, Type::i32)); replaceCurrent(result); setOutParam(result, std::move(highBits)); } @@ -413,19 +415,19 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { uint8_t bytes = curr->bytes; curr->bytes = std::min(curr->bytes, uint8_t(4)); curr->align = std::min(uint32_t(curr->align), uint32_t(4)); - curr->valueType = i32; + curr->valueType = Type::i32; if (bytes == 8) { TempVar ptrTemp = getTemp(); LocalSet* setPtr = builder->makeLocalSet(ptrTemp, curr->ptr); - curr->ptr = builder->makeLocalGet(ptrTemp, i32); + curr->ptr = builder->makeLocalGet(ptrTemp, Type::i32); curr->finalize(); Store* storeHigh = builder->makeStore(4, curr->offset + 4, std::min(uint32_t(curr->align), uint32_t(4)), - builder->makeLocalGet(ptrTemp, i32), - builder->makeLocalGet(highBits, i32), - i32); + builder->makeLocalGet(ptrTemp, Type::i32), + builder->makeLocalGet(highBits, Type::i32), + Type::i32); replaceCurrent(builder->blockify(setPtr, curr, storeHigh)); } } @@ -442,7 +444,7 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { if (!getFunction()) { return; // if in a global init, skip - we already handled that. } - if (curr->type != i64) { + if (curr->type != Type::i64) { return; } TempVar highBits = getTemp(); @@ -463,7 +465,7 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { auto* result = builder->makeUnary( EqZInt32, builder->makeBinary( - OrInt32, curr->value, builder->makeLocalGet(highBits, i32))); + OrInt32, curr->value, builder->makeLocalGet(highBits, Type::i32))); replaceCurrent(result); } @@ -485,11 +487,11 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { LocalSet* setHigh = builder->makeLocalSet( highBits, builder->makeBinary(ShrSInt32, - builder->makeLocalGet(lowBits, i32), + builder->makeLocalGet(lowBits, Type::i32), builder->makeConst(Literal(int32_t(31))))); - Block* result = - builder->blockify(setLow, setHigh, builder->makeLocalGet(lowBits, i32)); + Block* result = builder->blockify( + setLow, setHigh, builder->makeLocalGet(lowBits, Type::i32)); setOutParam(result, std::move(highBits)); replaceCurrent(result); @@ -506,15 +508,16 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { // our f64 through memory at address 0 TempVar highBits = getTemp(); Block* result = builder->blockify( - builder->makeCall(ABI::wasm2js::SCRATCH_STORE_F64, {curr->value}, none), + builder->makeCall( + ABI::wasm2js::SCRATCH_STORE_F64, {curr->value}, Type::none), builder->makeLocalSet( highBits, builder->makeCall(ABI::wasm2js::SCRATCH_LOAD_I32, {builder->makeConst(Literal(int32_t(1)))}, - i32)), + Type::i32)), builder->makeCall(ABI::wasm2js::SCRATCH_LOAD_I32, {builder->makeConst(Literal(int32_t(0)))}, - i32)); + Type::i32)); setOutParam(result, std::move(highBits)); replaceCurrent(result); MemoryUtils::ensureExists(getModule()->memory); @@ -528,12 +531,12 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { Block* result = builder->blockify( builder->makeCall(ABI::wasm2js::SCRATCH_STORE_I32, {builder->makeConst(Literal(int32_t(0))), curr->value}, - none), + Type::none), builder->makeCall(ABI::wasm2js::SCRATCH_STORE_I32, {builder->makeConst(Literal(int32_t(1))), - builder->makeLocalGet(highBits, i32)}, - none), - builder->makeCall(ABI::wasm2js::SCRATCH_LOAD_F64, {}, f64)); + builder->makeLocalGet(highBits, Type::i32)}, + Type::none), + builder->makeCall(ABI::wasm2js::SCRATCH_LOAD_F64, {}, Type::f64)); replaceCurrent(result); MemoryUtils::ensureExists(getModule()->memory); ABI::wasm2js::ensureScratchMemoryHelpers(getModule()); @@ -567,7 +570,7 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { u32Max = Literal(((float)UINT_MAX) + 1); trunc = TruncUFloat32ToInt32; convert = ConvertUInt32ToFloat32; - localType = f32; + localType = Type::f32; abs = AbsFloat32; ge = GeFloat32; gt = GtFloat32; @@ -585,7 +588,7 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { u32Max = Literal(((double)UINT_MAX) + 1); trunc = TruncUFloat64ToInt32; convert = ConvertUInt32ToFloat64; - localType = f64; + localType = Type::f64; abs = AbsFloat64; ge = GeFloat64; gt = GtFloat64; @@ -682,12 +685,12 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { builder->makeBinary( AddFloat64, builder->makeUnary(ConvertUInt32ToFloat64, - builder->makeLocalGet(lowBits, i32)), + builder->makeLocalGet(lowBits, Type::i32)), builder->makeBinary( MulFloat64, builder->makeConst(Literal((double)UINT_MAX + 1)), builder->makeUnary(convertHigh, - builder->makeLocalGet(highBits, i32))))); + builder->makeLocalGet(highBits, Type::i32))))); switch (curr->op) { case ConvertSInt64ToFloat32: @@ -711,20 +714,20 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { TempVar firstResult = getTemp(); LocalSet* setFirst = builder->makeLocalSet( firstResult, - builder->makeUnary(op32, builder->makeLocalGet(first, i32))); + builder->makeUnary(op32, builder->makeLocalGet(first, Type::i32))); Binary* check = builder->makeBinary(EqInt32, - builder->makeLocalGet(firstResult, i32), + builder->makeLocalGet(firstResult, Type::i32), builder->makeConst(Literal(int32_t(32)))); If* conditional = builder->makeIf( check, builder->makeBinary( AddInt32, - builder->makeUnary(op32, builder->makeLocalGet(second, i32)), + builder->makeUnary(op32, builder->makeLocalGet(second, Type::i32)), builder->makeConst(Literal(int32_t(32)))), - builder->makeLocalGet(firstResult, i32)); + builder->makeLocalGet(firstResult, Type::i32)); LocalSet* setHigh = builder->makeLocalSet( highResult, builder->makeConst(Literal(int32_t(0)))); @@ -783,7 +786,8 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { if (handleUnreachable(curr)) { return; } - assert(hasOutParam(curr->value) || curr->type == i64 || curr->type == f64); + assert(hasOutParam(curr->value) || curr->type == Type::i64 || + curr->type == Type::f64); switch (curr->op) { case ClzInt64: case CtzInt64: @@ -837,24 +841,24 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { LocalSet* addLow = builder->makeLocalSet( lowResult, builder->makeBinary(AddInt32, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(rightLow, i32))); + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(rightLow, Type::i32))); LocalSet* addHigh = builder->makeLocalSet( highResult, builder->makeBinary(AddInt32, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(rightHigh, i32))); + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(rightHigh, Type::i32))); LocalSet* carryBit = builder->makeLocalSet( highResult, builder->makeBinary(AddInt32, - builder->makeLocalGet(highResult, i32), + builder->makeLocalGet(highResult, Type::i32), builder->makeConst(Literal(int32_t(1))))); - If* checkOverflow = - builder->makeIf(builder->makeBinary(LtUInt32, - builder->makeLocalGet(lowResult, i32), - builder->makeLocalGet(rightLow, i32)), - carryBit); - LocalGet* getLow = builder->makeLocalGet(lowResult, i32); + If* checkOverflow = builder->makeIf( + builder->makeBinary(LtUInt32, + builder->makeLocalGet(lowResult, Type::i32), + builder->makeLocalGet(rightLow, Type::i32)), + carryBit); + LocalGet* getLow = builder->makeLocalGet(lowResult, Type::i32); result = builder->blockify(result, addLow, addHigh, checkOverflow, getLow); setOutParam(result, std::move(highResult)); return result; @@ -871,24 +875,24 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { LocalSet* subLow = builder->makeLocalSet( lowResult, builder->makeBinary(SubInt32, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(rightLow, i32))); + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(rightLow, Type::i32))); LocalSet* borrowBit = builder->makeLocalSet( borrow, builder->makeBinary(LtUInt32, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(rightLow, i32))); + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(rightLow, Type::i32))); LocalSet* subHigh1 = builder->makeLocalSet( highResult, builder->makeBinary(AddInt32, - builder->makeLocalGet(borrow, i32), - builder->makeLocalGet(rightHigh, i32))); + builder->makeLocalGet(borrow, Type::i32), + builder->makeLocalGet(rightHigh, Type::i32))); LocalSet* subHigh2 = builder->makeLocalSet( highResult, builder->makeBinary(SubInt32, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(highResult, i32))); - LocalGet* getLow = builder->makeLocalGet(lowResult, i32); + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(highResult, Type::i32))); + LocalGet* getLow = builder->makeLocalGet(lowResult, Type::i32); result = builder->blockify(result, subLow, borrowBit, subHigh1, subHigh2, getLow); setOutParam(result, std::move(highResult)); @@ -920,11 +924,11 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { builder->makeLocalSet( rightHigh, builder->makeBinary(op32, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(rightHigh, i32))), + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(rightHigh, Type::i32))), builder->makeBinary(op32, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(rightLow, i32))); + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(rightLow, Type::i32))); setOutParam(result, std::move(rightHigh)); return result; } @@ -934,8 +938,8 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { builder->makeLocalSet( highBits, builder->makeBinary(ShlInt32, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(shift, i32))), + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(shift, Type::i32))), builder->makeConst(Literal(int32_t(0)))); } @@ -950,19 +954,19 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { builder->makeLocalSet( highBits, builder->makeBinary(ShrSInt32, - builder->makeLocalGet(leftHigh, i32), + builder->makeLocalGet(leftHigh, Type::i32), builder->makeConst(Literal(int32_t(31))))), builder->makeBinary(ShrSInt32, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(shift, i32))); + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(shift, Type::i32))); } Block* makeLargeShrU(Index highBits, Index leftHigh, Index shift) { return builder->blockify( builder->makeLocalSet(highBits, builder->makeConst(Literal(int32_t(0)))), builder->makeBinary(ShrUInt32, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(shift, i32))); + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(shift, Type::i32))); } Block* makeSmallShl(Index highBits, @@ -975,17 +979,17 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { AndInt32, shiftMask, builder->makeBinary( - ShrUInt32, builder->makeLocalGet(leftLow, i32), widthLessShift)); + ShrUInt32, builder->makeLocalGet(leftLow, Type::i32), widthLessShift)); Binary* shiftHigh = builder->makeBinary(ShlInt32, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(shift, i32)); + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(shift, Type::i32)); return builder->blockify( builder->makeLocalSet( highBits, builder->makeBinary(OrInt32, shiftedInBits, shiftHigh)), builder->makeBinary(ShlInt32, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(shift, i32))); + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(shift, Type::i32))); } // a >> b where `b` < 32 @@ -1003,17 +1007,18 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { Binary* shiftedInBits = builder->makeBinary( ShlInt32, builder->makeBinary( - AndInt32, shiftMask, builder->makeLocalGet(leftHigh, i32)), + AndInt32, shiftMask, builder->makeLocalGet(leftHigh, Type::i32)), widthLessShift); - Binary* shiftLow = builder->makeBinary(ShrUInt32, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(shift, i32)); + Binary* shiftLow = + builder->makeBinary(ShrUInt32, + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(shift, Type::i32)); return builder->blockify( builder->makeLocalSet( highBits, builder->makeBinary(ShrSInt32, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(shift, i32))), + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(shift, Type::i32))), builder->makeBinary(OrInt32, shiftedInBits, shiftLow)); } @@ -1026,17 +1031,18 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { Binary* shiftedInBits = builder->makeBinary( ShlInt32, builder->makeBinary( - AndInt32, shiftMask, builder->makeLocalGet(leftHigh, i32)), + AndInt32, shiftMask, builder->makeLocalGet(leftHigh, Type::i32)), widthLessShift); - Binary* shiftLow = builder->makeBinary(ShrUInt32, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(shift, i32)); + Binary* shiftLow = + builder->makeBinary(ShrUInt32, + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(shift, Type::i32)); return builder->blockify( builder->makeLocalSet( highBits, builder->makeBinary(ShrUInt32, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(shift, i32))), + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(shift, Type::i32))), builder->makeBinary(OrInt32, shiftedInBits, shiftLow)); } @@ -1058,13 +1064,13 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { LocalSet* setShift = builder->makeLocalSet( shift, builder->makeBinary(AndInt32, - builder->makeLocalGet(rightLow, i32), + builder->makeLocalGet(rightLow, Type::i32), builder->makeConst(Literal(int32_t(32 - 1))))); Binary* isLargeShift = builder->makeBinary( LeUInt32, builder->makeConst(Literal(int32_t(32))), builder->makeBinary(AndInt32, - builder->makeLocalGet(rightLow, i32), + builder->makeLocalGet(rightLow, Type::i32), builder->makeConst(Literal(int32_t(64 - 1))))); Block* largeShiftBlock; switch (op) { @@ -1084,12 +1090,12 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { SubInt32, builder->makeBinary(ShlInt32, builder->makeConst(Literal(int32_t(1))), - builder->makeLocalGet(shift, i32)), + builder->makeLocalGet(shift, Type::i32)), builder->makeConst(Literal(int32_t(1)))); Binary* widthLessShift = builder->makeBinary(SubInt32, builder->makeConst(Literal(int32_t(32))), - builder->makeLocalGet(shift, i32)); + builder->makeLocalGet(shift, Type::i32)); Block* smallShiftBlock; switch (op) { case ShlInt64: { @@ -1127,11 +1133,11 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { builder->makeBinary( AndInt32, builder->makeBinary(EqInt32, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(rightLow, i32)), + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(rightLow, Type::i32)), builder->makeBinary(EqInt32, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(rightHigh, i32)))); + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(rightHigh, Type::i32)))); } Block* lowerNe(Block* result, @@ -1144,11 +1150,11 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { builder->makeBinary( OrInt32, builder->makeBinary(NeInt32, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(rightLow, i32)), + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(rightLow, Type::i32)), builder->makeBinary(NeInt32, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(rightHigh, i32)))); + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(rightHigh, Type::i32)))); } Block* lowerUComp(BinaryOp op, @@ -1180,14 +1186,16 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { } Binary* compHigh = builder->makeBinary(highOp, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(rightHigh, i32)); - Binary* eqHigh = builder->makeBinary(EqInt32, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(rightHigh, i32)); - Binary* compLow = builder->makeBinary(lowOp, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(rightLow, i32)); + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(rightHigh, Type::i32)); + Binary* eqHigh = + builder->makeBinary(EqInt32, + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(rightHigh, Type::i32)); + Binary* compLow = + builder->makeBinary(lowOp, + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(rightLow, Type::i32)); return builder->blockify( result, builder->makeBinary( @@ -1227,15 +1235,16 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { } Binary* compHigh1 = builder->makeBinary(highOp1, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(rightHigh, i32)); + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(rightHigh, Type::i32)); Binary* compHigh2 = builder->makeBinary(highOp2, - builder->makeLocalGet(leftHigh, i32), - builder->makeLocalGet(rightHigh, i32)); - Binary* compLow = builder->makeBinary(lowOp, - builder->makeLocalGet(leftLow, i32), - builder->makeLocalGet(rightLow, i32)); + builder->makeLocalGet(leftHigh, Type::i32), + builder->makeLocalGet(rightHigh, Type::i32)); + Binary* compLow = + builder->makeBinary(lowOp, + builder->makeLocalGet(leftLow, Type::i32), + builder->makeLocalGet(rightLow, Type::i32)); If* lowIf = builder->makeIf(compLow, builder->makeConst(Literal(int32_t(0))), builder->makeConst(Literal(int32_t(1)))); @@ -1405,14 +1414,14 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { builder->makeLocalSet( lowBits, builder->makeSelect( - builder->makeLocalGet(cond, i32), curr->ifTrue, curr->ifFalse)), + builder->makeLocalGet(cond, Type::i32), curr->ifTrue, curr->ifFalse)), builder->makeLocalSet( highBits, builder->makeSelect( - builder->makeLocalGet(cond, i32), - builder->makeLocalGet(fetchOutParam(curr->ifTrue), i32), - builder->makeLocalGet(fetchOutParam(curr->ifFalse), i32))), - builder->makeLocalGet(lowBits, i32)); + builder->makeLocalGet(cond, Type::i32), + builder->makeLocalGet(fetchOutParam(curr->ifTrue), Type::i32), + builder->makeLocalGet(fetchOutParam(curr->ifFalse), Type::i32))), + builder->makeLocalGet(lowBits, Type::i32)); setOutParam(result, std::move(highBits)); replaceCurrent(result); } @@ -1433,8 +1442,8 @@ struct I64ToI32Lowering : public WalkerPass<PostWalker<I64ToI32Lowering>> { TempVar highBits = fetchOutParam(curr->value); LocalSet* setLow = builder->makeLocalSet(lowBits, curr->value); GlobalSet* setHigh = builder->makeGlobalSet( - INT64_TO_32_HIGH_BITS, builder->makeLocalGet(highBits, i32)); - curr->value = builder->makeLocalGet(lowBits, i32); + INT64_TO_32_HIGH_BITS, builder->makeLocalGet(highBits, Type::i32)); + curr->value = builder->makeLocalGet(lowBits, Type::i32); Block* result = builder->blockify(setLow, setHigh, curr); replaceCurrent(result); } @@ -1448,7 +1457,7 @@ private: std::unordered_set<Name> originallyI64Globals; Index nextTemp; - TempVar getTemp(Type ty = i32) { + TempVar getTemp(Type ty = Type::i32) { Index ret; auto& freeList = freeTemps[(int)ty]; if (freeList.size() > 0) { @@ -1486,7 +1495,7 @@ private: // unconditionally before themselves, so it is not valid for an if, // in particular. bool handleUnreachable(Expression* curr) { - if (curr->type != unreachable) { + if (curr->type != Type::unreachable) { return false; } std::vector<Expression*> children; @@ -1494,7 +1503,7 @@ private: for (auto* child : ChildIterator(curr)) { if (child->type.isConcrete()) { child = builder->makeDrop(child); - } else if (child->type == unreachable) { + } else if (child->type == Type::unreachable) { hasUnreachable = true; } children.push_back(child); @@ -1505,7 +1514,7 @@ private: // This has an unreachable child, so we can replace it with // the children. auto* block = builder->makeBlock(children); - assert(block->type == unreachable); + assert(block->type == Type::unreachable); replaceCurrent(block); return true; } |