Allow pregenerating most HW intrinsics in CoreLib (#24917)
authorMichal Strehovský <MichalStrehovsky@users.noreply.github.com>
Thu, 13 Jun 2019 22:24:59 +0000 (00:24 +0200)
committerSergiy Kuryata <sergeyk@microsoft.com>
Thu, 13 Jun 2019 22:24:59 +0000 (15:24 -0700)
commite73c8e6c4a98b7ef6335afa31052bed7313fd816
treedb14e93657a8ef482d51f8ad10f2fed720703a0e
parent6bcbd9348c277287539b2f97befc7b5d25b142e8
Allow pregenerating most HW intrinsics in CoreLib (#24917)

* Allow pregenerating all HW intrinsics in CoreLib

This is a follow up to #24689 that lets us pregenerate all hardware intrinsics in CoreLib.

We ensures the potentially unsupported code will never be reachable at runtime on CPUs that don't support it by not reporting the `IsSupported` property as intrinsic in crossgen. This ensures the support checks are always JITted. JITting the support checks is very cheap.

There is cost in the form of an extra call and failure to do constant propagation of the return value, but the cost is negligible in practice and gets eliminated once the tiered JIT tiers the method up.

We only do this in CoreLib because user code could technically not guard intrinsic use in `IsSupported` checks and pregenerating the code could lead to illegal instruction traps at runtime (instead of `PlatformNotSupportedException` throws) - it's a bad user experience.
src/vm/methodtablebuilder.cpp
src/zap/zapinfo.cpp
src/zap/zapper.cpp