diff options
author | Steve MacLean <sdmaclea.qdt@qualcommdatacenter.com> | 2017-10-23 14:11:15 -0400 |
---|---|---|
committer | Bruce Forstall <brucefo@microsoft.com> | 2017-10-23 11:11:15 -0700 |
commit | 2ba74317c027eb4ff1e854de02fbb9378d00a34e (patch) | |
tree | 327bacfe0eb917313b4a6c82100c620810a6ebb9 /src | |
parent | c0aa11ff835222facec5401c4074e5b46cb1635f (diff) | |
download | coreclr-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.h | 10 | ||||
-rw-r--r-- | src/jit/ee_il_dll.cpp | 6 | ||||
-rw-r--r-- | src/jit/lclvars.cpp | 6 | ||||
-rw-r--r-- | src/jit/simd.cpp | 2 | ||||
-rw-r--r-- | src/jit/target.h | 5 |
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 |