diff options
Diffstat (limited to 'src/jit/emitarm64.cpp')
-rw-r--r-- | src/jit/emitarm64.cpp | 32 |
1 files changed, 9 insertions, 23 deletions
diff --git a/src/jit/emitarm64.cpp b/src/jit/emitarm64.cpp index 93994e7918..0328cb6712 100644 --- a/src/jit/emitarm64.cpp +++ b/src/jit/emitarm64.cpp @@ -10809,9 +10809,7 @@ void emitter::emitInsLoadStoreOp(instruction ins, emitAttr attr, regNumber dataR if (offset != 0) { - regMaskTP tmpRegMask = indir->gtRsvdRegs; - regNumber tmpReg = genRegNumFromMask(tmpRegMask); - noway_assert(tmpReg != REG_NA); + regNumber tmpReg = indir->GetSingleTempReg(); emitAttr addType = varTypeIsGC(memBase) ? EA_BYREF : EA_PTRSIZE; @@ -10833,7 +10831,6 @@ void emitter::emitInsLoadStoreOp(instruction ins, emitAttr attr, regNumber dataR // Then load/store dataReg from/to [tmpReg + offset] emitIns_R_R_I(ins, ldstAttr, dataReg, tmpReg, offset); - ; } else // large offset { @@ -10874,9 +10871,7 @@ void emitter::emitInsLoadStoreOp(instruction ins, emitAttr attr, regNumber dataR else { // We require a tmpReg to hold the offset - regMaskTP tmpRegMask = indir->gtRsvdRegs; - regNumber tmpReg = genRegNumFromMask(tmpRegMask); - noway_assert(tmpReg != REG_NA); + regNumber tmpReg = indir->GetSingleTempReg(); // First load/store tmpReg with the large offset constant codeGen->instGen_Set_Reg_To_Imm(EA_PTRSIZE, tmpReg, offset); @@ -11047,9 +11042,8 @@ regNumber emitter::emitInsTernary(instruction ins, emitAttr attr, GenTree* dst, assert(!src1->isContained()); } } - bool isMulOverflow = false; - bool isUnsignedMul = false; - regNumber extraReg = REG_NA; + + bool isMulOverflow = false; if (dst->gtOverflowEx()) { if (ins == INS_add) @@ -11063,7 +11057,6 @@ regNumber emitter::emitInsTernary(instruction ins, emitAttr attr, GenTree* dst, else if (ins == INS_mul) { isMulOverflow = true; - isUnsignedMul = ((dst->gtFlags & GTF_UNSIGNED) != 0); assert(intConst == nullptr); // overflow format doesn't support an int constant operand } else @@ -11079,17 +11072,10 @@ regNumber emitter::emitInsTernary(instruction ins, emitAttr attr, GenTree* dst, { if (isMulOverflow) { - // Make sure that we have an internal register - assert(genCountBits(dst->gtRsvdRegs) == 2); - - // There will be two bits set in tmpRegsMask. - // Remove the bit for 'dst->gtRegNum' from 'tmpRegsMask' - regMaskTP tmpRegsMask = dst->gtRsvdRegs & ~genRegMask(dst->gtRegNum); - assert(tmpRegsMask != RBM_NONE); - regMaskTP tmpRegMask = genFindLowestBit(tmpRegsMask); // set tmpRegMsk to a one-bit mask - extraReg = genRegNumFromMask(tmpRegMask); // set tmpReg from that mask + regNumber extraReg = dst->GetSingleTempReg(); + assert(extraReg != dst->gtRegNum); - if (isUnsignedMul) + if ((dst->gtFlags & GTF_UNSIGNED) != 0) { if (attr == EA_4BYTE) { @@ -11109,7 +11095,7 @@ regNumber emitter::emitInsTernary(instruction ins, emitAttr attr, GenTree* dst, emitIns_R_R_R(ins, attr, dst->gtRegNum, src1->gtRegNum, src2->gtRegNum); } - // zero-sign bit comparision to detect overflow. + // zero-sign bit comparison to detect overflow. emitIns_R_I(INS_cmp, attr, extraReg, 0); } else @@ -11137,7 +11123,7 @@ regNumber emitter::emitInsTernary(instruction ins, emitAttr attr, GenTree* dst, bitShift = 63; } - // Sign bit comparision to detect overflow. + // Sign bit comparison to detect overflow. emitIns_R_R_I(INS_cmp, attr, extraReg, dst->gtRegNum, bitShift, INS_OPTS_ASR); } } |