use transmute in vceqz instructions in aarch64/neon/generated.rs

This commit is contained in:
SparrowLii 2021-03-04 22:29:04 +08:00 committed by Amanieu d'Antras
parent 86c9a12d00
commit 3bfa7593a7
3 changed files with 60 additions and 34 deletions

View file

@ -78,7 +78,7 @@ pub unsafe fn vceqq_f64(a: float64x2_t, b: float64x2_t) -> uint64x2_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqz_s8(a: int8x8_t) -> uint8x8_t {
simd_eq(a, int8x8_t(0, 0, 0, 0, 0, 0, 0, 0))
simd_eq(a, transmute(i8x8::new(0, 0, 0, 0, 0, 0, 0, 0)))
}
/// Signed Compare bitwise equal to zero
@ -86,7 +86,7 @@ pub unsafe fn vceqz_s8(a: int8x8_t) -> uint8x8_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqzq_s8(a: int8x16_t) -> uint8x16_t {
simd_eq(a, int8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
simd_eq(a, transmute(i8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)))
}
/// Signed Compare bitwise equal to zero
@ -94,7 +94,7 @@ pub unsafe fn vceqzq_s8(a: int8x16_t) -> uint8x16_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqz_s16(a: int16x4_t) -> uint16x4_t {
simd_eq(a, int16x4_t(0, 0, 0, 0))
simd_eq(a, transmute(i16x4::new(0, 0, 0, 0)))
}
/// Signed Compare bitwise equal to zero
@ -102,7 +102,7 @@ pub unsafe fn vceqz_s16(a: int16x4_t) -> uint16x4_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqzq_s16(a: int16x8_t) -> uint16x8_t {
simd_eq(a, int16x8_t(0, 0, 0, 0, 0, 0, 0, 0))
simd_eq(a, transmute(i16x8::new(0, 0, 0, 0, 0, 0, 0, 0)))
}
/// Signed Compare bitwise equal to zero
@ -110,7 +110,7 @@ pub unsafe fn vceqzq_s16(a: int16x8_t) -> uint16x8_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqz_s32(a: int32x2_t) -> uint32x2_t {
simd_eq(a, int32x2_t(0, 0))
simd_eq(a, transmute(i32x2::new(0, 0)))
}
/// Signed Compare bitwise equal to zero
@ -118,7 +118,7 @@ pub unsafe fn vceqz_s32(a: int32x2_t) -> uint32x2_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqzq_s32(a: int32x4_t) -> uint32x4_t {
simd_eq(a, int32x4_t(0, 0, 0, 0))
simd_eq(a, transmute(i32x4::new(0, 0, 0, 0)))
}
/// Signed Compare bitwise equal to zero
@ -126,7 +126,7 @@ pub unsafe fn vceqzq_s32(a: int32x4_t) -> uint32x4_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqz_s64(a: int64x1_t) -> uint64x1_t {
simd_eq(a, int64x1_t(0))
simd_eq(a, transmute(i64x1::new(0)))
}
/// Signed Compare bitwise equal to zero
@ -134,7 +134,7 @@ pub unsafe fn vceqz_s64(a: int64x1_t) -> uint64x1_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqzq_s64(a: int64x2_t) -> uint64x2_t {
simd_eq(a, int64x2_t(0, 0))
simd_eq(a, transmute(i64x2::new(0, 0)))
}
/// Signed Compare bitwise equal to zero
@ -142,7 +142,7 @@ pub unsafe fn vceqzq_s64(a: int64x2_t) -> uint64x2_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqz_p64(a: poly64x1_t) -> uint64x1_t {
simd_eq(a, poly64x1_t(0))
simd_eq(a, transmute(i64x1::new(0)))
}
/// Signed Compare bitwise equal to zero
@ -150,7 +150,7 @@ pub unsafe fn vceqz_p64(a: poly64x1_t) -> uint64x1_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqzq_p64(a: poly64x2_t) -> uint64x2_t {
simd_eq(a, poly64x2_t(0, 0))
simd_eq(a, transmute(i64x2::new(0, 0)))
}
/// Unsigned Compare bitwise equal to zero
@ -158,7 +158,7 @@ pub unsafe fn vceqzq_p64(a: poly64x2_t) -> uint64x2_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqz_u8(a: uint8x8_t) -> uint8x8_t {
simd_eq(a, uint8x8_t(0, 0, 0, 0, 0, 0, 0, 0))
simd_eq(a, transmute(u8x8::new(0, 0, 0, 0, 0, 0, 0, 0)))
}
/// Unsigned Compare bitwise equal to zero
@ -166,7 +166,7 @@ pub unsafe fn vceqz_u8(a: uint8x8_t) -> uint8x8_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqzq_u8(a: uint8x16_t) -> uint8x16_t {
simd_eq(a, uint8x16_t(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
simd_eq(a, transmute(u8x16::new(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)))
}
/// Unsigned Compare bitwise equal to zero
@ -174,7 +174,7 @@ pub unsafe fn vceqzq_u8(a: uint8x16_t) -> uint8x16_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqz_u16(a: uint16x4_t) -> uint16x4_t {
simd_eq(a, uint16x4_t(0, 0, 0, 0))
simd_eq(a, transmute(u16x4::new(0, 0, 0, 0)))
}
/// Unsigned Compare bitwise equal to zero
@ -182,7 +182,7 @@ pub unsafe fn vceqz_u16(a: uint16x4_t) -> uint16x4_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqzq_u16(a: uint16x8_t) -> uint16x8_t {
simd_eq(a, uint16x8_t(0, 0, 0, 0, 0, 0, 0, 0))
simd_eq(a, transmute(u16x8::new(0, 0, 0, 0, 0, 0, 0, 0)))
}
/// Unsigned Compare bitwise equal to zero
@ -190,7 +190,7 @@ pub unsafe fn vceqzq_u16(a: uint16x8_t) -> uint16x8_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqz_u32(a: uint32x2_t) -> uint32x2_t {
simd_eq(a, uint32x2_t(0, 0))
simd_eq(a, transmute(u32x2::new(0, 0)))
}
/// Unsigned Compare bitwise equal to zero
@ -198,7 +198,7 @@ pub unsafe fn vceqz_u32(a: uint32x2_t) -> uint32x2_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqzq_u32(a: uint32x4_t) -> uint32x4_t {
simd_eq(a, uint32x4_t(0, 0, 0, 0))
simd_eq(a, transmute(u32x4::new(0, 0, 0, 0)))
}
/// Unsigned Compare bitwise equal to zero
@ -206,7 +206,7 @@ pub unsafe fn vceqzq_u32(a: uint32x4_t) -> uint32x4_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqz_u64(a: uint64x1_t) -> uint64x1_t {
simd_eq(a, uint64x1_t(0))
simd_eq(a, transmute(u64x1::new(0)))
}
/// Unsigned Compare bitwise equal to zero
@ -214,7 +214,7 @@ pub unsafe fn vceqz_u64(a: uint64x1_t) -> uint64x1_t {
#[target_feature(enable = "neon")]
#[cfg_attr(test, assert_instr(vceqz))]
pub unsafe fn vceqzq_u64(a: uint64x2_t) -> uint64x2_t {
simd_eq(a, uint64x2_t(0, 0))
simd_eq(a, transmute(u64x2::new(0, 0)))
}
/// Compare signed greater than

View file

@ -426,13 +426,13 @@ macro_rules! constify_imm3 {
macro_rules! types {
($(
$(#[$doc:meta])*
pub struct $name:ident($field:ty$(, $fields:ty)*$(,)?);
pub struct $name:ident($($fields:tt)*);
)*) => ($(
$(#[$doc])*
#[derive(Copy, Clone, Debug)]
#[allow(non_camel_case_types)]
#[repr(simd)]
#[allow(clippy::missing_inline_in_public_items)]
pub struct $name(pub $field$(, pub $fields)*);
pub struct $name($($fields)*);
)*)
}

View file

@ -299,7 +299,7 @@ fn gen_aarch64(
in_t: &str,
out_t: &str,
current_tests: &[(Vec<String>, Vec<String>, Vec<String>)],
has_b: bool,
single_para: bool,
fixed: &Option<String>,
) -> (String, String) {
let _global_t = type_to_global_type(in_t);
@ -335,7 +335,7 @@ fn gen_aarch64(
} else {
String::new()
};
let call = if has_b {
let call = if !single_para {
format!(
r#"pub unsafe fn {}(a: {}, b: {}) -> {} {{
{}{}(a, b)
@ -350,9 +350,15 @@ fn gen_aarch64(
}
format!(
r#"pub unsafe fn {}(a: {}) -> {} {{
{}{}(a, {}({}))
{}{}(a, transmute({}::new({})))
}}"#,
name, in_t, out_t, ext_c, current_fn, in_t, fixed_vals,
name,
in_t,
out_t,
ext_c,
current_fn,
type_to_global_type(in_t),
fixed_vals,
)
} else {
String::new()
@ -368,7 +374,14 @@ fn gen_aarch64(
current_comment, current_aarch64, call
);
let test = gen_test(name, &in_t, &out_t, current_tests, type_len(in_t), has_b);
let test = gen_test(
name,
&in_t,
&out_t,
current_tests,
type_len(in_t),
single_para,
);
(function, test)
}
@ -378,7 +391,7 @@ fn gen_test(
out_t: &str,
current_tests: &[(Vec<String>, Vec<String>, Vec<String>)],
len: usize,
has_b: bool,
single_para: bool,
) -> String {
let mut test = format!(
r#"
@ -390,7 +403,7 @@ fn gen_test(
let a: Vec<String> = a.iter().take(len).cloned().collect();
let b: Vec<String> = b.iter().take(len).cloned().collect();
let e: Vec<String> = e.iter().take(len).cloned().collect();
let t = if has_b {
let t = if !single_para {
format!(
r#"
let a{};
@ -437,7 +450,7 @@ fn gen_arm(
in_t: &str,
out_t: &str,
current_tests: &[(Vec<String>, Vec<String>, Vec<String>)],
has_b: bool,
single_para: bool,
fixed: &Option<String>,
) -> (String, String) {
let _global_t = type_to_global_type(in_t);
@ -486,7 +499,7 @@ fn gen_arm(
} else {
String::new()
};
let call = if has_b {
let call = if !single_para {
format!(
r#"pub unsafe fn {}(a: {}, b: {}) -> {} {{
{}{}(a, b)
@ -501,9 +514,15 @@ fn gen_arm(
}
format!(
r#"pub unsafe fn {}(a: {}) -> {} {{
{}{}(a, {}({}))
{}{}(a, transmute({}::new({})))
}}"#,
name, in_t, out_t, ext_c, current_fn, in_t, fixed_vals,
name,
in_t,
out_t,
ext_c,
current_fn,
type_to_global_type(in_t),
fixed_vals,
)
} else {
String::new()
@ -523,7 +542,14 @@ fn gen_arm(
expand_intrinsic(&current_aarch64, in_t),
call,
);
let test = gen_test(name, &in_t, &out_t, current_tests, type_len(in_t), has_b);
let test = gen_test(
name,
&in_t,
&out_t,
current_tests,
type_len(in_t),
single_para,
);
(function, test)
}
@ -752,7 +778,7 @@ mod test {
&in_t,
&out_t,
&current_tests,
b.len() > 0,
b.len() == 0,
&fixed,
);
out_arm.push_str(&function);
@ -767,7 +793,7 @@ mod test {
&in_t,
&out_t,
&current_tests,
b.len() > 0,
b.len() == 0,
&fixed,
);
out_aarch64.push_str(&function);