Stabilize s390x inline assembly by taiki-e · Pull Request #131258 · rust-lang/rust (original) (raw)
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 registerreg_addr
(r[1-10]
,r[12-14]
): General-purpose register exceptr0
which is evaluated as zero in an address context
This class is needed becauser0
, which may be allocated when using thereg
class, cannot be used as a register in certain contexts. This is identical to thea
constraint in LLVM and GCC. See Support reg_addr register class in s390x inline assembly #119431 for details.freg
(f[0-15]
): Floating-point register
The followings are clobber-only:
vreg
(v[0-31]
): Vector register
Technicallyvreg
should be able to accept#[repr(simd)]
types as input/output if the unstablevector
target feature added is enabled, butcore::arch
has no s390x vector type and both#[repr(simd)]
andcore::simd
are unstable. Everything related is unstable, so the fact that this is currently a clobber-only should not be considered a stabilization blocker. (s390x vector facilities support #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 and SystemZELFRegisters in LLVM):
r11
: frame pointerr15
: stack pointera0
,a1
: Reserved for system usec[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