summaryrefslogtreecommitdiff
path: root/src/jit
diff options
context:
space:
mode:
authorBruce Forstall <brucefo@microsoft.com>2016-12-13 15:59:02 -0800
committerGitHub <noreply@github.com>2016-12-13 15:59:02 -0800
commit71d73fc56b9dc295d1f9ffcc7882e8b0765d10d6 (patch)
treec7e2a70bddbfeae0c29237e4b7acc6e29aa1fd37 /src/jit
parente8e2adfb61834873477e0f154eab90252d6a6047 (diff)
parent04689b1b87d1cca78649066b79e8317f1e0cfd92 (diff)
downloadcoreclr-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.cpp68
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;
}