首页 > 解决方案 > 如何将 16 字节的内存加载到 Rust __m128i 中?

问题描述

我正在尝试将 16 字节的内存加载到模块中的__m128i类型中std::arch

#[cfg(all(target_arch = "x86_64", target_feature = "sse2"))]
use std::arch::x86_64::__m128i;

fn foo() {
    #[cfg(all(target_arch = "x86_64", target_feature = "sse2"))]
    use std::arch::x86_64::_mm_load_si128;

    unsafe {
        let mut f: [i8; 16] = [0; 16];
        f[0] = 5;
        f[1] = 66;
        let g = _mm_load_si128(f as *const __m128i);
    }
}

fn main() {
    foo();
}

我的代码导致错误:

error[E0605]: non-primitive cast: `[i8; 16]` as `*const __m128i`
  --> src/main.rs:12:32
   |
12 |         let g = _mm_load_si128(f as *const __m128i);
   |                                ^^^^^^^^^^^^^^^^^^^ an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object

从文档中不清楚如何使用_mm_load_si128从现有内存或现有类型加载字节。我希望能够__m128i 通过加载内在函数从某些现有类型中加载字节。

标签: rustssesimdintrinsics

解决方案


通过负载内在

内在函数是文档中列出的函数模块中的示例涵盖了您从内存加载的具体示例:

let invec = _mm_loadu_si128(src.as_ptr() as *const _);

对于您的情况:

let g = _mm_load_si128(f.as_ptr() as *const _);

也可以看看:


推荐阅读