summaryrefslogtreecommitdiff
path: root/src/jit
diff options
context:
space:
mode:
authorHyung-Kyu Choi <hk0110.choi@samsung.com>2016-12-13 15:27:01 +0900
committerHyung-Kyu Choi <hk0110.choi@samsung.com>2016-12-13 15:33:55 +0900
commit04689b1b87d1cca78649066b79e8317f1e0cfd92 (patch)
tree2e66ab149c3e6e5d4a912581d70e9eb6fd340867 /src/jit
parent04d6bd105ade5f6189a15a6dbb59b082613429a1 (diff)
downloadcoreclr-04689b1b87d1cca78649066b79e8317f1e0cfd92.tar.gz
coreclr-04689b1b87d1cca78649066b79e8317f1e0cfd92.tar.bz2
coreclr-04689b1b87d1cca78649066b79e8317f1e0cfd92.zip
Ryujit/ARM32 Initial Lowering::IsContainableImmed for ARM
Initial implementation of IsContainableImmed for ARM. Signed-off-by: Hyung-Kyu Choi <hk0110.choi@samsung.com>
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 67cea2ff4e..212126303e 100644
--- a/src/jit/lowerarm.cpp
+++ b/src/jit/lowerarm.cpp
@@ -62,7 +62,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;
}