Skip to content

Commit c0a0913

Browse files
committed
11.18更新transmute_copy
1 parent 191a1f0 commit c0a0913

File tree

1 file changed

+13
-7
lines changed
  • library/stdarch/crates/core_arch/src/aarch64/sve

1 file changed

+13
-7
lines changed

library/stdarch/crates/core_arch/src/aarch64/sve/mod.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@ pub mod types;
88
// ================================
99
// 修复点 1/2:去掉 simd_*,改为位级转换
1010
// ================================
11-
#[inline(always)]
11+
#[inline]
12+
#[target_feature(enable = "sve")]
1213
pub(crate) unsafe fn simd_reinterpret<T, U>(x: T) -> U {
1314
// 纯位级重解释;SVE 封装类型在这层视为opaque,避免走 simd_cast 触发 E0511
1415
core::mem::transmute_copy::<T, U>(&x)
1516
}
1617

17-
#[inline(always)]
18+
#[inline]
19+
#[target_feature(enable = "sve")]
1820
pub(crate) unsafe fn simd_cast<T, U>(x: T) -> U {
19-
// 多数 SVE cast在 stdarch 内部只是布局相同的重解释;按位转即可
21+
// 多数 SVE "cast"在 stdarch 内部只是布局相同的重解释;按位转即可
2022
// 如需数值语义转换,请在具体 API 内对接相应 LLVM SVE convert 内建。
2123
core::mem::transmute_copy::<T, U>(&x)
2224
}
@@ -147,30 +149,34 @@ impl __SveSelect for svbool_t {
147149
// impl_sve_select!("nxv16f8", svmfloat8_t);
148150

149151
// 实现从不同宽度的谓词类型到 svbool_t 的转换
152+
// 注意:这些实现直接使用 transmute_copy,不需要 target feature
153+
// 因为 transmute_copy 是纯位级转换,不涉及 SVE 指令
150154
impl From<svbool2_t> for svbool_t {
151155
#[inline(always)]
152156
fn from(x: svbool2_t) -> Self {
153-
unsafe { simd_cast(x) }
157+
// 使用 transmute_copy 进行位级转换,不需要 target feature
158+
unsafe { core::mem::transmute_copy(&x) }
154159
}
155160
}
156161

157162
impl From<svbool4_t> for svbool_t {
158163
#[inline(always)]
159164
fn from(x: svbool4_t) -> Self {
160-
unsafe { simd_cast(x) }
165+
unsafe { core::mem::transmute_copy(&x) }
161166
}
162167
}
163168

164169
impl From<svbool8_t> for svbool_t {
165170
#[inline(always)]
166171
fn from(x: svbool8_t) -> Self {
167-
unsafe { simd_cast(x) }
172+
unsafe { core::mem::transmute_copy(&x) }
168173
}
169174
}
170175

171176
// 公开的"选择"总入口:保持原函数签名不变(被 sve/*.rs 调用)
172177
// 现在它不再走 simd_select,而是经 trait 静态分派到 LLVM SVE `sel`
173-
#[inline(always)]
178+
#[inline]
179+
#[target_feature(enable = "sve")]
174180
pub(crate) unsafe fn simd_select<M, T>(m: M, a: T, b: T) -> T
175181
where
176182
// SVE 谓词统一为 svbool_t;避免出现 svbool4_t/svbool8_t 这类"假类型"

0 commit comments

Comments
 (0)