Don't struct-promote opaque vectors
authorCarol Eidt <carol.eidt@microsoft.com>
Fri, 30 Nov 2018 23:02:00 +0000 (15:02 -0800)
committerCarol Eidt <carol.eidt@microsoft.com>
Sat, 1 Dec 2018 16:09:54 +0000 (08:09 -0800)
commitcbd3fb335904c33657389d47d4ed53720227946a
treef1a4a11b828b5df1dab5df5a668a84f41d1131de
parentcd736dc613d6ee16af2159017284ab654428425a
Don't struct-promote opaque vectors

The hardware vector types: `Vector64<T>`, `Vector128<T>` and `Vector256<T>` are declared
as having one or more fields of `ulong`. However, the JIT shouldn't be promoting these
fields to local variables. It is almost never the right type, and the intrinsics in any
case are not designed to cooperate with promoted fields (i.e. an index of a `Vector<ulong>`
won't map to the promoted lclVar).

Most importantly, it causes all copies of the vector to be done as 64-bit integer loads
and stores.

Finally, it will be important, as we support vector ABIs, to distinguish the handling of
the fixed-size vectors (`Vector2`, `Vector3` and `Vector4`) which *are* considered to be
normal structs of N floats, from the opaque types which will be passed in vector registers.

Commit migrated from https://github.com/dotnet/coreclr/commit/f06134ed869442f28cb0ab47ef2372d539a7e5af
src/coreclr/src/jit/compiler.h
src/coreclr/src/jit/morph.cpp