summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSteve MacLean <sdmaclea.qdt@qualcommdatacenter.com>2017-10-23 14:11:15 -0400
committerBruce Forstall <brucefo@microsoft.com>2017-10-23 11:11:15 -0700
commit2ba74317c027eb4ff1e854de02fbb9378d00a34e (patch)
tree327bacfe0eb917313b4a6c82100c620810a6ebb9 /src
parentc0aa11ff835222facec5401c4074e5b46cb1635f (diff)
downloadcoreclr-2ba74317c027eb4ff1e854de02fbb9378d00a34e.tar.gz
coreclr-2ba74317c027eb4ff1e854de02fbb9378d00a34e.tar.bz2
coreclr-2ba74317c027eb4ff1e854de02fbb9378d00a34e.zip
[Arm64] SIMD simple defines (#14628)
* [Arm64] SIMD simple defines * Fix #else
Diffstat (limited to 'src')
-rw-r--r--src/jit/compiler.h10
-rw-r--r--src/jit/ee_il_dll.cpp6
-rw-r--r--src/jit/lclvars.cpp6
-rw-r--r--src/jit/simd.cpp2
-rw-r--r--src/jit/target.h5
5 files changed, 23 insertions, 6 deletions
diff --git a/src/jit/compiler.h b/src/jit/compiler.h
index d05b894c58..3ff6375a57 100644
--- a/src/jit/compiler.h
+++ b/src/jit/compiler.h
@@ -137,8 +137,12 @@ unsigned ReinterpretHexAsDecimal(unsigned);
/*****************************************************************************/
-#ifdef FEATURE_SIMD
+#if defined(FEATURE_SIMD)
+#if defined(_TARGET_XARCH_)
const unsigned TEMP_MAX_SIZE = YMM_REGSIZE_BYTES;
+#elif defined(_TARGET_ARM64_)
+const unsigned TEMP_MAX_SIZE = FP_REGSIZE_BYTES;
+#endif // defined(_TARGET_XARCH_) || defined(_TARGET_ARM64_)
#else // !FEATURE_SIMD
const unsigned TEMP_MAX_SIZE = sizeof(double);
#endif // !FEATURE_SIMD
@@ -7669,6 +7673,8 @@ private:
assert(canUseSSE2());
return TYP_SIMD16;
}
+#elif defined(_TARGET_ARM64_)
+ return TYP_SIMD16;
#else
assert(!"getSIMDVectorType() unimplemented on target arch");
unreached();
@@ -7705,6 +7711,8 @@ private:
assert(canUseSSE2());
return XMM_REGSIZE_BYTES;
}
+#elif defined(_TARGET_ARM64_)
+ return FP_REGSIZE_BYTES;
#else
assert(!"getSIMDVectorRegisterByteLength() unimplemented on target arch");
unreached();
diff --git a/src/jit/ee_il_dll.cpp b/src/jit/ee_il_dll.cpp
index 0cfc565679..822a2b9286 100644
--- a/src/jit/ee_il_dll.cpp
+++ b/src/jit/ee_il_dll.cpp
@@ -384,8 +384,7 @@ unsigned CILJit::getMaxIntrinsicSIMDVectorLength(CORJIT_FLAGS cpuCompileFlags)
jitFlags.SetFromFlags(cpuCompileFlags);
#ifdef FEATURE_SIMD
-#ifdef _TARGET_XARCH_
-#ifndef LEGACY_BACKEND
+#if defined(_TARGET_XARCH_) && !defined(LEGACY_BACKEND)
if (!jitFlags.IsSet(JitFlags::JIT_FLAG_PREJIT) && jitFlags.IsSet(JitFlags::JIT_FLAG_FEATURE_SIMD) &&
jitFlags.IsSet(JitFlags::JIT_FLAG_USE_AVX2))
{
@@ -398,13 +397,12 @@ unsigned CILJit::getMaxIntrinsicSIMDVectorLength(CORJIT_FLAGS cpuCompileFlags)
return 32;
}
}
-#endif // !LEGACY_BACKEND
+#endif // !(defined(_TARGET_XARCH_) && !defined(LEGACY_BACKEND))
if (GetJitTls() != nullptr && JitTls::GetCompiler() != nullptr)
{
JITDUMP("getMaxIntrinsicSIMDVectorLength: returning 16\n");
}
return 16;
-#endif // _TARGET_XARCH_
#else // !FEATURE_SIMD
if (GetJitTls() != nullptr && JitTls::GetCompiler() != nullptr)
{
diff --git a/src/jit/lclvars.cpp b/src/jit/lclvars.cpp
index 78092344da..8ac57da52d 100644
--- a/src/jit/lclvars.cpp
+++ b/src/jit/lclvars.cpp
@@ -1460,9 +1460,13 @@ void Compiler::lvaCanPromoteStructType(CORINFO_CLASS_HANDLE typeHnd,
// In the future this may be changing to XMM_REGSIZE_BYTES.
// Note: MaxOffset is used below to declare a local array, and therefore must be a compile-time constant.
CLANG_FORMAT_COMMENT_ANCHOR;
-#ifdef FEATURE_SIMD
+#if defined(FEATURE_SIMD)
+#if defined(_TARGET_XARCH_)
// This will allow promotion of 2 Vector<T> fields on AVX2, or 4 Vector<T> fields on SSE2.
const int MaxOffset = MAX_NumOfFieldsInPromotableStruct * XMM_REGSIZE_BYTES;
+#elif defined(_TARGET_ARM64_)
+ const int MaxOffset = MAX_NumOfFieldsInPromotableStruct * FP_REGSIZE_BYTES;
+#endif // defined(_TARGET_XARCH_) || defined(_TARGET_ARM64_)
#else // !FEATURE_SIMD
const int MaxOffset = MAX_NumOfFieldsInPromotableStruct * sizeof(double);
#endif // !FEATURE_SIMD
diff --git a/src/jit/simd.cpp b/src/jit/simd.cpp
index 8605781c2d..d190cd29f4 100644
--- a/src/jit/simd.cpp
+++ b/src/jit/simd.cpp
@@ -98,6 +98,8 @@ int Compiler::getSIMDTypeAlignment(var_types simdType)
assert(size == 32);
return 32;
}
+#elif defined(_TARGET_ARM64_)
+ return 16;
#else
assert(!"getSIMDTypeAlignment() unimplemented on target arch");
unreached();
diff --git a/src/jit/target.h b/src/jit/target.h
index 1c352d0c1a..37919e2422 100644
--- a/src/jit/target.h
+++ b/src/jit/target.h
@@ -1529,6 +1529,11 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
#define CPBLK_UNROLL_LIMIT 64 // Upper bound to let the code generator to loop unroll CpBlk.
#define INITBLK_UNROLL_LIMIT 64 // Upper bound to let the code generator to loop unroll InitBlk.
+#ifdef FEATURE_SIMD
+ #define ALIGN_SIMD_TYPES 1 // whether SIMD type locals are to be aligned
+ #define FEATURE_PARTIAL_SIMD_CALLEE_SAVE 1 // Whether SIMD registers are partially saved at calls
+#endif // FEATURE_SIMD
+
#define FEATURE_WRITE_BARRIER 1 // Generate the proper WriteBarrier calls for GC
#define FEATURE_FIXED_OUT_ARGS 1 // Preallocate the outgoing arg area in the prolog
#define FEATURE_STRUCTPROMOTE 1 // JIT Optimization to promote fields of structs into registers