diff options
author | Brian Sullivan <briansul@microsoft.com> | 2019-01-10 16:29:42 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-10 16:29:42 -0800 |
commit | 459b58a7766707fb059a5762c7d72cb0af42a6ff (patch) | |
tree | d6023ccf22ceab28229b1c26d151a62d96c9db44 /src/jit/lower.cpp | |
parent | a2e33937c7cbff1e5eebb7848d8ce7c039812749 (diff) | |
parent | 12cfc7fbc6f7f44ba4f32fdfe9168057fc8da5ea (diff) | |
download | coreclr-459b58a7766707fb059a5762c7d72cb0af42a6ff.tar.gz coreclr-459b58a7766707fb059a5762c7d72cb0af42a6ff.tar.bz2 coreclr-459b58a7766707fb059a5762c7d72cb0af42a6ff.zip |
Merge pull request #17733 from mikedn/cc-cond2
Expand GT_JCC/SETCC condition support
Diffstat (limited to 'src/jit/lower.cpp')
-rw-r--r-- | src/jit/lower.cpp | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/src/jit/lower.cpp b/src/jit/lower.cpp index 2ea2c9a5cf..55f44a71e0 100644 --- a/src/jit/lower.cpp +++ b/src/jit/lower.cpp @@ -914,16 +914,16 @@ bool Lowering::TryLowerSwitchToBitTest( // Rewire the blocks as needed and figure out the condition to use for JCC. // - genTreeOps bbSwitchCondition = GT_NONE; - bbSwitch->bbJumpKind = BBJ_COND; + GenCondition bbSwitchCondition; + bbSwitch->bbJumpKind = BBJ_COND; comp->fgRemoveAllRefPreds(bbCase1, bbSwitch); comp->fgRemoveAllRefPreds(bbCase0, bbSwitch); if (bbSwitch->bbNext == bbCase0) { - // GT_LT + GTF_UNSIGNED generates JC so we jump to bbCase1 when the bit is set - bbSwitchCondition = GT_LT; + // GenCondition::C generates JC so we jump to bbCase1 when the bit is set + bbSwitchCondition = GenCondition::C; bbSwitch->bbJumpDest = bbCase1; comp->fgAddRefPred(bbCase0, bbSwitch); @@ -933,8 +933,8 @@ bool Lowering::TryLowerSwitchToBitTest( { assert(bbSwitch->bbNext == bbCase1); - // GT_GE + GTF_UNSIGNED generates JNC so we jump to bbCase0 when the bit is not set - bbSwitchCondition = GT_GE; + // GenCondition::NC generates JNC so we jump to bbCase0 when the bit is not set + bbSwitchCondition = GenCondition::NC; bbSwitch->bbJumpDest = bbCase0; comp->fgAddRefPred(bbCase0, bbSwitch); @@ -950,7 +950,7 @@ bool Lowering::TryLowerSwitchToBitTest( GenTree* bitTest = comp->gtNewOperNode(GT_BT, TYP_VOID, bitTableIcon, switchValue); bitTest->gtFlags |= GTF_SET_FLAGS; GenTreeCC* jcc = new (comp, GT_JCC) GenTreeCC(GT_JCC, bbSwitchCondition); - jcc->gtFlags |= GTF_UNSIGNED | GTF_USE_FLAGS; + jcc->gtFlags |= GTF_USE_FLAGS; LIR::AsRange(bbSwitch).InsertAfter(switchValue, bitTableIcon, bitTest, jcc); @@ -2523,8 +2523,8 @@ GenTree* Lowering::DecomposeLongCompare(GenTree* cmp) GenTree* jcc = cmpUse.User(); jcc->gtOp.gtOp1 = nullptr; jcc->ChangeOper(GT_JCC); - jcc->gtFlags |= (cmp->gtFlags & GTF_UNSIGNED) | GTF_USE_FLAGS; - jcc->AsCC()->gtCondition = condition; + jcc->gtFlags |= GTF_USE_FLAGS; + jcc->AsCC()->gtCondition = GenCondition::FromIntegralRelop(condition, cmp->IsUnsigned()); } else { @@ -2532,7 +2532,7 @@ GenTree* Lowering::DecomposeLongCompare(GenTree* cmp) cmp->gtOp.gtOp2 = nullptr; cmp->ChangeOper(GT_SETCC); cmp->gtFlags |= GTF_USE_FLAGS; - cmp->AsCC()->gtCondition = condition; + cmp->AsCC()->gtCondition = GenCondition::FromIntegralRelop(condition, cmp->IsUnsigned()); } return cmp->gtNext; @@ -2734,7 +2734,7 @@ GenTree* Lowering::OptimizeConstCompare(GenTree* cmp) if (lsh->OperIs(GT_LSH) && varTypeIsIntOrI(lsh->TypeGet()) && lsh->gtGetOp1()->IsIntegralConst(1) && BlockRange().TryGetUse(cmp, &cmpUse)) { - genTreeOps condition = cmp->OperIs(GT_TEST_NE) ? GT_LT : GT_GE; + GenCondition condition = cmp->OperIs(GT_TEST_NE) ? GenCondition::C : GenCondition::NC; cmp->SetOper(GT_BT); cmp->gtType = TYP_VOID; @@ -2760,7 +2760,7 @@ GenTree* Lowering::OptimizeConstCompare(GenTree* cmp) cmpUse.ReplaceWith(comp, cc); } - cc->gtFlags |= GTF_USE_FLAGS | GTF_UNSIGNED; + cc->gtFlags |= GTF_USE_FLAGS; return cmp->gtNext; } @@ -2817,10 +2817,10 @@ GenTree* Lowering::OptimizeConstCompare(GenTree* cmp) ccOp = GT_SETCC; } - genTreeOps condition = cmp->OperGet(); + GenCondition condition = GenCondition::FromIntegralRelop(cmp); cc->ChangeOper(ccOp); cc->AsCC()->gtCondition = condition; - cc->gtFlags |= GTF_USE_FLAGS | (cmp->gtFlags & GTF_UNSIGNED); + cc->gtFlags |= GTF_USE_FLAGS; return next; } |