| //@ compile-flags: -Copt-level=0 -Ctarget-feature=+sve,+sve2 | |
| //@ edition: 2021 | |
| //@ only-aarch64 | |
| #![crate_type = "lib"] | |
| #![feature(simd_ffi)] | |
| #![feature(stdarch_aarch64_sve)] | |
| // Test that `vscale * size` is generated for `memcpy` of scalable vector types | |
| use std::arch::aarch64::*; | |
| #[allow(improper_ctypes)] | |
| unsafe extern "C" { | |
| fn svcreate2_s16_wrapper(__dst: *mut svint16x2_t, x0: *const svint16_t, x1: *const svint16_t); | |
| fn svcreate3_s16_wrapper( | |
| __dst: *mut svint16x3_t, | |
| x0: *const svint16_t, | |
| x1: *const svint16_t, | |
| x2: *const svint16_t, | |
| ); | |
| fn svcreate4_s16_wrapper( | |
| __dst: *mut svint16x4_t, | |
| x0: *const svint16_t, | |
| x1: *const svint16_t, | |
| x2: *const svint16_t, | |
| x3: *const svint16_t, | |
| ); | |
| } | |
| pub fn foo(x0_val: svint16_t) { | |
| unsafe { | |
| let __pred = svptrue_b16(); | |
| let mut __c_return_value = std::mem::MaybeUninit::uninit(); | |
| svcreate2_s16_wrapper(__c_return_value.as_mut_ptr(), &raw const x0_val, &raw const x0_val); | |
| let __c_return_value = __c_return_value.assume_init(); | |
| // CHECK: call void @svcreate2_s16_wrapper( | |
| // CHECK-NEXT: [[VSCALE:%.*]] = call i64 @llvm.vscale.i64() | |
| // CHECK-NEXT: [[VSCALE_SIZE:%.*]] = mul i64 [[VSCALE]], 32 | |
| // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64({{.*}}, {{.*}}, i64 [[VSCALE_SIZE]] | |
| let eq = svcmpeq_s16( | |
| __pred, | |
| svget2_s16::<1>(__c_return_value), | |
| svget2_s16::<1>(__c_return_value), | |
| ); | |
| let mut __c_return_value = std::mem::MaybeUninit::uninit(); | |
| svcreate3_s16_wrapper( | |
| __c_return_value.as_mut_ptr(), | |
| &raw const x0_val, | |
| &raw const x0_val, | |
| &raw const x0_val, | |
| ); | |
| let __c_return_value = __c_return_value.assume_init(); | |
| // CHECK: call void @svcreate3_s16_wrapper( | |
| // CHECK-NEXT: [[VSCALE:%.*]] = call i64 @llvm.vscale.i64() | |
| // CHECK-NEXT: [[VSCALE_SIZE:%.*]] = mul i64 [[VSCALE]], 48 | |
| // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64({{.*}}, {{.*}}, i64 [[VSCALE_SIZE]] | |
| let eq = svcmpeq_s16( | |
| __pred, | |
| svget3_s16::<2>(__c_return_value), | |
| svget3_s16::<2>(__c_return_value), | |
| ); | |
| let mut __c_return_value = std::mem::MaybeUninit::uninit(); | |
| svcreate4_s16_wrapper( | |
| __c_return_value.as_mut_ptr(), | |
| &raw const x0_val, | |
| &raw const x0_val, | |
| &raw const x0_val, | |
| &raw const x0_val, | |
| ); | |
| let __c_return_value = __c_return_value.assume_init(); | |
| // CHECK: call void @svcreate4_s16_wrapper( | |
| // CHECK-NEXT: [[VSCALE:%.*]] = call i64 @llvm.vscale.i64() | |
| // CHECK-NEXT: [[VSCALE_SIZE:%.*]] = mul i64 [[VSCALE]], 64 | |
| // CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64({{.*}}, {{.*}}, i64 [[VSCALE_SIZE]] | |
| let eq = svcmpeq_s16( | |
| __pred, | |
| svget4_s16::<3>(__c_return_value), | |
| svget4_s16::<3>(__c_return_value), | |
| ); | |
| } | |
| } |