You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Rollup merge of #131258 - taiki-e:s390x-stabilize-asm, r=Amanieu
Stabilize s390x inline assembly
This stabilizes inline assembly for s390x (SystemZ).
Corresponding reference PR: rust-lang/reference#1643
---
From the requirements of stabilization mentioned in #93335
> Each architecture needs to be reviewed before stabilization:
> - It must have clobber_abi.
Done in #130630.
> - It must be possible to clobber every register that is normally clobbered by a function call.
Done in the PR that added support for clobber_abi.
> - Generally review that the exposed register classes make sense.
The followings can be used as input/output:
- `reg` (`r[0-10]`, `r[12-14]`): General-purpose register
- `reg_addr` (`r[1-10]`, `r[12-14]`): General-purpose register except `r0` which is evaluated as zero in an address context
This class is needed because `r0`, which may be allocated when using the `reg` class, cannot be used as a register in certain contexts. This is identical to the `a` constraint in LLVM and GCC. See #119431 for details.
- `freg` (`f[0-15]`): Floating-point register
The followings are clobber-only:
- `vreg` (`v[0-31]`): Vector register
Technically `vreg` should be able to accept `#[repr(simd)]` types as input/output if the unstable `vector` target feature added is enabled, but `core::arch` has no s390x vector type and both `#[repr(simd)]` and `core::simd` are unstable. Everything related is unstable, so the fact that this is currently a clobber-only should not be considered a stabilization blocker. (#130869 tracks unstable stuff here)
- `areg` (`a[2-15]`): Access register
All of the above register classes except `reg_addr` are needed for `clobber_abi`.
The followings cannot be used as operands for inline asm (see also [getReservedRegs](https://github.com/llvm/llvm-project/blob/llvmorg-19.1.0/llvm/lib/Target/SystemZ/SystemZRegisterInfo.cpp#L258-L282) and [SystemZELFRegisters](https://github.com/llvm/llvm-project/blob/llvmorg-19.1.0/llvm/lib/Target/SystemZ/SystemZRegisterInfo.h#L107-L128) in LLVM):
- `r11`: frame pointer
- `r15`: stack pointer
- `a0`, `a1`: Reserved for system use
- `c[0-15]` (control register) Reserved by the kernel
Although not listed in the above requirements, `preserves_flags` is implemented in #111331.
---
cc ``@uweigand``
r? ``@Amanieu``
``@rustbot`` label +O-SystemZ +A-inline-assembly
| All |`sp`, `r15` (s390x), `r14`/`o6` (SPARC) | The stack pointer must be restored to its original value at the end of an asm code block. |
163
-
| All |`fr` (Hexagon), `fp` (PowerPC), `$fp` (MIPS), `Y` (AVR), `r4` (MSP430), `a6` (M68k), `r11` (s390x), `r30`/`i6` (SPARC), `x29` (Arm64EC) | The frame pointer cannot be used as an input or output. |
152
+
| All |`sp`, `r14`/`o6` (SPARC)| The stack pointer must be restored to its original value at the end of an asm code block. |
153
+
| All |`fr` (Hexagon), `fp` (PowerPC), `$fp` (MIPS), `Y` (AVR), `r4` (MSP430), `a6` (M68k), `r30`/`i6` (SPARC), `x29` (Arm64EC) | The frame pointer cannot be used as an input or output.|
164
154
| All |`r19` (Hexagon), `r29` (PowerPC), `r30` (PowerPC), `x19` (Arm64EC) | These are used internally by LLVM as "base pointer" for functions with complex stack frames. |
165
155
| MIPS |`$0` or `$zero`| This is a constant zero register which can't be modified. |
166
156
| MIPS |`$1` or `$at`| Reserved for assembler. |
@@ -181,8 +171,6 @@ This feature tracks `asm!` and `global_asm!` support for the following architect
181
171
| CSKY |`r15`| This is the link register. |
182
172
| CSKY |`r[26-30]`| Reserved by its ABI. |
183
173
| CSKY |`r31`| This is the TLS register. |
184
-
| s390x |`c[0-15]`| Reserved by the kernel. |
185
-
| s390x |`a[0-1]`| Reserved for system use. |
186
174
| SPARC |`r0`/`g0`| This is always zero and cannot be used as inputs or outputs. |
187
175
| SPARC |`r1`/`g1`| Used internally by LLVM. |
188
176
| SPARC |`r5`/`g5`| Reserved for system. (SPARC32 only) |
@@ -206,9 +194,6 @@ This feature tracks `asm!` and `global_asm!` support for the following architect
206
194
| PowerPC |`reg`| None |`0`| None |
207
195
| PowerPC |`reg_nonzero`| None |`3`| None |
208
196
| PowerPC |`freg`| None |`0`| None |
209
-
| s390x |`reg`| None |`%r0`| None |
210
-
| s390x |`reg_addr`| None |`%r1`| None |
211
-
| s390x |`freg`| None |`%f0`| None |
212
197
| SPARC |`reg`| None |`%o0`| None |
213
198
| CSKY |`reg`| None |`r0`| None |
214
199
| CSKY |`freg`| None |`f0`| None |
@@ -232,8 +217,6 @@ These flags registers must be restored upon exiting the asm block if the `preser
0 commit comments