@@ -285,6 +285,11 @@ extern "C" {
285
285
b3 : int8x16_t ,
286
286
c : uint8x16_t ,
287
287
) -> int8x16_t ;
288
+
289
+ #[ link_name = "llvm.aarch64.neon.fcvtzu.v4i32.v4f32" ]
290
+ fn vcvtq_u32_f32_ ( a : float32x4_t ) -> uint32x4_t ;
291
+ #[ link_name = "llvm.aarch64.neon.fcvtzs.v4i32.v4f32" ]
292
+ fn vcvtq_s32_f32_ ( a : float32x4_t ) -> int32x4_t ;
288
293
}
289
294
290
295
/// Absolute Value (wrapping).
@@ -1838,6 +1843,21 @@ pub unsafe fn vld1q_u32(addr: *const u32) -> uint32x4_t {
1838
1843
) )
1839
1844
}
1840
1845
1846
+ #[ inline]
1847
+ #[ target_feature( enable = "neon" ) ]
1848
+ #[ cfg_attr( test, assert_instr( fcvtzs) ) ]
1849
+ pub unsafe fn vcvtq_s32_f32 ( a : float32x4_t ) -> int32x4_t {
1850
+ vcvtq_s32_f32_ ( a)
1851
+ }
1852
+
1853
+ /// Floating-point Convert to Unsigned fixed-point, rounding toward Zero (vector)
1854
+ #[ inline]
1855
+ #[ target_feature( enable = "neon" ) ]
1856
+ #[ cfg_attr( test, assert_instr( fcvtzu) ) ]
1857
+ pub unsafe fn vcvtq_u32_f32 ( a : float32x4_t ) -> uint32x4_t {
1858
+ vcvtq_u32_f32_ ( a)
1859
+ }
1860
+
1841
1861
#[ cfg( test) ]
1842
1862
mod tests {
1843
1863
use crate :: core_arch:: aarch64:: test_support:: * ;
@@ -1846,6 +1866,42 @@ mod tests {
1846
1866
use std:: mem:: transmute;
1847
1867
use stdarch_test:: simd_test;
1848
1868
1869
+ #[ simd_test( enable = "neon" ) ]
1870
+ unsafe fn test_vcvtq_s32_f32 ( ) {
1871
+ let f = f32x4:: new ( -1. , 2. , 3. , 4. ) ;
1872
+ let e = i32x4:: new ( -1 , 2 , 3 , 4 ) ;
1873
+ let r: i32x4 = transmute ( vcvtq_s32_f32 ( transmute ( f) ) ) ;
1874
+ assert_eq ! ( r, e) ;
1875
+
1876
+ let f = f32x4:: new ( 10e37 , 2. , 3. , 4. ) ;
1877
+ let e = i32x4:: new ( 0x7fffffff , 2 , 3 , 4 ) ;
1878
+ let r: i32x4 = transmute ( vcvtq_s32_f32 ( transmute ( f) ) ) ;
1879
+ assert_eq ! ( r, e) ;
1880
+
1881
+ let f = f32x4:: new ( -10e37 , 2. , 3. , 4. ) ;
1882
+ let e = i32x4:: new ( -0x80000000 , 2 , 3 , 4 ) ;
1883
+ let r: i32x4 = transmute ( vcvtq_s32_f32 ( transmute ( f) ) ) ;
1884
+ assert_eq ! ( r, e) ;
1885
+ }
1886
+
1887
+ #[ simd_test( enable = "neon" ) ]
1888
+ unsafe fn test_vcvtq_u32_f32 ( ) {
1889
+ let f = f32x4:: new ( 1. , 2. , 3. , 4. ) ;
1890
+ let e = u32x4:: new ( 1 , 2 , 3 , 4 ) ;
1891
+ let r: u32x4 = transmute ( vcvtq_u32_f32 ( transmute ( f) ) ) ;
1892
+ assert_eq ! ( r, e) ;
1893
+
1894
+ let f = f32x4:: new ( -1. , 2. , 3. , 4. ) ;
1895
+ let e = u32x4:: new ( 0 , 2 , 3 , 4 ) ;
1896
+ let r: u32x4 = transmute ( vcvtq_u32_f32 ( transmute ( f) ) ) ;
1897
+ assert_eq ! ( r, e) ;
1898
+
1899
+ let f = f32x4:: new ( 10e37 , 2. , 3. , 4. ) ;
1900
+ let e = u32x4:: new ( 0xffffffff , 2 , 3 , 4 ) ;
1901
+ let r: u32x4 = transmute ( vcvtq_u32_f32 ( transmute ( f) ) ) ;
1902
+ assert_eq ! ( r, e) ;
1903
+ }
1904
+
1849
1905
#[ simd_test( enable = "neon" ) ]
1850
1906
unsafe fn test_vld1q_f32 ( ) {
1851
1907
let e = f32x4:: new ( 1. , 2. , 3. , 4. ) ;
0 commit comments