From 89f5e464b7ad8b8f347693d190dc7e475c73ba34 Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Fri, 22 Sep 2017 21:03:40 -0400 Subject: [PATCH] [Arm64/Arm] Favor emitActualTypeSize for non-memory (#14046) * [Arm64/Arm] Favor emitActualTypeSize for non-memory Register ops size is generally referred to by emitActualTypeSize. 'Actual' size refers to the size in register as opposed to size in memory * [Arm64] Remove bogus CQ ToDo * Fix formatting --- src/jit/codegenarm64.cpp | 27 ++++++++++++--------------- src/jit/codegenarmarch.cpp | 29 +++++++++++++++-------------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/jit/codegenarm64.cpp b/src/jit/codegenarm64.cpp index 4ecba7d..20061d4 100644 --- a/src/jit/codegenarm64.cpp +++ b/src/jit/codegenarm64.cpp @@ -1463,7 +1463,7 @@ void CodeGen::genSetRegToConst(regNumber targetReg, var_types targetType, GenTre case GT_CNS_DBL: { emitter* emit = getEmitter(); - emitAttr size = emitTypeSize(tree); + emitAttr size = emitActualTypeSize(tree); GenTreeDblCon* dblConst = tree->AsDblCon(); double constValue = dblConst->gtDblCon.gtDconVal; @@ -1509,7 +1509,7 @@ void CodeGen::genCodeForMulHi(GenTreeOp* treeNode) regNumber targetReg = treeNode->gtRegNum; var_types targetType = treeNode->TypeGet(); emitter* emit = getEmitter(); - emitAttr attr = emitTypeSize(treeNode); + emitAttr attr = emitActualTypeSize(treeNode); unsigned isUnsigned = (treeNode->gtFlags & GTF_UNSIGNED); GenTreePtr op1 = treeNode->gtGetOp1(); @@ -1561,7 +1561,7 @@ void CodeGen::genCodeForBinary(GenTree* treeNode) // The arithmetic node must be sitting in a register (since it's not contained) assert(targetReg != REG_NA); - regNumber r = emit->emitInsTernary(ins, emitTypeSize(treeNode), treeNode, op1, op2); + regNumber r = emit->emitInsTernary(ins, emitActualTypeSize(treeNode), treeNode, op1, op2); assert(r == targetReg); genProduceReg(treeNode); @@ -1798,7 +1798,7 @@ void CodeGen::genReturn(GenTreePtr treeNode) if (movRequired) { - emitAttr attr = emitTypeSize(targetType); + emitAttr attr = emitActualTypeSize(targetType); getEmitter()->emitIns_R_R(INS_mov, attr, retReg, op1->gtRegNum); } } @@ -2184,7 +2184,7 @@ void CodeGen::genCodeForNegNot(GenTree* tree) // The src must be a register. regNumber operandReg = genConsumeReg(operand); - getEmitter()->emitIns_R_R(ins, emitTypeSize(tree), targetReg, operandReg); + getEmitter()->emitIns_R_R(ins, emitActualTypeSize(tree), targetReg, operandReg); genProduceReg(tree); } @@ -2603,7 +2603,7 @@ void CodeGen::genTableBasedSwitch(GenTree* treeNode) getEmitter()->emitIns_R_R_R(INS_add, EA_PTRSIZE, baseReg, baseReg, tmpReg); // br baseReg - getEmitter()->emitIns_R(INS_br, emitTypeSize(TYP_I_IMPL), baseReg); + getEmitter()->emitIns_R(INS_br, emitActualTypeSize(TYP_I_IMPL), baseReg); } // emits the table and an instruction to get the address of the first element @@ -2638,7 +2638,7 @@ void CodeGen::genJumpTable(GenTree* treeNode) // Access to inline data is 'abstracted' by a special type of static member // (produced by eeFindJitDataOffs) which the emitter recognizes as being a reference // to constant data, not a real static field. - getEmitter()->emitIns_R_C(INS_adr, emitTypeSize(TYP_I_IMPL), treeNode->gtRegNum, REG_NA, + getEmitter()->emitIns_R_C(INS_adr, emitActualTypeSize(TYP_I_IMPL), treeNode->gtRegNum, REG_NA, compiler->eeFindJitDataOffs(jmpTabBase), 0); genProduceReg(treeNode); } @@ -2694,7 +2694,7 @@ void CodeGen::genLockedInstructions(GenTreeOp* treeNode) default: unreached(); } - getEmitter()->emitInsBinary(ins, emitTypeSize(data), &i, data); + getEmitter()->emitInsBinary(ins, emitActualTypeSize(data), &i, data); if (treeNode->gtRegNum != REG_NA) { @@ -3130,7 +3130,7 @@ void CodeGen::genIntToFloatCast(GenTreePtr treeNode) genConsumeOperands(treeNode->AsOp()); - getEmitter()->emitIns_R_R(ins, emitTypeSize(dstType), treeNode->gtRegNum, op1->gtRegNum, cvtOption); + getEmitter()->emitIns_R_R(ins, emitActualTypeSize(dstType), treeNode->gtRegNum, op1->gtRegNum, cvtOption); genProduceReg(treeNode); } @@ -3227,9 +3227,6 @@ void CodeGen::genFloatToIntCast(GenTreePtr treeNode) // Assumptions: // GT_CKFINITE node has reserved an internal register. // -// TODO-ARM64-CQ - mark the operand as contained if known to be in -// memory (e.g. field or an array element). -// void CodeGen::genCkfinite(GenTreePtr treeNode) { assert(treeNode->OperGet() == GT_CKFINITE); @@ -3245,8 +3242,8 @@ void CodeGen::genCkfinite(GenTreePtr treeNode) regNumber intReg = treeNode->GetSingleTempReg(); regNumber fpReg = genConsumeReg(op1); - emit->emitIns_R_R(ins_Copy(targetType), emitTypeSize(treeNode), intReg, fpReg); - emit->emitIns_R_R_I(INS_lsr, emitTypeSize(targetType), intReg, intReg, shiftAmount); + emit->emitIns_R_R(ins_Copy(targetType), emitActualTypeSize(treeNode), intReg, fpReg); + emit->emitIns_R_R_I(INS_lsr, emitActualTypeSize(targetType), intReg, intReg, shiftAmount); // Mask of exponent with all 1's and check if the exponent is all 1's emit->emitIns_R_R_I(INS_and, EA_4BYTE, intReg, intReg, expMask); @@ -3259,7 +3256,7 @@ void CodeGen::genCkfinite(GenTreePtr treeNode) // if it is a finite value copy it to targetReg if (treeNode->gtRegNum != fpReg) { - emit->emitIns_R_R(ins_Copy(targetType), emitTypeSize(treeNode), treeNode->gtRegNum, fpReg); + emit->emitIns_R_R(ins_Copy(targetType), emitActualTypeSize(treeNode), treeNode->gtRegNum, fpReg); } genProduceReg(treeNode); } diff --git a/src/jit/codegenarmarch.cpp b/src/jit/codegenarmarch.cpp index 0c609b2..c8848d1 100644 --- a/src/jit/codegenarmarch.cpp +++ b/src/jit/codegenarmarch.cpp @@ -451,7 +451,7 @@ void CodeGen::genIntrinsic(GenTreePtr treeNode) { case CORINFO_INTRINSIC_Abs: genConsumeOperands(treeNode->AsOp()); - getEmitter()->emitInsBinary(INS_ABS, emitTypeSize(treeNode), treeNode, srcNode); + getEmitter()->emitInsBinary(INS_ABS, emitActualTypeSize(treeNode), treeNode, srcNode); break; #ifdef _TARGET_ARM64_ @@ -468,12 +468,12 @@ void CodeGen::genIntrinsic(GenTreePtr treeNode) case CORINFO_INTRINSIC_Round: NYI_ARM("genIntrinsic for round - not implemented yet"); genConsumeOperands(treeNode->AsOp()); - getEmitter()->emitInsBinary(INS_ROUND, emitTypeSize(treeNode), treeNode, srcNode); + getEmitter()->emitInsBinary(INS_ROUND, emitActualTypeSize(treeNode), treeNode, srcNode); break; case CORINFO_INTRINSIC_Sqrt: genConsumeOperands(treeNode->AsOp()); - getEmitter()->emitInsBinary(INS_SQRT, emitTypeSize(treeNode), treeNode, srcNode); + getEmitter()->emitInsBinary(INS_SQRT, emitActualTypeSize(treeNode), treeNode, srcNode); break; default: @@ -1104,7 +1104,7 @@ void CodeGen::genPutArgSplit(GenTreePutArgSplit* treeNode) if (targetReg == addrReg && idx != treeNode->gtNumRegs - 1) { assert(targetReg != baseReg); - emit->emitIns_R_R(INS_mov, emitTypeSize(type), baseReg, addrReg); + emit->emitIns_R_R(INS_mov, emitActualTypeSize(type), baseReg, addrReg); addrReg = baseReg; } @@ -1241,10 +1241,10 @@ void CodeGen::genRangeCheck(GenTreePtr oper) assert(bndsChkType == TYP_INT || bndsChkType == TYP_LONG); // The type of the bounds check should always wide enough to compare against the index. - assert(emitTypeSize(bndsChkType) >= emitTypeSize(genActualType(src1->TypeGet()))); + assert(emitTypeSize(bndsChkType) >= emitActualTypeSize(src1->TypeGet())); #endif // DEBUG - getEmitter()->emitInsBinary(INS_cmp, emitTypeSize(bndsChkType), src1, src2); + getEmitter()->emitInsBinary(INS_cmp, emitActualTypeSize(bndsChkType), src1, src2); genJumpToThrowHlpBlk(jmpKind, SCK_RNGCHK_FAIL, bndsChk->gtIndRngFailBB); } @@ -1482,7 +1482,7 @@ void CodeGen::genCodeForShift(GenTreePtr tree) var_types targetType = tree->TypeGet(); genTreeOps oper = tree->OperGet(); instruction ins = genGetInsForOper(oper, targetType); - emitAttr size = emitTypeSize(tree); + emitAttr size = emitActualTypeSize(tree); assert(tree->gtRegNum != REG_NA); @@ -1612,7 +1612,7 @@ void CodeGen::genCodeForIndexAddr(GenTreeIndexAddr* node) #endif // Generate the range check. - getEmitter()->emitInsBinary(INS_cmp, emitTypeSize(TYP_I_IMPL), index, &arrLen); + getEmitter()->emitInsBinary(INS_cmp, emitActualTypeSize(TYP_I_IMPL), index, &arrLen); genJumpToThrowHlpBlk(genJumpKindForOper(GT_GE, CK_UNSIGNED), SCK_RNGCHK_FAIL, node->gtIndRngFailBB); } @@ -1621,7 +1621,8 @@ void CodeGen::genCodeForIndexAddr(GenTreeIndexAddr* node) { case 1: // dest = base + index - getEmitter()->emitIns_R_R_R(INS_add, emitTypeSize(node), node->gtRegNum, base->gtRegNum, index->gtRegNum); + getEmitter()->emitIns_R_R_R(INS_add, emitActualTypeSize(node), node->gtRegNum, base->gtRegNum, + index->gtRegNum); break; case 2: @@ -1633,7 +1634,7 @@ void CodeGen::genCodeForIndexAddr(GenTreeIndexAddr* node) BitScanForward(&lsl, node->gtElemSize); // dest = base + index * scale - genScaledAdd(emitTypeSize(node), node->gtRegNum, base->gtRegNum, index->gtRegNum, lsl); + genScaledAdd(emitActualTypeSize(node), node->gtRegNum, base->gtRegNum, index->gtRegNum, lsl); break; } @@ -1643,14 +1644,14 @@ void CodeGen::genCodeForIndexAddr(GenTreeIndexAddr* node) CodeGen::genSetRegToIcon(tmpReg, (ssize_t)node->gtElemSize, TYP_INT); // dest = index * tmp + base - getEmitter()->emitIns_R_R_R_R(INS_MULADD, emitTypeSize(node), node->gtRegNum, index->gtRegNum, tmpReg, + getEmitter()->emitIns_R_R_R_R(INS_MULADD, emitActualTypeSize(node), node->gtRegNum, index->gtRegNum, tmpReg, base->gtRegNum); break; } } // dest = dest + elemOffs - getEmitter()->emitIns_R_R_I(INS_add, emitTypeSize(node), node->gtRegNum, node->gtRegNum, node->gtElemOffset); + getEmitter()->emitIns_R_R_I(INS_add, emitActualTypeSize(node), node->gtRegNum, node->gtRegNum, node->gtElemOffset); gcInfo.gcMarkRegSetNpt(base->gtGetRegMask()); @@ -3058,12 +3059,12 @@ void CodeGen::genFloatToFloatCast(GenTreePtr treeNode) insOpts cvtOption = (srcType == TYP_FLOAT) ? INS_OPTS_S_TO_D // convert Single to Double : INS_OPTS_D_TO_S; // convert Double to Single - getEmitter()->emitIns_R_R(INS_fcvt, emitTypeSize(treeNode), treeNode->gtRegNum, op1->gtRegNum, cvtOption); + getEmitter()->emitIns_R_R(INS_fcvt, emitActualTypeSize(treeNode), treeNode->gtRegNum, op1->gtRegNum, cvtOption); } else if (treeNode->gtRegNum != op1->gtRegNum) { // If double to double cast or float to float cast. Emit a move instruction. - getEmitter()->emitIns_R_R(INS_mov, emitTypeSize(treeNode), treeNode->gtRegNum, op1->gtRegNum); + getEmitter()->emitIns_R_R(INS_mov, emitActualTypeSize(treeNode), treeNode->gtRegNum, op1->gtRegNum); } #endif // _TARGET_* -- 2.7.4