diff options
author | Pat Gavlin <pgavlin@gmail.com> | 2017-01-19 18:32:36 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-19 18:32:36 +0000 |
commit | 63858068aa77bd5080bb5b589a4a9a8d7a73437b (patch) | |
tree | 1646a40e30750c393a688b5960313c2dc53fdb6f | |
parent | 281b2042e1dcce1786aaad485bf48a42acc50668 (diff) | |
parent | 4cd4acdccd128b811aa7db6c5c0cdc6f6e3c3f2a (diff) | |
download | coreclr-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.cpp | 31 |
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); } //------------------------------------------------------------------------ |