Hardware instruction set support for crossgen2 (#33274)
authorDavid Wrighton <davidwr@microsoft.com>
Fri, 3 Apr 2020 23:02:12 +0000 (16:02 -0700)
committerGitHub <noreply@github.com>
Fri, 3 Apr 2020 23:02:12 +0000 (16:02 -0700)
commit5ac25ac11d190c820aae55f17ff5d78d183b4d62
treec711c0d4b2e8e05abe86c0222e90258af9ba80d6
parentc21c7fd280aed2ba12ed3807c1082e8aba95a602
Hardware instruction set support for crossgen2 (#33274)

- Add support for the --instruction-set parameter as described in #226 .
NOTE: As the abi for Vector parameters is not yet stable, support for the --instruction-set parameter is only enabled if --inputbubble is also enabled. Parallel work to stabilize the abi is in progress, but is not complete.
ALSO NOTE: The names of the instruction sets are shared with mono, and don't follow the names in issue #226
- Add concept of baseline instruction set support to R2R file format
- Can be applied at a per method level or at the entire R2R file level
  - R2RDump support for dumping the extra data
- Refactor how support for hardware intrinsics beyond SSE2 support are handled in crossgen2
- Add feature to the JIT to detect which hardware features are actually used
  - Tell the JIT unconditionally that SSE42+Lzcnt+Popcnt+Pclmulqdq are supported
  - But if support beyond the --instruction-set specified baseline is used, notate the method with a per-method instruction set support fixup.
  - This enables usage of many intrinsics in corelib with greater efficiency than today
  - This enables usage of SSE42 and below intrinsics safely in non-CoreLib code. Use of higher level intrinsics in non CoreLib code will generate code which does not use the higher level intrinsic, and note that the method's code should not be used in the presence of hardware which does support greater CPU capabilities.
  - In the future a logical enhancement of this work would be to generate multiple bodies of code to handle these more complex cases.
  - In combination with the --instruction-set argument, if Avx2 is enabled, then the logic gracefully adds a dependency on Avx2 capability and Vector<T> becomes useable by crossgen'd code.
54 files changed:
docs/design/coreclr/botr/README.md
docs/design/coreclr/botr/readytorun-format.md
docs/design/coreclr/botr/vectors-and-intrinsics.md [new file with mode: 0644]
src/coreclr/src/inc/corcompile.h
src/coreclr/src/inc/corinfoinstructionset.h
src/coreclr/src/inc/corjitflags.h
src/coreclr/src/inc/readytorun.h
src/coreclr/src/jit/codegenarm64.cpp
src/coreclr/src/jit/codegenxarch.cpp
src/coreclr/src/jit/compiler.cpp
src/coreclr/src/jit/compiler.h
src/coreclr/src/jit/gentree.cpp
src/coreclr/src/jit/hwintrinsic.cpp
src/coreclr/src/jit/hwintrinsiccodegenxarch.cpp
src/coreclr/src/jit/hwintrinsicxarch.cpp
src/coreclr/src/jit/importer.cpp
src/coreclr/src/jit/lclvars.cpp
src/coreclr/src/jit/lowerarmarch.cpp
src/coreclr/src/jit/lsraarm64.cpp
src/coreclr/src/jit/lsraxarch.cpp
src/coreclr/src/jit/morph.cpp
src/coreclr/src/jit/simd.cpp
src/coreclr/src/jit/valuenum.cpp
src/coreclr/src/tools/Common/Compiler/HardwareIntrinsicHelpers.cs
src/coreclr/src/tools/Common/Compiler/InstructionSetSupport.cs [new file with mode: 0644]
src/coreclr/src/tools/Common/Internal/Runtime/ReadyToRunConstants.cs
src/coreclr/src/tools/Common/Internal/Runtime/ReadyToRunInstructionSet.cs
src/coreclr/src/tools/Common/Internal/Runtime/ReadyToRunInstructionSetHelper.cs [new file with mode: 0644]
src/coreclr/src/tools/Common/JitInterface/CorInfoImpl.cs
src/coreclr/src/tools/Common/JitInterface/CorInfoInstructionSet.cs
src/coreclr/src/tools/Common/JitInterface/CorInfoTypes.cs
src/coreclr/src/tools/Common/JitInterface/JitConfigProvider.cs
src/coreclr/src/tools/Common/JitInterface/ThunkGenerator/InstructionSetDesc.txt
src/coreclr/src/tools/Common/JitInterface/ThunkGenerator/InstructionSetGenerator.cs
src/coreclr/src/tools/Common/JitInterface/ThunkGenerator/Program.cs
src/coreclr/src/tools/Common/JitInterface/ThunkGenerator/gen.bat
src/coreclr/src/tools/Common/JitInterface/ThunkGenerator/gen.sh
src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/ReadyToRunInstructionSetSupportSignature.cs [new file with mode: 0644]
src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunSymbolNodeFactory.cs
src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.cs
src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilationBuilder.cs
src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/Compiler/ReadyToRunCompilerContext.cs
src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj
src/coreclr/src/tools/crossgen2/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs
src/coreclr/src/tools/crossgen2/ILCompiler.Reflection.ReadyToRun/ILCompiler.Reflection.ReadyToRun.csproj
src/coreclr/src/tools/crossgen2/ILCompiler.Reflection.ReadyToRun/ReadyToRunSignature.cs
src/coreclr/src/tools/crossgen2/crossgen2/CommandLineOptions.cs
src/coreclr/src/tools/crossgen2/crossgen2/Program.cs
src/coreclr/src/tools/crossgen2/crossgen2/Properties/Resources.resx
src/coreclr/src/vm/ceeload.cpp
src/coreclr/src/vm/jitinterface.cpp
src/coreclr/src/vm/readytoruninfo.cpp
src/coreclr/src/vm/readytoruninfo.h
src/coreclr/src/zap/zapreadytorun.cpp