This commit includes the necessary changes to clang and LLVM to support
codegen of RVE and the ilp32e/lp64e ABIs.
The differences between RVE and RVI are:
- RVE reduces the integer register count to 16(x0-x16).
- The ABI should be ilp32e for 32 bits and lp64e for 64 bits.
RVE can be combined with all current standard extensions.
The central changes in ilp32e/lp64e ABI, compared to ilp32/lp64 are:
- Only 6 integer argument registers (rather than 8).
- Only 2 callee-saved registers (rather than 12).
- A Stack Alignment of 32bits (rather than 128bits).
- ilp32e isn't compatible with D ISA extension.
If ilp32e or lp64 is used with an ISA that has any of the registers
x16-x31 and f0-f31, then these registers are considered temporaries.
To be compatible with the implementation of ilp32e in GCC, we don't use
aligned registers to pass variadic arguments and set stack alignment\
to 4-bytes for types with length of 2*XLEN.
FastCC is also supported on RVE, while GHC isn't since there is only one
avaiable register.
Does it matter we don't undo the effects of the RVE ABI here?