mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
3e027ff0f0
stabilize s390x vector registers tracking issue: https://github.com/rust-lang/rust/issues/133416 reference PR: https://github.com/rust-lang/reference/pull/2215 Stabilizes s390x vector registers, e.g. ```rust unsafe fn vreg_128(x: i128) -> i128 { let y; asm!("vlr {}, {}", out(vreg) y, in(vreg) x); y } ``` The types that are accepted for vreg registers are - all float types `f16`, `f32`, `f64`, `f128` - integer types `i32`, `i64` and `i128` and their unsigned counterparts - integer vector types `i8x16`, `i16x8`, `i32x4`, `i64x2` and their unsigned counterparts - float vector types `f16x8`, `f32x4` and `f64x2` Support for all of these is tested in https://github.com/rust-lang/rust/blob/main/tests/assembly-llvm/asm/s390x-types.rs, and the types correspond with the LLVM definition in https://github.com/llvm/llvm-project/blob/df9eb79970c012990e829d174d181d575d414efe/llvm/lib/Target/SystemZ/SystemZRegisterInfo.td#L312-L339 The `f16`, `f16x8` and `f128` types are unstable, and so can't be used on stable in practice. They do show up in some error messages though. `vreg` was previously only accepted as a clobber. --- Currently the vector types in `core::arch::s390x` are still unstable. Separately stabilizing `vreg` is still useful because scalar types can also be put into `vreg`s. ## Implementation history - https://github.com/rust-lang/rust/pull/131664 - https://github.com/rust-lang/rust/pull/150826 cc @uweigand @taiki-e r? @Amanieu