diff options
author | Steve MacLean <sdmaclea.qdt@qualcommdatacenter.com> | 2017-11-06 16:59:42 -0500 |
---|---|---|
committer | Steve MacLean <sdmaclea.qdt@qualcommdatacenter.com> | 2017-11-08 11:38:56 -0500 |
commit | fd80667cc42b09aa04311b9f19d6b261f0554ef5 (patch) | |
tree | ee5b2ada4bc32343fdbf8046c2476bb1666e2165 | |
parent | 661ee8f407deec5a36011fdcce8f68cf68266823 (diff) | |
download | coreclr-fd80667cc42b09aa04311b9f19d6b261f0554ef5.tar.gz coreclr-fd80667cc42b09aa04311b9f19d6b261f0554ef5.tar.bz2 coreclr-fd80667cc42b09aa04311b9f19d6b261f0554ef5.zip |
[Arm64] SIMD genPutArgStk
-rw-r--r-- | src/jit/codegenarmarch.cpp | 16 | ||||
-rw-r--r-- | src/jit/lower.cpp | 2 | ||||
-rw-r--r-- | src/jit/lsraarmarch.cpp | 1 |
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. |