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/codegencommon.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/codegencommon.cpp')
-rw-r--r-- | src/jit/codegencommon.cpp | 156 |
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); |