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 exceptr0which is evaluated as zero in an address context
This class is needed becauser0, which may be allocated when using theregclass, cannot be used as a register in certain contexts. This is identical to theaconstraint 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
Technicallyvregshould be able to accept#[repr(simd)]types as input/output if the unstablevectortarget feature added is enabled, butcore::archhas no s390x vector type and both#[repr(simd)]andcore::simdare 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