[Arm64] SIMD genPutArgStk
authorSteve MacLean <sdmaclea.qdt@qualcommdatacenter.com>
Mon, 6 Nov 2017 21:59:42 +0000 (16:59 -0500)
committerSteve MacLean <sdmaclea.qdt@qualcommdatacenter.com>
Wed, 8 Nov 2017 16:38:56 +0000 (11:38 -0500)
src/jit/codegenarmarch.cpp
src/jit/lower.cpp
src/jit/lsraarmarch.cpp

index 758dd0b..06e8896 100644 (file)
@@ -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);
index ce99e4d..b8f0403 100644 (file)
@@ -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))
index 74f063c..dc4228c 100644 (file)
@@ -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.