summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Danes <onemihaid@hotmail.com>2016-12-17 20:49:50 +0200
committerMike Danes <onemihaid@hotmail.com>2017-01-17 20:25:20 +0200
commit9bed8735d138e244ca340d7df1253ba6dac4c629 (patch)
treec37e0ca318a09e8e0d7497cd04f356bc943c35b6
parente74c08ecdde10a84af4fa555efbd925f2cc08547 (diff)
downloadcoreclr-9bed8735d138e244ca340d7df1253ba6dac4c629.tar.gz
coreclr-9bed8735d138e244ca340d7df1253ba6dac4c629.tar.bz2
coreclr-9bed8735d138e244ca340d7df1253ba6dac4c629.zip
Add GT_TEST_EQ and GT_TEST_NE
-rw-r--r--src/jit/codegencommon.cpp20
-rw-r--r--src/jit/codegenxarch.cpp4
-rw-r--r--src/jit/gentree.cpp22
-rw-r--r--src/jit/gtlist.h4
-rw-r--r--src/jit/lowerxarch.cpp2
5 files changed, 51 insertions, 1 deletions
diff --git a/src/jit/codegencommon.cpp b/src/jit/codegencommon.cpp
index f42103ebce..0198d950bf 100644
--- a/src/jit/codegencommon.cpp
+++ b/src/jit/codegencommon.cpp
@@ -2475,6 +2475,10 @@ emitJumpKind CodeGen::genJumpKindForOper(genTreeOps cmp, CompareKind compareKind
EJ_jle, // GT_LE
EJ_jge, // GT_GE
EJ_jg, // GT_GT
+#ifndef LEGACY_BACKEND
+ EJ_je, // GT_TEST_EQ
+ EJ_jne, // GT_TEST_NE
+#endif
#elif defined(_TARGET_ARMARCH_)
EJ_eq, // GT_EQ
EJ_ne, // GT_NE
@@ -2494,6 +2498,10 @@ emitJumpKind CodeGen::genJumpKindForOper(genTreeOps cmp, CompareKind compareKind
EJ_jbe, // GT_LE
EJ_jae, // GT_GE
EJ_ja, // GT_GT
+#ifndef LEGACY_BACKEND
+ EJ_je, // GT_TEST_EQ
+ EJ_jne, // GT_TEST_NE
+#endif
#elif defined(_TARGET_ARMARCH_)
EJ_eq, // GT_EQ
EJ_ne, // GT_NE
@@ -2513,6 +2521,10 @@ emitJumpKind CodeGen::genJumpKindForOper(genTreeOps cmp, CompareKind compareKind
EJ_NONE, // GT_LE
EJ_jns, // GT_GE (S == 0)
EJ_NONE, // GT_GT
+#ifndef LEGACY_BACKEND
+ EJ_NONE, // GT_TEST_EQ
+ EJ_NONE, // GT_TEST_NE
+#endif
#elif defined(_TARGET_ARMARCH_)
EJ_eq, // GT_EQ (Z == 1)
EJ_ne, // GT_NE (Z == 0)
@@ -2530,6 +2542,10 @@ emitJumpKind CodeGen::genJumpKindForOper(genTreeOps cmp, CompareKind compareKind
assert(genJCCinsSigned[GT_LE - GT_EQ] == EJ_jle);
assert(genJCCinsSigned[GT_GE - GT_EQ] == EJ_jge);
assert(genJCCinsSigned[GT_GT - GT_EQ] == EJ_jg);
+#ifndef LEGACY_BACKEND
+ assert(genJCCinsSigned[GT_TEST_EQ - GT_EQ] == EJ_je);
+ assert(genJCCinsSigned[GT_TEST_NE - GT_EQ] == EJ_jne);
+#endif
assert(genJCCinsUnsigned[GT_EQ - GT_EQ] == EJ_je);
assert(genJCCinsUnsigned[GT_NE - GT_EQ] == EJ_jne);
@@ -2537,6 +2553,10 @@ emitJumpKind CodeGen::genJumpKindForOper(genTreeOps cmp, CompareKind compareKind
assert(genJCCinsUnsigned[GT_LE - GT_EQ] == EJ_jbe);
assert(genJCCinsUnsigned[GT_GE - GT_EQ] == EJ_jae);
assert(genJCCinsUnsigned[GT_GT - GT_EQ] == EJ_ja);
+#ifndef LEGACY_BACKEND
+ assert(genJCCinsUnsigned[GT_TEST_EQ - GT_EQ] == EJ_je);
+ assert(genJCCinsUnsigned[GT_TEST_NE - GT_EQ] == EJ_jne);
+#endif
assert(genJCCinsLogical[GT_EQ - GT_EQ] == EJ_je);
assert(genJCCinsLogical[GT_NE - GT_EQ] == EJ_jne);
diff --git a/src/jit/codegenxarch.cpp b/src/jit/codegenxarch.cpp
index af004c8fdd..c4d4fb9e36 100644
--- a/src/jit/codegenxarch.cpp
+++ b/src/jit/codegenxarch.cpp
@@ -1779,6 +1779,8 @@ void CodeGen::genCodeForTreeNode(GenTreePtr treeNode)
case GT_LE:
case GT_GE:
case GT_GT:
+ case GT_TEST_EQ:
+ case GT_TEST_NE:
{
// TODO-XArch-CQ: Check if we can use the currently set flags.
// TODO-XArch-CQ: Check for the case where we can simply transfer the carry bit to a register
@@ -6144,7 +6146,7 @@ void CodeGen::genCompareInt(GenTreePtr treeNode)
// By default we use an int32 sized cmp instruction
//
- ins = INS_cmp;
+ ins = ((treeNode->OperGet() == GT_TEST_EQ) || (treeNode->OperGet() == GT_TEST_NE)) ? INS_test : INS_cmp;
var_types cmpType = TYP_INT;
// In the if/then/else statement below we may change the
diff --git a/src/jit/gentree.cpp b/src/jit/gentree.cpp
index fa75f5bcbc..795e6d265b 100644
--- a/src/jit/gentree.cpp
+++ b/src/jit/gentree.cpp
@@ -3375,6 +3375,10 @@ genTreeOps GenTree::ReverseRelop(genTreeOps relop)
GT_GT, // GT_LE
GT_LT, // GT_GE
GT_LE, // GT_GT
+#ifndef LEGACY_BACKEND
+ GT_TEST_NE, // GT_TEST_EQ
+ GT_TEST_EQ, // GT_TEST_NE
+#endif
};
assert(reverseOps[GT_EQ - GT_EQ] == GT_NE);
@@ -3385,6 +3389,11 @@ genTreeOps GenTree::ReverseRelop(genTreeOps relop)
assert(reverseOps[GT_GE - GT_EQ] == GT_LT);
assert(reverseOps[GT_GT - GT_EQ] == GT_LE);
+#ifndef LEGACY_BACKEND
+ assert(reverseOps[GT_TEST_EQ - GT_EQ] == GT_TEST_NE);
+ assert(reverseOps[GT_TEST_NE - GT_EQ] == GT_TEST_EQ);
+#endif
+
assert(OperIsCompare(relop));
assert(relop >= GT_EQ && (unsigned)(relop - GT_EQ) < sizeof(reverseOps));
@@ -3406,6 +3415,10 @@ genTreeOps GenTree::SwapRelop(genTreeOps relop)
GT_GE, // GT_LE
GT_LE, // GT_GE
GT_LT, // GT_GT
+#ifndef LEGACY_BACKEND
+ GT_TEST_EQ, // GT_TEST_EQ
+ GT_TEST_NE, // GT_TEST_NE
+#endif
};
assert(swapOps[GT_EQ - GT_EQ] == GT_EQ);
@@ -3416,6 +3429,11 @@ genTreeOps GenTree::SwapRelop(genTreeOps relop)
assert(swapOps[GT_GE - GT_EQ] == GT_LE);
assert(swapOps[GT_GT - GT_EQ] == GT_LT);
+#ifndef LEGACY_BACKEND
+ assert(swapOps[GT_TEST_EQ - GT_EQ] == GT_TEST_EQ);
+ assert(swapOps[GT_TEST_NE - GT_EQ] == GT_TEST_NE);
+#endif
+
assert(OperIsCompare(relop));
assert(relop >= GT_EQ && (unsigned)(relop - GT_EQ) < sizeof(swapOps));
@@ -10259,6 +10277,10 @@ void Compiler::gtDispNode(GenTreePtr tree, IndentStack* indentStack, __in __in_z
case GT_LE:
case GT_GE:
case GT_GT:
+#ifndef LEGACY_BACKEND
+ case GT_TEST_EQ:
+ case GT_TEST_NE:
+#endif
if (tree->gtFlags & GTF_RELOP_NAN_UN)
{
printf("N");
diff --git a/src/jit/gtlist.h b/src/jit/gtlist.h
index 707ae61215..fb6d8e891f 100644
--- a/src/jit/gtlist.h
+++ b/src/jit/gtlist.h
@@ -145,6 +145,10 @@ GTNODE(LT , "<" ,GenTreeOp ,0,GTK_BINOP|GTK_RE
GTNODE(LE , "<=" ,GenTreeOp ,0,GTK_BINOP|GTK_RELOP)
GTNODE(GE , ">=" ,GenTreeOp ,0,GTK_BINOP|GTK_RELOP)
GTNODE(GT , ">" ,GenTreeOp ,0,GTK_BINOP|GTK_RELOP)
+#ifndef LEGACY_BACKEND
+GTNODE(TEST_EQ , "testEQ" ,GenTreeOp ,0,GTK_BINOP|GTK_RELOP)
+GTNODE(TEST_NE , "testNE" ,GenTreeOp ,0,GTK_BINOP|GTK_RELOP)
+#endif
GTNODE(COMMA , "comma" ,GenTreeOp ,0,GTK_BINOP|GTK_NOTLIR)
diff --git a/src/jit/lowerxarch.cpp b/src/jit/lowerxarch.cpp
index c7d8a09320..844063091d 100644
--- a/src/jit/lowerxarch.cpp
+++ b/src/jit/lowerxarch.cpp
@@ -601,6 +601,8 @@ void Lowering::TreeNodeInfoInit(GenTree* tree)
case GT_LE:
case GT_GE:
case GT_GT:
+ case GT_TEST_EQ:
+ case GT_TEST_NE:
TreeNodeInfoInitCmp(tree);
break;