Support clobber_abi and vector registers (clobber-only) in PowerPC inline assembly by taiki-e · Pull Request #131341 · rust-lang/rust (original) (raw)
rustbot added S-waiting-on-review
Status: Awaiting review from the assignee but also interested parties.
Relevant to the compiler team, which will review and decide on the PR/issue.
labels
Comment on lines +1121 to +1145
Comment on lines 138 to 139
bzEq approved these changes Oct 13, 2024
Comment on lines +162 to +165
workingjubilee added a commit to workingjubilee/rustc that referenced this pull request
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request
bors added S-waiting-on-bors
Status: Waiting on bors to run and complete tests. Bors will change the label on completion.
and removed S-waiting-on-review
Status: Awaiting review from the assignee but also interested parties.
labels
tgross35 added a commit to tgross35/rust that referenced this pull request
…rkingjubilee
Support clobber_abi and vector registers (clobber-only) in PowerPC inline assembly
This supports clobber_abi
which is one of the requirements of stabilization mentioned in rust-lang#93335.
This basically does a similar thing I did in rust-lang#130630 to implement clobber_abi
for s390x, but for powerpc/powerpc64/powerpc64le.
- This also supports vector registers (as
vreg
) as clobber-only, which need to support clobbering of them to implementclobber_abi
. vreg
should be able to accept#[repr(simd)]
types as input/output if the unstablealtivec
target feature is enabled, butcore::arch::{powerpc,powerpc64}
vector types,#[repr(simd)]
, andcore::simd
are all unstable, so the fact that this is currently a clobber-only should not be considered a blocker of clobber_abi implementation or stabilization. So I have not implemented it in this PR.- See rust-lang#131551 (which is based on this PR) for a PR to implement this.
- (I'm not sticking to whether that PR should be a separate PR or part of this PR, so I can merge that PR into this PR if needed.)
Refs:
- PPC32 SysV: Section "Function Calling Sequence" in System V Application Binary Interface PowerPC Processor Supplement
- PPC64 ELFv1: Section 3.2 "Function Calling Sequence" in 64-bit PowerPC ELF Application Binary Interface Supplement
- PPC64 ELFv2: Section 2.2 "Function Calling Sequence" in 64-Bit ELF V2 ABI Specification
- AIX: Register usage and conventions, Special registers in the PowerPC®, AIX vector programming
- Register definition in LLVM: https://github.com/llvm/llvm-project/blob/llvmorg-19.1.0/llvm/lib/Target/PowerPC/PPCRegisterInfo.td#L189
If I understand the above four ABI documentations correctly, except for the PPC32 SysV's VR (Vector Registers) and 32-bit AIX (currently not supported by rustc)'s r13, there does not appear to be important differences in terms of implementing clobber_abi
:
- The above four ABIs are consistent about FPR (0-13: volatile, 14-31: nonvolatile), CR (0-1,5-7: volatile, 2-4: nonvolatile), XER (volatile), and CTR (volatile).
- As for GPR, only the registers we are treating as reserved are slightly different
- r0, r3-r12 are volatile
- r1(sp, reserved), r14-31 are nonvolatile
- r2(reserved) is TOC pointer in PPC64 ELF/AIX, system-reserved register in PPC32 SysV (AFAIK used as thread pointer in Linux/BSDs)
- r13(reserved for non-32-bit-AIX) is thread pointer in PPC64 ELF, small data area pointer register in PPC32 SysV, "reserved under 64-bit environment; not restored across system calls[^r13]" in AIX)
- As for FPSCR, volatile in PPC64 ELFv1/AIX, some fields are volatile only in certain situations (rest are volatile) in PPC32 SysV/PPC64 ELFv2.
- As for VR (Vector Registers), it is not mentioned in PPC32 SysV, v0-v19 are volatile in both in PPC64 ELF/AIX, v20-v31 are nonvolatile in PPC64 ELF, reserved or nonvolatile depending on the ABI (vec-extabi vs vec-default in LLVM, we are [using vec-extabi](rust-lang#131341 (comment))) in AIX:
When the default Vector enabled mode is used, these registers are reserved and must not be used. In the extended ABI vector enabled mode, these registers are nonvolatile and their values are preserved across function calls
- As for VRSAVE, it is not mentioned in PPC32 SysV, nonvolatile in PPC64 ELFv1, reserved in PPC64 ELFv2/AIX
- As for VSCR, it is not mentioned in PPC32 SysV/PPC64 ELFv1, some fields are volatile only in certain situations (rest are volatile) in PPC64 ELFv2, volatile in AIX
We are currently treating r1-r2, r13 (non-32-bit-AIX), r29-r31, LR, CTR, and VRSAVE as reserved.
We are currently not processing anything about FPSCR and VSCR, but I feel those are things that should be processed by preserves_flags
rather than clobber_abi
if we need to do something about them. (However, PPCRegisterInfo.td in LLVM does not seem to define anything about them.)
Replaces rust-lang#111335 and rust-lang#124279
cc @ecnelises
@bzEq
@lu-zero
r? @Amanieu
@rustbot
label +O-PowerPC +A-inline-assembly
[^r13]: callee-saved, according to LLVM and GCC.
bors added a commit to rust-lang-ci/rust that referenced this pull request
Rollup of 9 pull requests
Successful merges:
- rust-lang#131153 (Improve duplicate derive Copy/Clone diagnostics)
- rust-lang#131341 (Support clobber_abi and vector registers (clobber-only) in PowerPC inline assembly)
- rust-lang#132025 (fix suggestion for diagnostic error E0027)
- rust-lang#132153 (Stabilise
const_char_encode_utf16
.) - rust-lang#132303 (More tests for non-exhaustive C-like enums in FFI)
- rust-lang#132473 ([core/fmt] Replace checked slice indexing by unchecked to support panic-free code)
- rust-lang#132598 (Clippy: Move some attribute lints to be early pass (post expansion))
- rust-lang#132606 (Improve example of
impl Pattern for &[char]
) - rust-lang#132609 (docs: fix grammar in doc comment at unix/process.rs)
r? @ghost
@rustbot
modify labels: rollup
This was referenced
Nov 5, 2024
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request
github-actions bot pushed a commit to rust-lang/miri that referenced this pull request
Support clobber_abi and vector registers (clobber-only) in PowerPC inline assembly
This supports clobber_abi
which is one of the requirements of stabilization mentioned in #93335.
This basically does a similar thing I did in rust-lang/rust#130630 to implement clobber_abi
for s390x, but for powerpc/powerpc64/powerpc64le.
- This also supports vector registers (as
vreg
) as clobber-only, which need to support clobbering of them to implementclobber_abi
. vreg
should be able to accept#[repr(simd)]
types as input/output if the unstablealtivec
target feature is enabled, butcore::arch::{powerpc,powerpc64}
vector types,#[repr(simd)]
, andcore::simd
are all unstable, so the fact that this is currently a clobber-only should not be considered a blocker of clobber_abi implementation or stabilization. So I have not implemented it in this PR.- See rust-lang/rust#131551 (which is based on this PR) for a PR to implement this.
- (I'm not sticking to whether that PR should be a separate PR or part of this PR, so I can merge that PR into this PR if needed.)
Refs:
- PPC32 SysV: Section "Function Calling Sequence" in System V Application Binary Interface PowerPC Processor Supplement
- PPC64 ELFv1: Section 3.2 "Function Calling Sequence" in 64-bit PowerPC ELF Application Binary Interface Supplement
- PPC64 ELFv2: Section 2.2 "Function Calling Sequence" in 64-Bit ELF V2 ABI Specification
- AIX: Register usage and conventions, Special registers in the PowerPC®, AIX vector programming
- Register definition in LLVM: https://github.com/llvm/llvm-project/blob/llvmorg-19.1.0/llvm/lib/Target/PowerPC/PPCRegisterInfo.td#L189
If I understand the above four ABI documentations correctly, except for the PPC32 SysV's VR (Vector Registers) and 32-bit AIX (currently not supported by rustc)'s r13, there does not appear to be important differences in terms of implementing clobber_abi
:
- The above four ABIs are consistent about FPR (0-13: volatile, 14-31: nonvolatile), CR (0-1,5-7: volatile, 2-4: nonvolatile), XER (volatile), and CTR (volatile).
- As for GPR, only the registers we are treating as reserved are slightly different
- r0, r3-r12 are volatile
- r1(sp, reserved), r14-31 are nonvolatile
- r2(reserved) is TOC pointer in PPC64 ELF/AIX, system-reserved register in PPC32 SysV (AFAIK used as thread pointer in Linux/BSDs)
- r13(reserved for non-32-bit-AIX) is thread pointer in PPC64 ELF, small data area pointer register in PPC32 SysV, "reserved under 64-bit environment; not restored across system calls[^r13]" in AIX)
- As for FPSCR, volatile in PPC64 ELFv1/AIX, some fields are volatile only in certain situations (rest are volatile) in PPC32 SysV/PPC64 ELFv2.
- As for VR (Vector Registers), it is not mentioned in PPC32 SysV, v0-v19 are volatile in both in PPC64 ELF/AIX, v20-v31 are nonvolatile in PPC64 ELF, reserved or nonvolatile depending on the ABI (vec-extabi vs vec-default in LLVM, we are [using vec-extabi](rust-lang/rust#131341 (comment))) in AIX:
When the default Vector enabled mode is used, these registers are reserved and must not be used. In the extended ABI vector enabled mode, these registers are nonvolatile and their values are preserved across function calls
- As for VRSAVE, it is not mentioned in PPC32 SysV, nonvolatile in PPC64 ELFv1, reserved in PPC64 ELFv2/AIX
- As for VSCR, it is not mentioned in PPC32 SysV/PPC64 ELFv1, some fields are volatile only in certain situations (rest are volatile) in PPC64 ELFv2, volatile in AIX
We are currently treating r1-r2, r13 (non-32-bit-AIX), r29-r31, LR, CTR, and VRSAVE as reserved.
We are currently not processing anything about FPSCR and VSCR, but I feel those are things that should be processed by preserves_flags
rather than clobber_abi
if we need to do something about them. (However, PPCRegisterInfo.td in LLVM does not seem to define anything about them.)
Replaces #111335 and #124279
cc @ecnelises
@bzEq
@lu-zero
r? @Amanieu
@rustbot
label +O-PowerPC +A-inline-assembly
[^r13]: callee-saved, according to LLVM and GCC.
lnicola pushed a commit to lnicola/rust-analyzer that referenced this pull request
Support clobber_abi and vector registers (clobber-only) in PowerPC inline assembly
This supports clobber_abi
which is one of the requirements of stabilization mentioned in #93335.
This basically does a similar thing I did in rust-lang/rust#130630 to implement clobber_abi
for s390x, but for powerpc/powerpc64/powerpc64le.
- This also supports vector registers (as
vreg
) as clobber-only, which need to support clobbering of them to implementclobber_abi
. vreg
should be able to accept#[repr(simd)]
types as input/output if the unstablealtivec
target feature is enabled, butcore::arch::{powerpc,powerpc64}
vector types,#[repr(simd)]
, andcore::simd
are all unstable, so the fact that this is currently a clobber-only should not be considered a blocker of clobber_abi implementation or stabilization. So I have not implemented it in this PR.- See rust-lang/rust#131551 (which is based on this PR) for a PR to implement this.
- (I'm not sticking to whether that PR should be a separate PR or part of this PR, so I can merge that PR into this PR if needed.)
Refs:
- PPC32 SysV: Section "Function Calling Sequence" in System V Application Binary Interface PowerPC Processor Supplement
- PPC64 ELFv1: Section 3.2 "Function Calling Sequence" in 64-bit PowerPC ELF Application Binary Interface Supplement
- PPC64 ELFv2: Section 2.2 "Function Calling Sequence" in 64-Bit ELF V2 ABI Specification
- AIX: Register usage and conventions, Special registers in the PowerPC®, AIX vector programming
- Register definition in LLVM: https://github.com/llvm/llvm-project/blob/llvmorg-19.1.0/llvm/lib/Target/PowerPC/PPCRegisterInfo.td#L189
If I understand the above four ABI documentations correctly, except for the PPC32 SysV's VR (Vector Registers) and 32-bit AIX (currently not supported by rustc)'s r13, there does not appear to be important differences in terms of implementing clobber_abi
:
- The above four ABIs are consistent about FPR (0-13: volatile, 14-31: nonvolatile), CR (0-1,5-7: volatile, 2-4: nonvolatile), XER (volatile), and CTR (volatile).
- As for GPR, only the registers we are treating as reserved are slightly different
- r0, r3-r12 are volatile
- r1(sp, reserved), r14-31 are nonvolatile
- r2(reserved) is TOC pointer in PPC64 ELF/AIX, system-reserved register in PPC32 SysV (AFAIK used as thread pointer in Linux/BSDs)
- r13(reserved for non-32-bit-AIX) is thread pointer in PPC64 ELF, small data area pointer register in PPC32 SysV, "reserved under 64-bit environment; not restored across system calls[^r13]" in AIX)
- As for FPSCR, volatile in PPC64 ELFv1/AIX, some fields are volatile only in certain situations (rest are volatile) in PPC32 SysV/PPC64 ELFv2.
- As for VR (Vector Registers), it is not mentioned in PPC32 SysV, v0-v19 are volatile in both in PPC64 ELF/AIX, v20-v31 are nonvolatile in PPC64 ELF, reserved or nonvolatile depending on the ABI (vec-extabi vs vec-default in LLVM, we are [using vec-extabi](rust-lang/rust#131341 (comment))) in AIX:
When the default Vector enabled mode is used, these registers are reserved and must not be used. In the extended ABI vector enabled mode, these registers are nonvolatile and their values are preserved across function calls
- As for VRSAVE, it is not mentioned in PPC32 SysV, nonvolatile in PPC64 ELFv1, reserved in PPC64 ELFv2/AIX
- As for VSCR, it is not mentioned in PPC32 SysV/PPC64 ELFv1, some fields are volatile only in certain situations (rest are volatile) in PPC64 ELFv2, volatile in AIX
We are currently treating r1-r2, r13 (non-32-bit-AIX), r29-r31, LR, CTR, and VRSAVE as reserved.
We are currently not processing anything about FPSCR and VSCR, but I feel those are things that should be processed by preserves_flags
rather than clobber_abi
if we need to do something about them. (However, PPCRegisterInfo.td in LLVM does not seem to define anything about them.)
Replaces #111335 and #124279
cc @ecnelises
@bzEq
@lu-zero
r? @Amanieu
@rustbot
label +O-PowerPC +A-inline-assembly
[^r13]: callee-saved, according to LLVM and GCC.
antoyo pushed a commit to rust-lang/rustc_codegen_gcc that referenced this pull request
Support clobber_abi and vector registers (clobber-only) in PowerPC inline assembly
This supports clobber_abi
which is one of the requirements of stabilization mentioned in #93335.
This basically does a similar thing I did in rust-lang/rust#130630 to implement clobber_abi
for s390x, but for powerpc/powerpc64/powerpc64le.
- This also supports vector registers (as
vreg
) as clobber-only, which need to support clobbering of them to implementclobber_abi
. vreg
should be able to accept#[repr(simd)]
types as input/output if the unstablealtivec
target feature is enabled, butcore::arch::{powerpc,powerpc64}
vector types,#[repr(simd)]
, andcore::simd
are all unstable, so the fact that this is currently a clobber-only should not be considered a blocker of clobber_abi implementation or stabilization. So I have not implemented it in this PR.- See rust-lang/rust#131551 (which is based on this PR) for a PR to implement this.
- (I'm not sticking to whether that PR should be a separate PR or part of this PR, so I can merge that PR into this PR if needed.)
Refs:
- PPC32 SysV: Section "Function Calling Sequence" in System V Application Binary Interface PowerPC Processor Supplement
- PPC64 ELFv1: Section 3.2 "Function Calling Sequence" in 64-bit PowerPC ELF Application Binary Interface Supplement
- PPC64 ELFv2: Section 2.2 "Function Calling Sequence" in 64-Bit ELF V2 ABI Specification
- AIX: Register usage and conventions, Special registers in the PowerPC®, AIX vector programming
- Register definition in LLVM: https://github.com/llvm/llvm-project/blob/llvmorg-19.1.0/llvm/lib/Target/PowerPC/PPCRegisterInfo.td#L189
If I understand the above four ABI documentations correctly, except for the PPC32 SysV's VR (Vector Registers) and 32-bit AIX (currently not supported by rustc)'s r13, there does not appear to be important differences in terms of implementing clobber_abi
:
- The above four ABIs are consistent about FPR (0-13: volatile, 14-31: nonvolatile), CR (0-1,5-7: volatile, 2-4: nonvolatile), XER (volatile), and CTR (volatile).
- As for GPR, only the registers we are treating as reserved are slightly different
- r0, r3-r12 are volatile
- r1(sp, reserved), r14-31 are nonvolatile
- r2(reserved) is TOC pointer in PPC64 ELF/AIX, system-reserved register in PPC32 SysV (AFAIK used as thread pointer in Linux/BSDs)
- r13(reserved for non-32-bit-AIX) is thread pointer in PPC64 ELF, small data area pointer register in PPC32 SysV, "reserved under 64-bit environment; not restored across system calls[^r13]" in AIX)
- As for FPSCR, volatile in PPC64 ELFv1/AIX, some fields are volatile only in certain situations (rest are volatile) in PPC32 SysV/PPC64 ELFv2.
- As for VR (Vector Registers), it is not mentioned in PPC32 SysV, v0-v19 are volatile in both in PPC64 ELF/AIX, v20-v31 are nonvolatile in PPC64 ELF, reserved or nonvolatile depending on the ABI (vec-extabi vs vec-default in LLVM, we are [using vec-extabi](rust-lang/rust#131341 (comment))) in AIX:
When the default Vector enabled mode is used, these registers are reserved and must not be used. In the extended ABI vector enabled mode, these registers are nonvolatile and their values are preserved across function calls
- As for VRSAVE, it is not mentioned in PPC32 SysV, nonvolatile in PPC64 ELFv1, reserved in PPC64 ELFv2/AIX
- As for VSCR, it is not mentioned in PPC32 SysV/PPC64 ELFv1, some fields are volatile only in certain situations (rest are volatile) in PPC64 ELFv2, volatile in AIX
We are currently treating r1-r2, r13 (non-32-bit-AIX), r29-r31, LR, CTR, and VRSAVE as reserved.
We are currently not processing anything about FPSCR and VSCR, but I feel those are things that should be processed by preserves_flags
rather than clobber_abi
if we need to do something about them. (However, PPCRegisterInfo.td in LLVM does not seem to define anything about them.)
Replaces #111335 and #124279
cc @ecnelises
@bzEq
@lu-zero
r? @Amanieu
@rustbot
label +O-PowerPC +A-inline-assembly