@@ -295,6 +295,19 @@ extern "C" {
295
295
fn vctsxs ( a : vector_float , b : i32 ) -> vector_signed_int ;
296
296
#[ link_name = "llvm.ppc.altivec.vctuxs" ]
297
297
fn vctuxs ( a : vector_float , b : i32 ) -> vector_unsigned_int ;
298
+
299
+ #[ link_name = "llvm.ppc.altivec.vpkshss" ]
300
+ fn vpkshss ( a : vector_signed_short , b : vector_signed_short ) -> vector_signed_char ;
301
+ #[ link_name = "llvm.ppc.altivec.vpkshus" ]
302
+ fn vpkshus ( a : vector_signed_short , b : vector_signed_short ) -> vector_unsigned_char ;
303
+ #[ link_name = "llvm.ppc.altivec.vpkuhus" ]
304
+ fn vpkuhus ( a : vector_unsigned_short , b : vector_unsigned_short ) -> vector_unsigned_char ;
305
+ #[ link_name = "llvm.ppc.altivec.vpkswss" ]
306
+ fn vpkswss ( a : vector_signed_int , b : vector_signed_int ) -> vector_signed_short ;
307
+ #[ link_name = "llvm.ppc.altivec.vpkswus" ]
308
+ fn vpkswus ( a : vector_signed_int , b : vector_signed_int ) -> vector_unsigned_short ;
309
+ #[ link_name = "llvm.ppc.altivec.vpkuwus" ]
310
+ fn vpkuwus ( a : vector_unsigned_int , b : vector_unsigned_int ) -> vector_unsigned_short ;
298
311
}
299
312
300
313
macro_rules! s_t_l {
@@ -2168,6 +2181,95 @@ mod sealed {
2168
2181
impl_vec_trait ! { [ VectorPack vec_pack] + vec_vpkuwum ( vector_signed_int, vector_signed_int) -> vector_signed_short }
2169
2182
impl_vec_trait ! { [ VectorPack vec_pack] + vec_vpkuwum ( vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_short }
2170
2183
impl_vec_trait ! { [ VectorPack vec_pack] + vec_vpkuwum ( vector_bool_int, vector_bool_int) -> vector_bool_short }
2184
+
2185
+ #[ inline]
2186
+ #[ target_feature( enable = "altivec" ) ]
2187
+ #[ cfg_attr( test, assert_instr( vpkshss) ) ]
2188
+ unsafe fn vec_vpkshss ( a : vector_signed_short , b : vector_signed_short ) -> vector_signed_char {
2189
+ if cfg ! ( target_endian = "little" ) {
2190
+ vpkshss ( b, a)
2191
+ } else {
2192
+ vpkshss ( a, b)
2193
+ }
2194
+ }
2195
+
2196
+ #[ inline]
2197
+ #[ target_feature( enable = "altivec" ) ]
2198
+ #[ cfg_attr( test, assert_instr( vpkshus) ) ]
2199
+ unsafe fn vec_vpkshus ( a : vector_signed_short , b : vector_signed_short ) -> vector_unsigned_char {
2200
+ if cfg ! ( target_endian = "little" ) {
2201
+ vpkshus ( b, a)
2202
+ } else {
2203
+ vpkshus ( a, b)
2204
+ }
2205
+ }
2206
+
2207
+ #[ inline]
2208
+ #[ target_feature( enable = "altivec" ) ]
2209
+ #[ cfg_attr( test, assert_instr( vpkuhus) ) ]
2210
+ unsafe fn vec_vpkuhus (
2211
+ a : vector_unsigned_short ,
2212
+ b : vector_unsigned_short ,
2213
+ ) -> vector_unsigned_char {
2214
+ if cfg ! ( target_endian = "little" ) {
2215
+ vpkuhus ( b, a)
2216
+ } else {
2217
+ vpkuhus ( a, b)
2218
+ }
2219
+ }
2220
+
2221
+ #[ inline]
2222
+ #[ target_feature( enable = "altivec" ) ]
2223
+ #[ cfg_attr( test, assert_instr( vpkswss) ) ]
2224
+ unsafe fn vec_vpkswss ( a : vector_signed_int , b : vector_signed_int ) -> vector_signed_short {
2225
+ if cfg ! ( target_endian = "little" ) {
2226
+ vpkswss ( b, a)
2227
+ } else {
2228
+ vpkswss ( a, b)
2229
+ }
2230
+ }
2231
+
2232
+ #[ inline]
2233
+ #[ target_feature( enable = "altivec" ) ]
2234
+ #[ cfg_attr( test, assert_instr( vpkswus) ) ]
2235
+ unsafe fn vec_vpkswus ( a : vector_signed_int , b : vector_signed_int ) -> vector_unsigned_short {
2236
+ if cfg ! ( target_endian = "little" ) {
2237
+ vpkswus ( b, a)
2238
+ } else {
2239
+ vpkswus ( a, b)
2240
+ }
2241
+ }
2242
+
2243
+ #[ inline]
2244
+ #[ target_feature( enable = "altivec" ) ]
2245
+ #[ cfg_attr( test, assert_instr( vpkuwus) ) ]
2246
+ unsafe fn vec_vpkuwus ( a : vector_unsigned_int , b : vector_unsigned_int ) -> vector_unsigned_short {
2247
+ if cfg ! ( target_endian = "little" ) {
2248
+ vpkuwus ( b, a)
2249
+ } else {
2250
+ vpkuwus ( a, b)
2251
+ }
2252
+ }
2253
+
2254
+ pub trait VectorPacks < Other > {
2255
+ type Result ;
2256
+ unsafe fn vec_packs ( self , b : Other ) -> Self :: Result ;
2257
+ }
2258
+
2259
+ impl_vec_trait ! { [ VectorPacks vec_packs] vec_vpkshss ( vector_signed_short, vector_signed_short) -> vector_signed_char }
2260
+ impl_vec_trait ! { [ VectorPacks vec_packs] vec_vpkuhus ( vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_char }
2261
+ impl_vec_trait ! { [ VectorPacks vec_packs] vec_vpkswss ( vector_signed_int, vector_signed_int) -> vector_signed_short }
2262
+ impl_vec_trait ! { [ VectorPacks vec_packs] vec_vpkuwus ( vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_short }
2263
+
2264
+ pub trait VectorPacksu < Other > {
2265
+ type Result ;
2266
+ unsafe fn vec_packsu ( self , b : Other ) -> Self :: Result ;
2267
+ }
2268
+
2269
+ impl_vec_trait ! { [ VectorPacksu vec_packsu] vec_vpkshus ( vector_signed_short, vector_signed_short) -> vector_unsigned_char }
2270
+ impl_vec_trait ! { [ VectorPacksu vec_packsu] vec_vpkuhus ( vector_unsigned_short, vector_unsigned_short) -> vector_unsigned_char }
2271
+ impl_vec_trait ! { [ VectorPacksu vec_packsu] vec_vpkswus ( vector_signed_int, vector_signed_int) -> vector_unsigned_short }
2272
+ impl_vec_trait ! { [ VectorPacksu vec_packsu] vec_vpkuwus ( vector_unsigned_int, vector_unsigned_int) -> vector_unsigned_short }
2171
2273
}
2172
2274
2173
2275
/// Vector Merge Low
@@ -2200,6 +2302,26 @@ where
2200
2302
a. vec_pack ( b)
2201
2303
}
2202
2304
2305
+ /// Vector Pack Saturated
2306
+ #[ inline]
2307
+ #[ target_feature( enable = "altivec" ) ]
2308
+ pub unsafe fn vec_packs < T , U > ( a : T , b : U ) -> <T as sealed:: VectorPacks < U > >:: Result
2309
+ where
2310
+ T : sealed:: VectorPacks < U > ,
2311
+ {
2312
+ a. vec_packs ( b)
2313
+ }
2314
+
2315
+ /// Vector Pack Saturated Unsigned
2316
+ #[ inline]
2317
+ #[ target_feature( enable = "altivec" ) ]
2318
+ pub unsafe fn vec_packsu < T , U > ( a : T , b : U ) -> <T as sealed:: VectorPacksu < U > >:: Result
2319
+ where
2320
+ T : sealed:: VectorPacksu < U > ,
2321
+ {
2322
+ a. vec_packsu ( b)
2323
+ }
2324
+
2203
2325
/// Vector Load Indexed.
2204
2326
#[ inline]
2205
2327
#[ target_feature( enable = "altivec" ) ]
0 commit comments