//@ revisions: AARCH64 X86_64 Z13 //@ compile-flags: -Copt-level=3 //@[AARCH64] only-aarch64 //@[X86_64] only-x86_64 //@[Z13] only-s390x //@[Z13] compile-flags: -Ctarget-cpu=z13 #![crate_type = "lib"] #![no_std] // This test is paired with the arch-neutral -opt2.rs test // The code is from https://github.com/rust-lang/rust/issues/122805. // Ensure we do not generate the shufflevector instruction // to avoid complicating the code. // CHECK-LABEL: define{{.*}}void @convert( // CHECK-NOT: shufflevector // On higher opt levels, this should just be a bswap: // CHECK: load <8 x i16> // CHECK-NEXT: call <8 x i16> @llvm.bswap // CHECK-NEXT: store <8 x i16> // CHECK-NEXT: ret void #[no_mangle] pub fn convert(value: [u16; 8]) -> [u8; 16] { #[cfg(target_endian = "little")] let bswap = u16::to_be; #[cfg(target_endian = "big")] let bswap = u16::to_le; let addr16 = [ bswap(value[0]), bswap(value[1]), bswap(value[2]), bswap(value[3]), bswap(value[4]), bswap(value[5]), bswap(value[6]), bswap(value[7]), ]; unsafe { core::mem::transmute::<_, [u8; 16]>(addr16) } }