[Hexagon] Allocate M and CS registers as a pair (#236522)
M and CS registers are used by circular memory instructions. One of the
M0/1 registers is used as an argument and the matching CS0/1 is used
implicitly. Currently, the CS registers are not assigned when the
corresponding intrinsics are lowered.
Currently, CS registers are reserved. Instructions using them are marked
to use both CS1 and CS0, which is incorrect. Additionally, CS is marked
as a def for PS_load* pseudoinstructions, which is also incorrect.
Problems with using undefined CS are not caught in existing code because
CS registers are reserved.
To pass inputs in both CS and M registers, define a new register class
for the M:CS pair and allow it to be allocatable.
To support multiple live cs/m pairs, implement their spilling on the
stack.
Signed-off-by: Alexey Karyakin <akaryaki@qti.qualcomm.com>