summaryrefslogtreecommitdiff
path: root/src/jit/codegencommon.cpp
diff options
context:
space:
mode:
authorBrian Sullivan <briansul@microsoft.com>2019-01-10 16:29:42 -0800
committerGitHub <noreply@github.com>2019-01-10 16:29:42 -0800
commit459b58a7766707fb059a5762c7d72cb0af42a6ff (patch)
treed6023ccf22ceab28229b1c26d151a62d96c9db44 /src/jit/codegencommon.cpp
parenta2e33937c7cbff1e5eebb7848d8ce7c039812749 (diff)
parent12cfc7fbc6f7f44ba4f32fdfe9168057fc8da5ea (diff)
downloadcoreclr-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/codegencommon.cpp')
-rw-r--r--src/jit/codegencommon.cpp156
1 files changed, 2 insertions, 154 deletions
diff --git a/src/jit/codegencommon.cpp b/src/jit/codegencommon.cpp
index 99dc2904ca..1da1012482 100644
--- a/src/jit/codegencommon.cpp
+++ b/src/jit/codegencommon.cpp
@@ -1708,157 +1708,6 @@ FOUND_AM:
return true;
}
-/*****************************************************************************
-* The condition to use for (the jmp/set for) the given type of operation
-*
-* In case of amd64, this routine should be used when there is no gentree available
-* and one needs to generate jumps based on integer comparisons. When gentree is
-* available always use its overloaded version.
-*
-*/
-
-// static
-emitJumpKind CodeGen::genJumpKindForOper(genTreeOps cmp, CompareKind compareKind)
-{
- const static BYTE genJCCinsSigned[] = {
-#if defined(_TARGET_XARCH_)
- EJ_je, // GT_EQ
- EJ_jne, // GT_NE
- EJ_jl, // GT_LT
- EJ_jle, // GT_LE
- EJ_jge, // GT_GE
- EJ_jg, // GT_GT
- EJ_je, // GT_TEST_EQ
- EJ_jne, // GT_TEST_NE
-#elif defined(_TARGET_ARMARCH_)
- EJ_eq, // GT_EQ
- EJ_ne, // GT_NE
- EJ_lt, // GT_LT
- EJ_le, // GT_LE
- EJ_ge, // GT_GE
- EJ_gt, // GT_GT
-#if defined(_TARGET_ARM64_)
- EJ_eq, // GT_TEST_EQ
- EJ_ne, // GT_TEST_NE
-#endif
-#endif
- };
-
- const static BYTE genJCCinsUnsigned[] = /* unsigned comparison */
- {
-#if defined(_TARGET_XARCH_)
- EJ_je, // GT_EQ
- EJ_jne, // GT_NE
- EJ_jb, // GT_LT
- EJ_jbe, // GT_LE
- EJ_jae, // GT_GE
- EJ_ja, // GT_GT
- EJ_je, // GT_TEST_EQ
- EJ_jne, // GT_TEST_NE
-#elif defined(_TARGET_ARMARCH_)
- EJ_eq, // GT_EQ
- EJ_ne, // GT_NE
- EJ_lo, // GT_LT
- EJ_ls, // GT_LE
- EJ_hs, // GT_GE
- EJ_hi, // GT_GT
-#if defined(_TARGET_ARM64_)
- EJ_eq, // GT_TEST_EQ
- EJ_ne, // GT_TEST_NE
-#endif
-#endif
- };
-
- const static BYTE genJCCinsLogical[] = /* logical operation */
- {
-#if defined(_TARGET_XARCH_)
- EJ_je, // GT_EQ (Z == 1)
- EJ_jne, // GT_NE (Z == 0)
- EJ_js, // GT_LT (S == 1)
- EJ_NONE, // GT_LE
- EJ_jns, // GT_GE (S == 0)
- EJ_NONE, // GT_GT
- EJ_NONE, // GT_TEST_EQ
- EJ_NONE, // GT_TEST_NE
-#elif defined(_TARGET_ARMARCH_)
- EJ_eq, // GT_EQ (Z == 1)
- EJ_ne, // GT_NE (Z == 0)
- EJ_mi, // GT_LT (N == 1)
- EJ_NONE, // GT_LE
- EJ_pl, // GT_GE (N == 0)
- EJ_NONE, // GT_GT
-#if defined(_TARGET_ARM64_)
- EJ_eq, // GT_TEST_EQ
- EJ_ne, // GT_TEST_NE
-#endif
-#endif
- };
-
-#if defined(_TARGET_XARCH_)
- assert(genJCCinsSigned[GT_EQ - GT_EQ] == EJ_je);
- assert(genJCCinsSigned[GT_NE - GT_EQ] == EJ_jne);
- assert(genJCCinsSigned[GT_LT - GT_EQ] == EJ_jl);
- assert(genJCCinsSigned[GT_LE - GT_EQ] == EJ_jle);
- assert(genJCCinsSigned[GT_GE - GT_EQ] == EJ_jge);
- assert(genJCCinsSigned[GT_GT - GT_EQ] == EJ_jg);
- assert(genJCCinsSigned[GT_TEST_EQ - GT_EQ] == EJ_je);
- assert(genJCCinsSigned[GT_TEST_NE - GT_EQ] == EJ_jne);
-
- assert(genJCCinsUnsigned[GT_EQ - GT_EQ] == EJ_je);
- assert(genJCCinsUnsigned[GT_NE - GT_EQ] == EJ_jne);
- assert(genJCCinsUnsigned[GT_LT - GT_EQ] == EJ_jb);
- assert(genJCCinsUnsigned[GT_LE - GT_EQ] == EJ_jbe);
- assert(genJCCinsUnsigned[GT_GE - GT_EQ] == EJ_jae);
- assert(genJCCinsUnsigned[GT_GT - GT_EQ] == EJ_ja);
- assert(genJCCinsUnsigned[GT_TEST_EQ - GT_EQ] == EJ_je);
- assert(genJCCinsUnsigned[GT_TEST_NE - GT_EQ] == EJ_jne);
-
- assert(genJCCinsLogical[GT_EQ - GT_EQ] == EJ_je);
- assert(genJCCinsLogical[GT_NE - GT_EQ] == EJ_jne);
- assert(genJCCinsLogical[GT_LT - GT_EQ] == EJ_js);
- assert(genJCCinsLogical[GT_GE - GT_EQ] == EJ_jns);
-#elif defined(_TARGET_ARMARCH_)
- assert(genJCCinsSigned[GT_EQ - GT_EQ] == EJ_eq);
- assert(genJCCinsSigned[GT_NE - GT_EQ] == EJ_ne);
- assert(genJCCinsSigned[GT_LT - GT_EQ] == EJ_lt);
- assert(genJCCinsSigned[GT_LE - GT_EQ] == EJ_le);
- assert(genJCCinsSigned[GT_GE - GT_EQ] == EJ_ge);
- assert(genJCCinsSigned[GT_GT - GT_EQ] == EJ_gt);
-
- assert(genJCCinsUnsigned[GT_EQ - GT_EQ] == EJ_eq);
- assert(genJCCinsUnsigned[GT_NE - GT_EQ] == EJ_ne);
- assert(genJCCinsUnsigned[GT_LT - GT_EQ] == EJ_lo);
- assert(genJCCinsUnsigned[GT_LE - GT_EQ] == EJ_ls);
- assert(genJCCinsUnsigned[GT_GE - GT_EQ] == EJ_hs);
- assert(genJCCinsUnsigned[GT_GT - GT_EQ] == EJ_hi);
-
- assert(genJCCinsLogical[GT_EQ - GT_EQ] == EJ_eq);
- assert(genJCCinsLogical[GT_NE - GT_EQ] == EJ_ne);
- assert(genJCCinsLogical[GT_LT - GT_EQ] == EJ_mi);
- assert(genJCCinsLogical[GT_GE - GT_EQ] == EJ_pl);
-#else
- assert(!"unknown arch");
-#endif
- assert(GenTree::OperIsCompare(cmp));
-
- emitJumpKind result = EJ_COUNT;
-
- if (compareKind == CK_UNSIGNED)
- {
- result = (emitJumpKind)genJCCinsUnsigned[cmp - GT_EQ];
- }
- else if (compareKind == CK_SIGNED)
- {
- result = (emitJumpKind)genJCCinsSigned[cmp - GT_EQ];
- }
- else if (compareKind == CK_LOGICAL)
- {
- result = (emitJumpKind)genJCCinsLogical[cmp - GT_EQ];
- }
- assert(result != EJ_COUNT);
- return result;
-}
-
#ifdef _TARGET_ARMARCH_
//------------------------------------------------------------------------
// genEmitGSCookieCheck: Generate code to check that the GS cookie
@@ -1899,9 +1748,8 @@ void CodeGen::genEmitGSCookieCheck(bool pushReg)
// Compare with the GC cookie constant
getEmitter()->emitIns_R_R(INS_cmp, EA_PTRSIZE, regGSConst, regGSValue);
- BasicBlock* gsCheckBlk = genCreateTempLabel();
- emitJumpKind jmpEqual = genJumpKindForOper(GT_EQ, CK_SIGNED);
- inst_JMP(jmpEqual, gsCheckBlk);
+ BasicBlock* gsCheckBlk = genCreateTempLabel();
+ inst_JMP(EJ_eq, gsCheckBlk);
// regGSConst and regGSValue aren't needed anymore, we can use them for helper call
genEmitHelperCall(CORINFO_HELP_FAIL_FAST, 0, EA_UNKNOWN, regGSConst);
genDefineTempLabel(gsCheckBlk);