From fd80667cc42b09aa04311b9f19d6b261f0554ef5 Mon Sep 17 00:00:00 2001 From: Steve MacLean Date: Mon, 6 Nov 2017 16:59:42 -0500 Subject: [PATCH] [Arm64] SIMD genPutArgStk --- src/jit/codegenarmarch.cpp | 16 ++++++++++++++++ src/jit/lower.cpp | 2 +- src/jit/lsraarmarch.cpp | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/jit/codegenarmarch.cpp b/src/jit/codegenarmarch.cpp index 758dd0b..06e8896 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 ce99e4d..b8f0403 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 74f063c..dc4228c 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. -- 2.7.4