summaryrefslogtreecommitdiff
path: root/src/jit
diff options
context:
space:
mode:
authorHanjoung Lee <hanjoung.lee@samsung.com>2017-06-07 19:12:19 +0900
committerHanjoung Lee <hanjoung.lee@samsung.com>2017-06-08 12:04:03 +0900
commit2b3d55acdd920e9bb221830f2c16bff9f14f3ce2 (patch)
treea1135522efef553ee518377316ada62df201fcf5 /src/jit
parent06c08437ea63aae067d3a7510c00965864532ef7 (diff)
downloadcoreclr-2b3d55acdd920e9bb221830f2c16bff9f14f3ce2.tar.gz
coreclr-2b3d55acdd920e9bb221830f2c16bff9f14f3ce2.tar.bz2
coreclr-2b3d55acdd920e9bb221830f2c16bff9f14f3ce2.zip
[RyuJIT/armel] Support putting floating-point args
- Make Lowering and LSRA be aware of armel argument push convention. - Implement codegen for GT_COPY that was newly created from `LowerArg()`. - Only `float` type is supported. (`double` is not supported yet.) Fix #11928
Diffstat (limited to 'src/jit')
-rw-r--r--src/jit/codegenarmarch.cpp25
-rw-r--r--src/jit/lower.cpp4
-rw-r--r--src/jit/lsra.cpp19
-rw-r--r--src/jit/lsraarm.cpp1
4 files changed, 43 insertions, 6 deletions
diff --git a/src/jit/codegenarmarch.cpp b/src/jit/codegenarmarch.cpp
index dc0503a34c..4f4bdc567e 100644
--- a/src/jit/codegenarmarch.cpp
+++ b/src/jit/codegenarmarch.cpp
@@ -1501,10 +1501,31 @@ void CodeGen::genRegCopy(GenTree* treeNode)
if (varTypeIsFloating(treeNode) != varTypeIsFloating(op1))
{
- NYI_ARM("genRegCopy floating point");
#ifdef _TARGET_ARM64_
inst_RV_RV(INS_fmov, targetReg, genConsumeReg(op1), targetType);
-#endif // _TARGET_ARM64_
+#else // !_TARGET_ARM64_
+ if (varTypeIsFloating(treeNode))
+ {
+ NYI_ARM("genRegCopy from 'int' to 'float'");
+ }
+ else
+ {
+ assert(varTypeIsFloating(op1));
+
+ if (op1->TypeGet() == TYP_FLOAT)
+ {
+ inst_RV_RV(INS_vmov_f2i, targetReg, genConsumeReg(op1), targetType);
+ }
+ else
+ {
+ // TODO-Arm-Bug: We cannot assume the second destination be the next of targetReg
+ // since LSRA doesn't know that register is used. So we cannot write code like:
+ //
+ // inst_RV_RV_RV(INS_vmov_d2i, targetReg, REG_NEXT(targetReg), genConsumeReg(op1), EA_8BYTE);
+ NYI_ARM("genRegCopy from 'double' to 'int'+'int'");
+ }
+ }
+#endif // !_TARGET_ARM64_
}
else
{
diff --git a/src/jit/lower.cpp b/src/jit/lower.cpp
index 5c46d3d235..3ba892cbda 100644
--- a/src/jit/lower.cpp
+++ b/src/jit/lower.cpp
@@ -1187,10 +1187,10 @@ void Lowering::LowerArg(GenTreeCall* call, GenTreePtr* ppArg)
#endif // !defined(_TARGET_64BIT_)
{
-#ifdef _TARGET_ARM64_
+#ifdef _TARGET_ARMARCH_
// For vararg call, reg args should be all integer.
// Insert a copy to move float value to integer register.
- if (call->IsVarargs() && varTypeIsFloating(type))
+ if ((call->IsVarargs() || comp->opts.compUseSoftFP) && varTypeIsFloating(type))
{
var_types intType = (type == TYP_DOUBLE) ? TYP_LONG : TYP_INT;
GenTreePtr intArg = comp->gtNewOperNode(GT_COPY, intType, arg);
diff --git a/src/jit/lsra.cpp b/src/jit/lsra.cpp
index cd21bca6bc..7cbfa51a82 100644
--- a/src/jit/lsra.cpp
+++ b/src/jit/lsra.cpp
@@ -2205,6 +2205,12 @@ void LinearScan::identifyCandidates()
{
varDsc->lvLRACandidate = 0;
}
+#ifdef ARM_SOFTFP
+ if (varDsc->lvIsParam && varDsc->lvIsRegArg)
+ {
+ type = (type == TYP_DOUBLE) ? TYP_LONG : TYP_INT;
+ }
+#endif // ARM_SOFTFP
break;
#endif // CPU_HAS_FP_SUPPORT
@@ -4377,7 +4383,7 @@ void LinearScan::updateRegStateForArg(LclVarDsc* argDsc)
#ifndef _TARGET_AMD64_
&& !compiler->info.compIsVarArgs
#endif
- );
+ && !compiler->opts.compUseSoftFP);
if (argDsc->lvIsHfaRegArg())
{
@@ -10327,7 +10333,16 @@ void TreeNodeInfo::Initialize(LinearScan* lsra, GenTree* node, LsraLocation loca
// TODO-Cleanup: get rid of those NOPs.
if (node->gtRegNum == REG_NA || node->gtOper == GT_NOP)
{
- dstCandidates = lsra->allRegs(node->TypeGet());
+#ifdef ARM_SOFTFP
+ if (node->OperGet() == GT_PUTARG_REG)
+ {
+ dstCandidates = lsra->allRegs(TYP_INT);
+ }
+ else
+#endif
+ {
+ dstCandidates = lsra->allRegs(node->TypeGet());
+ }
}
else
{
diff --git a/src/jit/lsraarm.cpp b/src/jit/lsraarm.cpp
index e480aa6d34..275ad1fc10 100644
--- a/src/jit/lsraarm.cpp
+++ b/src/jit/lsraarm.cpp
@@ -750,6 +750,7 @@ void Lowering::TreeNodeInfoInit(GenTree* tree)
case GT_SETCC:
case GT_MEMORYBARRIER:
case GT_OBJ:
+ case GT_COPY:
info->dstCount = tree->IsValue() ? 1 : 0;
if (kind & (GTK_CONST | GTK_LEAF))
{