summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve MacLean <sdmaclea.qdt@qualcommdatacenter.com>2017-11-06 16:59:42 -0500
committerSteve MacLean <sdmaclea.qdt@qualcommdatacenter.com>2017-11-08 11:38:56 -0500
commitfd80667cc42b09aa04311b9f19d6b261f0554ef5 (patch)
treeee5b2ada4bc32343fdbf8046c2476bb1666e2165
parent661ee8f407deec5a36011fdcce8f68cf68266823 (diff)
downloadcoreclr-fd80667cc42b09aa04311b9f19d6b261f0554ef5.tar.gz
coreclr-fd80667cc42b09aa04311b9f19d6b261f0554ef5.tar.bz2
coreclr-fd80667cc42b09aa04311b9f19d6b261f0554ef5.zip
[Arm64] SIMD genPutArgStk
-rw-r--r--src/jit/codegenarmarch.cpp16
-rw-r--r--src/jit/lower.cpp2
-rw-r--r--src/jit/lsraarmarch.cpp1
3 files changed, 18 insertions, 1 deletions
diff --git a/src/jit/codegenarmarch.cpp b/src/jit/codegenarmarch.cpp
index 758dd0b931..06e8896c54 100644
--- a/src/jit/codegenarmarch.cpp
+++ b/src/jit/codegenarmarch.cpp
@@ -587,6 +587,22 @@ void CodeGen::genPutArgStk(GenTreePutArgStk* treeNode)
bool isStruct = (targetType == TYP_STRUCT) || (source->OperGet() == GT_FIELD_LIST);
+ if (varTypeIsSIMD(targetType))
+ {
+ assert(!source->isContained());
+
+ regNumber srcReg = genConsumeReg(source);
+
+ emitAttr storeAttr = emitTypeSize(targetType);
+
+ assert((srcReg != REG_NA) && (genIsValidFloatReg(srcReg)));
+ emit->emitIns_S_R(INS_str, storeAttr, srcReg, varNumOut, argOffsetOut);
+
+ argOffsetOut += EA_SIZE_IN_BYTES(storeAttr);
+ assert(argOffsetOut <= argOffsetMax); // We can't write beyound the outgoing area area
+ return;
+ }
+
if (!isStruct) // a normal non-Struct argument
{
instruction storeIns = ins_Store(targetType);
diff --git a/src/jit/lower.cpp b/src/jit/lower.cpp
index ce99e4d5b5..b8f0403a25 100644
--- a/src/jit/lower.cpp
+++ b/src/jit/lower.cpp
@@ -836,7 +836,7 @@ GenTreePtr Lowering::NewPutArg(GenTreeCall* call, GenTreePtr arg, fgArgTabEntryP
#ifdef _TARGET_ARMARCH_
// Mark contained when we pass struct
// GT_FIELD_LIST is always marked conatained when it is generated
- if (varTypeIsStruct(type))
+ if (type == TYP_STRUCT)
{
arg->SetContained();
if ((arg->OperGet() == GT_OBJ) && (arg->AsObj()->Addr()->OperGet() == GT_LCL_VAR_ADDR))
diff --git a/src/jit/lsraarmarch.cpp b/src/jit/lsraarmarch.cpp
index 74f063c4b0..dc4228cfbb 100644
--- a/src/jit/lsraarmarch.cpp
+++ b/src/jit/lsraarmarch.cpp
@@ -672,6 +672,7 @@ void LinearScan::TreeNodeInfoInitPutArgStk(GenTreePutArgStk* argNode)
}
else
{
+ assert(!putArgChild->isContained());
#if defined(_TARGET_ARM_)
// The `double` types have been transformed to `long` on armel,
// while the actual long types have been decomposed.