Skip to content

Commit 01f3bc7

Browse files
committed
add vrnd32x vrnd64x
1 parent d5ec8fa commit 01f3bc7

File tree

3 files changed

+183
-16
lines changed

3 files changed

+183
-16
lines changed

crates/core_arch/src/aarch64/neon/generated.rs

+168
Original file line numberDiff line numberDiff line change
@@ -12096,6 +12096,110 @@ pub unsafe fn vsha512su1q_u64(a: uint64x2_t, b: uint64x2_t, c: uint64x2_t) -> ui
1209612096
vsha512su1q_u64_(a, b, c)
1209712097
}
1209812098

12099+
/// Floating-point round to 32-bit integer, using current rounding mode
12100+
#[inline]
12101+
#[target_feature(enable = "neon,frintts")]
12102+
#[cfg_attr(test, assert_instr(frint32x))]
12103+
pub unsafe fn vrnd32x_f32(a: float32x2_t) -> float32x2_t {
12104+
#[allow(improper_ctypes)]
12105+
extern "unadjusted" {
12106+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.frint32x.v2f32")]
12107+
fn vrnd32x_f32_(a: float32x2_t) -> float32x2_t;
12108+
}
12109+
vrnd32x_f32_(a)
12110+
}
12111+
12112+
/// Floating-point round to 32-bit integer, using current rounding mode
12113+
#[inline]
12114+
#[target_feature(enable = "neon,frintts")]
12115+
#[cfg_attr(test, assert_instr(frint32x))]
12116+
pub unsafe fn vrnd32xq_f32(a: float32x4_t) -> float32x4_t {
12117+
#[allow(improper_ctypes)]
12118+
extern "unadjusted" {
12119+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.frint32x.v4f32")]
12120+
fn vrnd32xq_f32_(a: float32x4_t) -> float32x4_t;
12121+
}
12122+
vrnd32xq_f32_(a)
12123+
}
12124+
12125+
/// Floating-point round to 32-bit integer toward zero
12126+
#[inline]
12127+
#[target_feature(enable = "neon,frintts")]
12128+
#[cfg_attr(test, assert_instr(frint32z))]
12129+
pub unsafe fn vrnd32z_f32(a: float32x2_t) -> float32x2_t {
12130+
#[allow(improper_ctypes)]
12131+
extern "unadjusted" {
12132+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.frint32z.v2f32")]
12133+
fn vrnd32z_f32_(a: float32x2_t) -> float32x2_t;
12134+
}
12135+
vrnd32z_f32_(a)
12136+
}
12137+
12138+
/// Floating-point round to 32-bit integer toward zero
12139+
#[inline]
12140+
#[target_feature(enable = "neon,frintts")]
12141+
#[cfg_attr(test, assert_instr(frint32z))]
12142+
pub unsafe fn vrnd32zq_f32(a: float32x4_t) -> float32x4_t {
12143+
#[allow(improper_ctypes)]
12144+
extern "unadjusted" {
12145+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.frint32z.v4f32")]
12146+
fn vrnd32zq_f32_(a: float32x4_t) -> float32x4_t;
12147+
}
12148+
vrnd32zq_f32_(a)
12149+
}
12150+
12151+
/// Floating-point round to 64-bit integer, using current rounding mode
12152+
#[inline]
12153+
#[target_feature(enable = "neon,frintts")]
12154+
#[cfg_attr(test, assert_instr(frint64x))]
12155+
pub unsafe fn vrnd64x_f32(a: float32x2_t) -> float32x2_t {
12156+
#[allow(improper_ctypes)]
12157+
extern "unadjusted" {
12158+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.frint64x.v2f32")]
12159+
fn vrnd64x_f32_(a: float32x2_t) -> float32x2_t;
12160+
}
12161+
vrnd64x_f32_(a)
12162+
}
12163+
12164+
/// Floating-point round to 64-bit integer, using current rounding mode
12165+
#[inline]
12166+
#[target_feature(enable = "neon,frintts")]
12167+
#[cfg_attr(test, assert_instr(frint64x))]
12168+
pub unsafe fn vrnd64xq_f32(a: float32x4_t) -> float32x4_t {
12169+
#[allow(improper_ctypes)]
12170+
extern "unadjusted" {
12171+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.frint64x.v4f32")]
12172+
fn vrnd64xq_f32_(a: float32x4_t) -> float32x4_t;
12173+
}
12174+
vrnd64xq_f32_(a)
12175+
}
12176+
12177+
/// Floating-point round to 64-bit integer toward zero
12178+
#[inline]
12179+
#[target_feature(enable = "neon,frintts")]
12180+
#[cfg_attr(test, assert_instr(frint64z))]
12181+
pub unsafe fn vrnd64z_f32(a: float32x2_t) -> float32x2_t {
12182+
#[allow(improper_ctypes)]
12183+
extern "unadjusted" {
12184+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.frint64z.v2f32")]
12185+
fn vrnd64z_f32_(a: float32x2_t) -> float32x2_t;
12186+
}
12187+
vrnd64z_f32_(a)
12188+
}
12189+
12190+
/// Floating-point round to 64-bit integer toward zero
12191+
#[inline]
12192+
#[target_feature(enable = "neon,frintts")]
12193+
#[cfg_attr(test, assert_instr(frint64z))]
12194+
pub unsafe fn vrnd64zq_f32(a: float32x4_t) -> float32x4_t {
12195+
#[allow(improper_ctypes)]
12196+
extern "unadjusted" {
12197+
#[cfg_attr(target_arch = "aarch64", link_name = "llvm.aarch64.neon.frint64z.v4f32")]
12198+
fn vrnd64zq_f32_(a: float32x4_t) -> float32x4_t;
12199+
}
12200+
vrnd64zq_f32_(a)
12201+
}
12202+
1209912203
/// Transpose vectors
1210012204
#[inline]
1210112205
#[target_feature(enable = "neon")]
@@ -23147,6 +23251,70 @@ mod test {
2314723251
assert_eq!(r, e);
2314823252
}
2314923253

23254+
#[simd_test(enable = "neon,frintts")]
23255+
unsafe fn test_vrnd32x_f32() {
23256+
let a: f32x2 = f32x2::new(1.1, 1.9);
23257+
let e: f32x2 = f32x2::new(1.0, 2.0);
23258+
let r: f32x2 = transmute(vrnd32x_f32(transmute(a)));
23259+
assert_eq!(r, e);
23260+
}
23261+
23262+
#[simd_test(enable = "neon,frintts")]
23263+
unsafe fn test_vrnd32xq_f32() {
23264+
let a: f32x4 = f32x4::new(1.1, 1.9, -1.7, -2.3);
23265+
let e: f32x4 = f32x4::new(1.0, 2.0, -2.0, -2.0);
23266+
let r: f32x4 = transmute(vrnd32xq_f32(transmute(a)));
23267+
assert_eq!(r, e);
23268+
}
23269+
23270+
#[simd_test(enable = "neon,frintts")]
23271+
unsafe fn test_vrnd32z_f32() {
23272+
let a: f32x2 = f32x2::new(1.1, 1.9);
23273+
let e: f32x2 = f32x2::new(1.0, 1.0);
23274+
let r: f32x2 = transmute(vrnd32z_f32(transmute(a)));
23275+
assert_eq!(r, e);
23276+
}
23277+
23278+
#[simd_test(enable = "neon,frintts")]
23279+
unsafe fn test_vrnd32zq_f32() {
23280+
let a: f32x4 = f32x4::new(1.1, 1.9, -1.7, -2.3);
23281+
let e: f32x4 = f32x4::new(1.0, 1.0, -1.0, -2.0);
23282+
let r: f32x4 = transmute(vrnd32zq_f32(transmute(a)));
23283+
assert_eq!(r, e);
23284+
}
23285+
23286+
#[simd_test(enable = "neon,frintts")]
23287+
unsafe fn test_vrnd64x_f32() {
23288+
let a: f32x2 = f32x2::new(1.1, 1.9);
23289+
let e: f32x2 = f32x2::new(1.0, 2.0);
23290+
let r: f32x2 = transmute(vrnd64x_f32(transmute(a)));
23291+
assert_eq!(r, e);
23292+
}
23293+
23294+
#[simd_test(enable = "neon,frintts")]
23295+
unsafe fn test_vrnd64xq_f32() {
23296+
let a: f32x4 = f32x4::new(1.1, 1.9, -1.7, -2.3);
23297+
let e: f32x4 = f32x4::new(1.0, 2.0, -2.0, -2.0);
23298+
let r: f32x4 = transmute(vrnd64xq_f32(transmute(a)));
23299+
assert_eq!(r, e);
23300+
}
23301+
23302+
#[simd_test(enable = "neon,frintts")]
23303+
unsafe fn test_vrnd64z_f32() {
23304+
let a: f32x2 = f32x2::new(1.1, 1.9);
23305+
let e: f32x2 = f32x2::new(1.0, 1.0);
23306+
let r: f32x2 = transmute(vrnd64z_f32(transmute(a)));
23307+
assert_eq!(r, e);
23308+
}
23309+
23310+
#[simd_test(enable = "neon,frintts")]
23311+
unsafe fn test_vrnd64zq_f32() {
23312+
let a: f32x4 = f32x4::new(1.1, 1.9, -1.7, -2.3);
23313+
let e: f32x4 = f32x4::new(1.0, 1.0, -1.0, -2.0);
23314+
let r: f32x4 = transmute(vrnd64zq_f32(transmute(a)));
23315+
assert_eq!(r, e);
23316+
}
23317+
2315023318
#[simd_test(enable = "neon")]
2315123319
unsafe fn test_vtrn1_s8() {
2315223320
let a: i8x8 = i8x8::new(0, 2, 4, 6, 8, 10, 12, 14);

crates/stdarch-gen/neon.spec

+8-9
Original file line numberDiff line numberDiff line change
@@ -6966,42 +6966,41 @@ generate uint64x2_t
69666966
name = vrnd32x
69676967
a = 1.1, 1.9, -1.7, -2.3
69686968
validate 1.0, 2.0, -2.0, -2.0
6969-
target = v8.5a
6969+
target = frintts
69706970

69716971
aarch64 = frint32x
69726972
link-aarch64 = frint32x._EXT_
6973-
// v8.5a is no_runtime feature
6974-
//generate float32x2_t, float32x4_t
6973+
generate float32x2_t, float32x4_t
69756974

69766975
/// Floating-point round to 32-bit integer toward zero
69776976
name = vrnd32z
69786977
a = 1.1, 1.9, -1.7, -2.3
69796978
validate 1.0, 1.0, -1.0, -2.0
6980-
target = v8.5a
6979+
target = frintts
69816980

69826981
aarch64 = frint32z
69836982
link-aarch64 = frint32z._EXT_
6984-
//generate float32x2_t, float32x4_t
6983+
generate float32x2_t, float32x4_t
69856984

69866985
/// Floating-point round to 64-bit integer, using current rounding mode
69876986
name = vrnd64x
69886987
a = 1.1, 1.9, -1.7, -2.3
69896988
validate 1.0, 2.0, -2.0, -2.0
6990-
target = v8.5a
6989+
target = frintts
69916990

69926991
aarch64 = frint64x
69936992
link-aarch64 = frint64x._EXT_
6994-
//generate float32x2_t, float32x4_t
6993+
generate float32x2_t, float32x4_t
69956994

69966995
/// Floating-point round to 64-bit integer toward zero
69976996
name = vrnd64z
69986997
a = 1.1, 1.9, -1.7, -2.3
69996998
validate 1.0, 1.0, -1.0, -2.0
7000-
target = v8.5a
6999+
target = frintts
70017000

70027001
aarch64 = frint64z
70037002
link-aarch64 = frint64z._EXT_
7004-
//generate float32x2_t, float32x4_t
7003+
generate float32x2_t, float32x4_t
70057004

70067005
/// Transpose elements
70077006
name = vtrn

crates/stdarch-gen/src/main.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ enum TargetFeature {
467467
SHA3,
468468
RDM,
469469
SM4,
470-
V85a,
470+
FTTS,
471471
}
472472

473473
#[derive(Clone, Copy)]
@@ -1074,7 +1074,7 @@ fn gen_aarch64(
10741074
SHA3 => "neon,sha3",
10751075
RDM => "rdm",
10761076
SM4 => "neon,sm4",
1077-
V85a => "neon,v8.5a",
1077+
FTTS => "neon,frintts",
10781078
};
10791079
let current_fn = if let Some(current_fn) = current_fn.clone() {
10801080
if link_aarch64.is_some() {
@@ -1389,7 +1389,7 @@ fn gen_aarch64(
13891389
I8MM => "neon,i8mm",
13901390
SM4 => "neon,sm4",
13911391
SHA3 => "neon,sha3",
1392-
V85a => "neon,v8.5a",
1392+
FTTS => "neon,frintts",
13931393
_ => "neon",
13941394
};
13951395
let test = match fn_type {
@@ -1795,7 +1795,7 @@ fn gen_arm(
17951795
SHA3 => "neon,sha3",
17961796
RDM => "rdm",
17971797
SM4 => "neon,sm4",
1798-
V85a => "neon,v8.5a",
1798+
FTTS => "neon,frintts",
17991799
};
18001800
let current_target_arm = match target {
18011801
Default => "v7",
@@ -1809,7 +1809,7 @@ fn gen_arm(
18091809
RDM => unreachable!(),
18101810
SM4 => unreachable!(),
18111811
SHA3 => unreachable!(),
1812-
V85a => unreachable!(),
1812+
FTTS => unreachable!(),
18131813
};
18141814
let current_fn = if let Some(current_fn) = current_fn.clone() {
18151815
if link_aarch64.is_some() || link_arm.is_some() {
@@ -2389,7 +2389,7 @@ fn gen_arm(
23892389
I8MM => "neon,i8mm",
23902390
SM4 => "neon,sm4",
23912391
SHA3 => "neon,sha3",
2392-
V85a => "neon,v8.5a",
2392+
FTTS => "neon,frintts",
23932393
_ => "neon",
23942394
};
23952395
let test = match fn_type {
@@ -3205,7 +3205,7 @@ mod test {
32053205
"sha3" => SHA3,
32063206
"rdm" => RDM,
32073207
"sm4" => SM4,
3208-
"v8.5a" => V85a,
3208+
"frintts" => FTTS,
32093209
_ => Default,
32103210
},
32113211
_ => Default,

0 commit comments

Comments
 (0)