diff options
author | Bruce Forstall <brucefo@microsoft.com> | 2016-12-13 15:59:02 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-13 15:59:02 -0800 |
commit | 71d73fc56b9dc295d1f9ffcc7882e8b0765d10d6 (patch) | |
tree | c7e2a70bddbfeae0c29237e4b7acc6e29aa1fd37 /src/jit | |
parent | e8e2adfb61834873477e0f154eab90252d6a6047 (diff) | |
parent | 04689b1b87d1cca78649066b79e8317f1e0cfd92 (diff) | |
download | coreclr-71d73fc56b9dc295d1f9ffcc7882e8b0765d10d6.tar.gz coreclr-71d73fc56b9dc295d1f9ffcc7882e8b0765d10d6.tar.bz2 coreclr-71d73fc56b9dc295d1f9ffcc7882e8b0765d10d6.zip |
Merge pull request #8617 from hqueue/arm/test20161210/IsContainableImmed
Ryujit/ARM32 Initial Lowering::IsContainableImmed for ARM
Diffstat (limited to 'src/jit')
-rw-r--r-- | src/jit/lowerarm.cpp | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/src/jit/lowerarm.cpp b/src/jit/lowerarm.cpp index 9092029797..5bf23c4199 100644 --- a/src/jit/lowerarm.cpp +++ b/src/jit/lowerarm.cpp @@ -128,7 +128,73 @@ bool Lowering::IsCallTargetInRange(void* addr) // return true if the immediate can be folded into an instruction, for example small enough and non-relocatable bool Lowering::IsContainableImmed(GenTree* parentNode, GenTree* childNode) { - NYI_ARM("ARM IsContainableImmed"); + if (varTypeIsFloating(parentNode->TypeGet())) + { + // TODO-ARM-Cleanup: not tested yet. + NYI_ARM("ARM IsContainableImmed for floating point type"); + + // We can contain a floating point 0.0 constant in a compare instruction + switch (parentNode->OperGet()) + { + default: + return false; + + case GT_EQ: + case GT_NE: + case GT_LT: + case GT_LE: + case GT_GE: + case GT_GT: + if (childNode->IsIntegralConst(0)) + return true; + break; + } + } + else + { + // Make sure we have an actual immediate + if (!childNode->IsCnsIntOrI()) + return false; + if (childNode->IsIconHandle() && comp->opts.compReloc) + return false; + + ssize_t immVal = childNode->gtIntCon.gtIconVal; + emitAttr attr = emitActualTypeSize(childNode->TypeGet()); + emitAttr size = EA_SIZE(attr); + + switch (parentNode->OperGet()) + { + default: + return false; + + case GT_ADD: + case GT_SUB: + if (emitter::emitIns_valid_imm_for_add(immVal, INS_FLAGS_DONT_CARE)) + return true; + break; + + case GT_EQ: + case GT_NE: + case GT_LT: + case GT_LE: + case GT_GE: + case GT_GT: + case GT_AND: + case GT_OR: + case GT_XOR: + if (emitter::emitIns_valid_imm_for_alu(immVal)) + return true; + break; + + case GT_STORE_LCL_VAR: + // TODO-ARM-Cleanup: not tested yet + NYI_ARM("ARM IsContainableImmed for GT_STORE_LCL_VAR"); + if (immVal == 0) + return true; + break; + } + } + return false; } |