summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPat Gavlin <pgavlin@gmail.com>2017-01-19 18:32:36 +0000
committerGitHub <noreply@github.com>2017-01-19 18:32:36 +0000
commit63858068aa77bd5080bb5b589a4a9a8d7a73437b (patch)
tree1646a40e30750c393a688b5960313c2dc53fdb6f
parent281b2042e1dcce1786aaad485bf48a42acc50668 (diff)
parent4cd4acdccd128b811aa7db6c5c0cdc6f6e3c3f2a (diff)
downloadcoreclr-63858068aa77bd5080bb5b589a4a9a8d7a73437b.tar.gz
coreclr-63858068aa77bd5080bb5b589a4a9a8d7a73437b.tar.bz2
coreclr-63858068aa77bd5080bb5b589a4a9a8d7a73437b.zip
Merge pull request #8731 from mskvortsov/arm32-set-reg-to-cond
RyuJIT/ARM32: genSetRegToCond implementation
-rw-r--r--src/jit/codegenarm.cpp31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/jit/codegenarm.cpp b/src/jit/codegenarm.cpp
index e759e5692b..2dab942329 100644
--- a/src/jit/codegenarm.cpp
+++ b/src/jit/codegenarm.cpp
@@ -1383,12 +1383,41 @@ void CodeGen::genLeaInstruction(GenTreeAddrMode* lea)
//------------------------------------------------------------------------
// genSetRegToCond: Generate code to materialize a condition into a register.
//
+// Arguments:
+// dstReg - The target register to set to 1 or 0
+// tree - The GenTree Relop node that was used to set the Condition codes
+//
+// Return Value: none
+//
// Preconditions:
// The condition codes must already have been appropriately set.
//
void CodeGen::genSetRegToCond(regNumber dstReg, GenTreePtr tree)
{
- NYI("genSetRegToCond");
+ // Emit code like that:
+ // ...
+ // bgt True
+ // movs rD, #0
+ // b Next
+ // True:
+ // movs rD, #1
+ // Next:
+ // ...
+
+ CompareKind compareKind = ((tree->gtFlags & GTF_UNSIGNED) != 0) ? CK_UNSIGNED : CK_SIGNED;
+ emitJumpKind jmpKind = genJumpKindForOper(tree->gtOper, compareKind);
+
+ BasicBlock* labelTrue = genCreateTempLabel();
+ getEmitter()->emitIns_J(emitter::emitJumpKindToIns(jmpKind), labelTrue);
+
+ getEmitter()->emitIns_R_I(INS_mov, emitActualTypeSize(tree->gtType), dstReg, 0);
+
+ BasicBlock* labelNext = genCreateTempLabel();
+ getEmitter()->emitIns_J(INS_b, labelNext);
+
+ genDefineTempLabel(labelTrue);
+ getEmitter()->emitIns_R_I(INS_mov, emitActualTypeSize(tree->gtType), dstReg, 1);
+ genDefineTempLabel(labelNext);
}
//------------------------------------------------------------------------