diff options
author | Sam Elliott <quic_aelliott@quicinc.com> | 2024-11-18 17:45:58 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-18 17:45:58 +0000 |
commit | 4615cc38f35d111f09073f51cc734e29c9211067 (patch) | |
tree | cd05d5140b4eb70d66fd98fd991253bfc571cf50 /lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp | |
parent | 9161e6ab745adeef67a129b4e1b6724f026125f0 (diff) | |
download | llvm-4615cc38f35d111f09073f51cc734e29c9211067.zip llvm-4615cc38f35d111f09073f51cc734e29c9211067.tar.gz llvm-4615cc38f35d111f09073f51cc734e29c9211067.tar.bz2 |
[RISCV] Inline Assembly Support for GPR Pairs ('R') (#112983)
This patch adds support for getting even-odd general purpose register
pairs into and out of inline assembly using the `R` constraint as
proposed in riscv-non-isa/riscv-c-api-doc#92
There are a few different pieces to this patch, each of which need their
own explanation.
- Renames the Register Class used for f64 values on rv32i_zdinx from
`GPRPair*` to `GPRF64Pair*`. These register classes are kept broadly
unmodified, as their primary value type is used for type inference
over selection patterns. This rename affects quite a lot of files.
- Adds new `GPRPair*` register classes which will be used for `R`
constraints and for instructions that need an even-odd GPR pair. This
new type is used for `amocas.d.*`(rv32) and `amocas.q.*`(rv64) in
Zacas, instead of the `GPRF64Pair` class being used before.
- Marks the new `GPRPair` class legal as for holding a `MVT::Untyped`.
Two new RISCVISD node types are added for creating and destructing a
pair - `BuildGPRPair` and `SplitGPRPair`, and are introduced when
bitcasting to/from the pair type and `untyped`.
- Adds functionality to `splitValueIntoRegisterParts` and
`joinRegisterPartsIntoValue` to handle changing `i<2*xlen>` MVTs into
`untyped` pairs.
- Adds an override for `getNumRegisters` to ensure that `i<2*xlen>`
values, when going to/from inline assembly, only allocate one (pair)
register (they would otherwise allocate two). This is due to a bug in
SelectionDAGBuilder.cpp which other backends also work around.
- Ensures that Clang understands that `R` is a valid inline assembly
constraint.
- This also allows `R` to be used for `f64` types on `rv32_zdinx`
architectures, where doubles are stored in a GPR pair.
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp')
0 files changed, 0 insertions, 0 deletions