@@ -8,15 +8,17 @@ pub mod types;
88// ================================
99// 修复点 1/2:去掉 simd_*,改为位级转换
1010// ================================
11- #[ inline( always) ]
11+ #[ inline]
12+ #[ target_feature( enable = "sve" ) ]
1213pub ( 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" ) ]
1820pub ( 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 指令
150154impl 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
157162impl 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
164169impl 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" ) ]
174180pub ( crate ) unsafe fn simd_select < M , T > ( m : M , a : T , b : T ) -> T
175181where
176182 // SVE 谓词统一为 svbool_t;避免出现 svbool4_t/svbool8_t 这类"假类型"
0 commit comments