| //@ 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) } |
| } |