diff --git a/library/stdarch/crates/core_arch/src/aarch64/neon/generated.rs b/library/stdarch/crates/core_arch/src/aarch64/neon/generated.rs index db76c8721dd7..a74aa578d8b8 100644 --- a/library/stdarch/crates/core_arch/src/aarch64/neon/generated.rs +++ b/library/stdarch/crates/core_arch/src/aarch64/neon/generated.rs @@ -73,6 +73,150 @@ pub unsafe fn vceqq_f64(a: float64x2_t, b: float64x2_t) -> uint64x2_t { simd_eq(a, b) } +/// Signed Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Signed Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Signed Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Signed Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Signed Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Signed Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Signed Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Signed Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Signed Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Signed Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Unsigned Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Unsigned Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Unsigned Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Unsigned Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Unsigned Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Unsigned Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Unsigned Compare bitwise equal to zero +#[inline] +#[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)) +} + +/// Unsigned Compare bitwise equal to zero +#[inline] +#[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)) +} + /// Compare signed greater than #[inline] #[target_feature(enable = "neon")] @@ -358,14 +502,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceq_u64() { - let a: u64x1 = u64x1::new(0xFF_FF_FF_FF_FF_FF_FF_FF); - let b: u64x1 = u64x1::new(0xFF_FF_FF_FF_FF_FF_FF_FF); + let a: u64x1 = u64x1::new(0); + let b: u64x1 = u64x1::new(0); let e: u64x1 = u64x1::new(0xFF_FF_FF_FF_FF_FF_FF_FF); let r: u64x1 = transmute(vceq_u64(transmute(a), transmute(b))); assert_eq!(r, e); - let a: u64x1 = u64x1::new(0xFF_FF_FF_FF_FF_FF_FF_FF); - let b: u64x1 = u64x1::new(0xFF_FF_FF_FF_FF_FF_FF_FF); + let a: u64x1 = u64x1::new(0); + let b: u64x1 = u64x1::new(0); let e: u64x1 = u64x1::new(0xFF_FF_FF_FF_FF_FF_FF_FF); let r: u64x1 = transmute(vceq_u64(transmute(a), transmute(b))); assert_eq!(r, e); @@ -373,14 +517,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceqq_u64() { - let a: u64x2 = u64x2::new(0xFF_FF_FF_FF_FF_FF_FF_FF, 0x01); - let b: u64x2 = u64x2::new(0xFF_FF_FF_FF_FF_FF_FF_FF, 0x01); + let a: u64x2 = u64x2::new(0, 0x01); + let b: u64x2 = u64x2::new(0, 0x01); let e: u64x2 = u64x2::new(0xFF_FF_FF_FF_FF_FF_FF_FF, 0xFF_FF_FF_FF_FF_FF_FF_FF); let r: u64x2 = transmute(vceqq_u64(transmute(a), transmute(b))); assert_eq!(r, e); - let a: u64x2 = u64x2::new(0xFF_FF_FF_FF_FF_FF_FF_FF, 0xFF_FF_FF_FF_FF_FF_FF_FF); - let b: u64x2 = u64x2::new(0xFF_FF_FF_FF_FF_FF_FF_FF, 0); + let a: u64x2 = u64x2::new(0, 0); + let b: u64x2 = u64x2::new(0, 0xFF_FF_FF_FF_FF_FF_FF_FF); let e: u64x2 = u64x2::new(0xFF_FF_FF_FF_FF_FF_FF_FF, 0); let r: u64x2 = transmute(vceqq_u64(transmute(a), transmute(b))); assert_eq!(r, e); @@ -388,14 +532,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceq_s64() { - let a: i64x1 = i64x1::new(0x7F_FF_FF_FF_FF_FF_FF_FF); - let b: i64x1 = i64x1::new(0x7F_FF_FF_FF_FF_FF_FF_FF); + let a: i64x1 = i64x1::new(-9223372036854775808); + let b: i64x1 = i64x1::new(-9223372036854775808); let e: u64x1 = u64x1::new(0xFF_FF_FF_FF_FF_FF_FF_FF); let r: u64x1 = transmute(vceq_s64(transmute(a), transmute(b))); assert_eq!(r, e); - let a: i64x1 = i64x1::new(0x7F_FF_FF_FF_FF_FF_FF_FF); - let b: i64x1 = i64x1::new(0x7F_FF_FF_FF_FF_FF_FF_FF); + let a: i64x1 = i64x1::new(-9223372036854775808); + let b: i64x1 = i64x1::new(-9223372036854775808); let e: u64x1 = u64x1::new(0xFF_FF_FF_FF_FF_FF_FF_FF); let r: u64x1 = transmute(vceq_s64(transmute(a), transmute(b))); assert_eq!(r, e); @@ -403,14 +547,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceqq_s64() { - let a: i64x2 = i64x2::new(0x7F_FF_FF_FF_FF_FF_FF_FF, 0x01); - let b: i64x2 = i64x2::new(0x7F_FF_FF_FF_FF_FF_FF_FF, 0x01); + let a: i64x2 = i64x2::new(-9223372036854775808, 0x01); + let b: i64x2 = i64x2::new(-9223372036854775808, 0x01); let e: u64x2 = u64x2::new(0xFF_FF_FF_FF_FF_FF_FF_FF, 0xFF_FF_FF_FF_FF_FF_FF_FF); let r: u64x2 = transmute(vceqq_s64(transmute(a), transmute(b))); assert_eq!(r, e); - let a: i64x2 = i64x2::new(0x7F_FF_FF_FF_FF_FF_FF_FF, 0x7F_FF_FF_FF_FF_FF_FF_FF); - let b: i64x2 = i64x2::new(0x7F_FF_FF_FF_FF_FF_FF_FF, -9223372036854775808); + let a: i64x2 = i64x2::new(-9223372036854775808, -9223372036854775808); + let b: i64x2 = i64x2::new(-9223372036854775808, 0x7F_FF_FF_FF_FF_FF_FF_FF); let e: u64x2 = u64x2::new(0xFF_FF_FF_FF_FF_FF_FF_FF, 0); let r: u64x2 = transmute(vceqq_s64(transmute(a), transmute(b))); assert_eq!(r, e); @@ -418,14 +562,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceq_p64() { - let a: i64x1 = i64x1::new(0x7F_FF_FF_FF_FF_FF_FF_FF); - let b: i64x1 = i64x1::new(0x7F_FF_FF_FF_FF_FF_FF_FF); + let a: i64x1 = i64x1::new(-9223372036854775808); + let b: i64x1 = i64x1::new(-9223372036854775808); let e: u64x1 = u64x1::new(0xFF_FF_FF_FF_FF_FF_FF_FF); let r: u64x1 = transmute(vceq_p64(transmute(a), transmute(b))); assert_eq!(r, e); - let a: i64x1 = i64x1::new(0x7F_FF_FF_FF_FF_FF_FF_FF); - let b: i64x1 = i64x1::new(0x7F_FF_FF_FF_FF_FF_FF_FF); + let a: i64x1 = i64x1::new(-9223372036854775808); + let b: i64x1 = i64x1::new(-9223372036854775808); let e: u64x1 = u64x1::new(0xFF_FF_FF_FF_FF_FF_FF_FF); let r: u64x1 = transmute(vceq_p64(transmute(a), transmute(b))); assert_eq!(r, e); @@ -433,14 +577,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceqq_p64() { - let a: i64x2 = i64x2::new(0x7F_FF_FF_FF_FF_FF_FF_FF, 0x01); - let b: i64x2 = i64x2::new(0x7F_FF_FF_FF_FF_FF_FF_FF, 0x01); + let a: i64x2 = i64x2::new(-9223372036854775808, 0x01); + let b: i64x2 = i64x2::new(-9223372036854775808, 0x01); let e: u64x2 = u64x2::new(0xFF_FF_FF_FF_FF_FF_FF_FF, 0xFF_FF_FF_FF_FF_FF_FF_FF); let r: u64x2 = transmute(vceqq_p64(transmute(a), transmute(b))); assert_eq!(r, e); - let a: i64x2 = i64x2::new(0x7F_FF_FF_FF_FF_FF_FF_FF, 0x7F_FF_FF_FF_FF_FF_FF_FF); - let b: i64x2 = i64x2::new(0x7F_FF_FF_FF_FF_FF_FF_FF, -9223372036854775808); + let a: i64x2 = i64x2::new(-9223372036854775808, -9223372036854775808); + let b: i64x2 = i64x2::new(-9223372036854775808, 0x7F_FF_FF_FF_FF_FF_FF_FF); let e: u64x2 = u64x2::new(0xFF_FF_FF_FF_FF_FF_FF_FF, 0); let r: u64x2 = transmute(vceqq_p64(transmute(a), transmute(b))); assert_eq!(r, e); @@ -464,6 +608,150 @@ mod test { assert_eq!(r, e); } + #[simd_test(enable = "neon")] + unsafe fn test_vceqz_s8() { + let a: i8x8 = i8x8::new(-128, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06); + let e: u8x8 = u8x8::new(0, 0xFF, 0, 0, 0, 0, 0, 0); + let r: u8x8 = transmute(vceqz_s8(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqzq_s8() { + let a: i8x16 = i8x16::new(-128, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x7F); + let e: u8x16 = u8x16::new(0, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + let r: u8x16 = transmute(vceqzq_s8(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqz_s16() { + let a: i16x4 = i16x4::new(-32768, 0x00, 0x01, 0x02); + let e: u16x4 = u16x4::new(0, 0xFF_FF, 0, 0); + let r: u16x4 = transmute(vceqz_s16(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqzq_s16() { + let a: i16x8 = i16x8::new(-32768, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06); + let e: u16x8 = u16x8::new(0, 0xFF_FF, 0, 0, 0, 0, 0, 0); + let r: u16x8 = transmute(vceqzq_s16(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqz_s32() { + let a: i32x2 = i32x2::new(-2147483648, 0x00); + let e: u32x2 = u32x2::new(0, 0xFF_FF_FF_FF); + let r: u32x2 = transmute(vceqz_s32(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqzq_s32() { + let a: i32x4 = i32x4::new(-2147483648, 0x00, 0x01, 0x02); + let e: u32x4 = u32x4::new(0, 0xFF_FF_FF_FF, 0, 0); + let r: u32x4 = transmute(vceqzq_s32(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqz_s64() { + let a: i64x1 = i64x1::new(-9223372036854775808); + let e: u64x1 = u64x1::new(0); + let r: u64x1 = transmute(vceqz_s64(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqzq_s64() { + let a: i64x2 = i64x2::new(-9223372036854775808, 0x00); + let e: u64x2 = u64x2::new(0, 0xFF_FF_FF_FF_FF_FF_FF_FF); + let r: u64x2 = transmute(vceqzq_s64(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqz_p64() { + let a: i64x1 = i64x1::new(-9223372036854775808); + let e: u64x1 = u64x1::new(0); + let r: u64x1 = transmute(vceqz_p64(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqzq_p64() { + let a: i64x2 = i64x2::new(-9223372036854775808, 0x00); + let e: u64x2 = u64x2::new(0, 0xFF_FF_FF_FF_FF_FF_FF_FF); + let r: u64x2 = transmute(vceqzq_p64(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqz_u8() { + let a: u8x8 = u8x8::new(0, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06); + let e: u8x8 = u8x8::new(0xFF, 0xFF, 0, 0, 0, 0, 0, 0); + let r: u8x8 = transmute(vceqz_u8(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqzq_u8() { + let a: u8x16 = u8x16::new(0, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF); + let e: u8x16 = u8x16::new(0xFF, 0xFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + let r: u8x16 = transmute(vceqzq_u8(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqz_u16() { + let a: u16x4 = u16x4::new(0, 0x00, 0x01, 0x02); + let e: u16x4 = u16x4::new(0xFF_FF, 0xFF_FF, 0, 0); + let r: u16x4 = transmute(vceqz_u16(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqzq_u16() { + let a: u16x8 = u16x8::new(0, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06); + let e: u16x8 = u16x8::new(0xFF_FF, 0xFF_FF, 0, 0, 0, 0, 0, 0); + let r: u16x8 = transmute(vceqzq_u16(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqz_u32() { + let a: u32x2 = u32x2::new(0, 0x00); + let e: u32x2 = u32x2::new(0xFF_FF_FF_FF, 0xFF_FF_FF_FF); + let r: u32x2 = transmute(vceqz_u32(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqzq_u32() { + let a: u32x4 = u32x4::new(0, 0x00, 0x01, 0x02); + let e: u32x4 = u32x4::new(0xFF_FF_FF_FF, 0xFF_FF_FF_FF, 0, 0); + let r: u32x4 = transmute(vceqzq_u32(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqz_u64() { + let a: u64x1 = u64x1::new(0); + let e: u64x1 = u64x1::new(0xFF_FF_FF_FF_FF_FF_FF_FF); + let r: u64x1 = transmute(vceqz_u64(transmute(a))); + assert_eq!(r, e); + } + + #[simd_test(enable = "neon")] + unsafe fn test_vceqzq_u64() { + let a: u64x2 = u64x2::new(0, 0x00); + let e: u64x2 = u64x2::new(0xFF_FF_FF_FF_FF_FF_FF_FF, 0xFF_FF_FF_FF_FF_FF_FF_FF); + let r: u64x2 = transmute(vceqzq_u64(transmute(a))); + assert_eq!(r, e); + } + #[simd_test(enable = "neon")] unsafe fn test_vcgt_s64() { let a: i64x1 = i64x1::new(1); diff --git a/library/stdarch/crates/core_arch/src/arm/neon/generated.rs b/library/stdarch/crates/core_arch/src/arm/neon/generated.rs index c60ad9cc5019..da8fcefcf6f4 100644 --- a/library/stdarch/crates/core_arch/src/arm/neon/generated.rs +++ b/library/stdarch/crates/core_arch/src/arm/neon/generated.rs @@ -3455,14 +3455,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceq_u8() { - let a: u8x8 = u8x8::new(0xFF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); - let b: u8x8 = u8x8::new(0xFF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let a: u8x8 = u8x8::new(0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let b: u8x8 = u8x8::new(0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); let e: u8x8 = u8x8::new(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); let r: u8x8 = transmute(vceq_u8(transmute(a), transmute(b))); assert_eq!(r, e); - let a: u8x8 = u8x8::new(0xFF, 0xFF, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); - let b: u8x8 = u8x8::new(0xFF, 0, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08); + let a: u8x8 = u8x8::new(0, 0, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let b: u8x8 = u8x8::new(0, 0xFF, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08); let e: u8x8 = u8x8::new(0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0); let r: u8x8 = transmute(vceq_u8(transmute(a), transmute(b))); assert_eq!(r, e); @@ -3470,14 +3470,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceqq_u8() { - let a: u8x16 = u8x16::new(0xFF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0); - let b: u8x16 = u8x16::new(0xFF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0); + let a: u8x16 = u8x16::new(0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF); + let b: u8x16 = u8x16::new(0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF); let e: u8x16 = u8x16::new(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); let r: u8x16 = transmute(vceqq_u8(transmute(a), transmute(b))); assert_eq!(r, e); - let a: u8x16 = u8x16::new(0xFF, 0xFF, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xCC, 0x0D, 0xEE, 0); - let b: u8x16 = u8x16::new(0xFF, 0, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08, 0x08, 0x00, 0x0A, 0x0A, 0xCC, 0xD0, 0xEE, 0xFF); + let a: u8x16 = u8x16::new(0, 0, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xCC, 0x0D, 0xEE, 0xFF); + let b: u8x16 = u8x16::new(0, 0xFF, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08, 0x08, 0x00, 0x0A, 0x0A, 0xCC, 0xD0, 0xEE, 0); let e: u8x16 = u8x16::new(0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0); let r: u8x16 = transmute(vceqq_u8(transmute(a), transmute(b))); assert_eq!(r, e); @@ -3485,14 +3485,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceq_u16() { - let a: u16x4 = u16x4::new(0xFF_FF, 0x01, 0x02, 0x03); - let b: u16x4 = u16x4::new(0xFF_FF, 0x01, 0x02, 0x03); + let a: u16x4 = u16x4::new(0, 0x01, 0x02, 0x03); + let b: u16x4 = u16x4::new(0, 0x01, 0x02, 0x03); let e: u16x4 = u16x4::new(0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF); let r: u16x4 = transmute(vceq_u16(transmute(a), transmute(b))); assert_eq!(r, e); - let a: u16x4 = u16x4::new(0xFF_FF, 0xFF_FF, 0x02, 0x03); - let b: u16x4 = u16x4::new(0xFF_FF, 0, 0x02, 0x04); + let a: u16x4 = u16x4::new(0, 0, 0x02, 0x03); + let b: u16x4 = u16x4::new(0, 0xFF_FF, 0x02, 0x04); let e: u16x4 = u16x4::new(0xFF_FF, 0, 0xFF_FF, 0); let r: u16x4 = transmute(vceq_u16(transmute(a), transmute(b))); assert_eq!(r, e); @@ -3500,14 +3500,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceqq_u16() { - let a: u16x8 = u16x8::new(0xFF_FF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); - let b: u16x8 = u16x8::new(0xFF_FF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let a: u16x8 = u16x8::new(0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let b: u16x8 = u16x8::new(0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); let e: u16x8 = u16x8::new(0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF); let r: u16x8 = transmute(vceqq_u16(transmute(a), transmute(b))); assert_eq!(r, e); - let a: u16x8 = u16x8::new(0xFF_FF, 0xFF_FF, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); - let b: u16x8 = u16x8::new(0xFF_FF, 0, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08); + let a: u16x8 = u16x8::new(0, 0, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let b: u16x8 = u16x8::new(0, 0xFF_FF, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08); let e: u16x8 = u16x8::new(0xFF_FF, 0, 0xFF_FF, 0, 0xFF_FF, 0, 0xFF_FF, 0); let r: u16x8 = transmute(vceqq_u16(transmute(a), transmute(b))); assert_eq!(r, e); @@ -3515,14 +3515,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceq_u32() { - let a: u32x2 = u32x2::new(0xFF_FF_FF_FF, 0x01); - let b: u32x2 = u32x2::new(0xFF_FF_FF_FF, 0x01); + let a: u32x2 = u32x2::new(0, 0x01); + let b: u32x2 = u32x2::new(0, 0x01); let e: u32x2 = u32x2::new(0xFF_FF_FF_FF, 0xFF_FF_FF_FF); let r: u32x2 = transmute(vceq_u32(transmute(a), transmute(b))); assert_eq!(r, e); - let a: u32x2 = u32x2::new(0xFF_FF_FF_FF, 0xFF_FF_FF_FF); - let b: u32x2 = u32x2::new(0xFF_FF_FF_FF, 0); + let a: u32x2 = u32x2::new(0, 0); + let b: u32x2 = u32x2::new(0, 0xFF_FF_FF_FF); let e: u32x2 = u32x2::new(0xFF_FF_FF_FF, 0); let r: u32x2 = transmute(vceq_u32(transmute(a), transmute(b))); assert_eq!(r, e); @@ -3530,14 +3530,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceqq_u32() { - let a: u32x4 = u32x4::new(0xFF_FF_FF_FF, 0x01, 0x02, 0x03); - let b: u32x4 = u32x4::new(0xFF_FF_FF_FF, 0x01, 0x02, 0x03); + let a: u32x4 = u32x4::new(0, 0x01, 0x02, 0x03); + let b: u32x4 = u32x4::new(0, 0x01, 0x02, 0x03); let e: u32x4 = u32x4::new(0xFF_FF_FF_FF, 0xFF_FF_FF_FF, 0xFF_FF_FF_FF, 0xFF_FF_FF_FF); let r: u32x4 = transmute(vceqq_u32(transmute(a), transmute(b))); assert_eq!(r, e); - let a: u32x4 = u32x4::new(0xFF_FF_FF_FF, 0xFF_FF_FF_FF, 0x02, 0x03); - let b: u32x4 = u32x4::new(0xFF_FF_FF_FF, 0, 0x02, 0x04); + let a: u32x4 = u32x4::new(0, 0, 0x02, 0x03); + let b: u32x4 = u32x4::new(0, 0xFF_FF_FF_FF, 0x02, 0x04); let e: u32x4 = u32x4::new(0xFF_FF_FF_FF, 0, 0xFF_FF_FF_FF, 0); let r: u32x4 = transmute(vceqq_u32(transmute(a), transmute(b))); assert_eq!(r, e); @@ -3545,14 +3545,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceq_s8() { - let a: i8x8 = i8x8::new(0x7F, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); - let b: i8x8 = i8x8::new(0x7F, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let a: i8x8 = i8x8::new(-128, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let b: i8x8 = i8x8::new(-128, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); let e: u8x8 = u8x8::new(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); let r: u8x8 = transmute(vceq_s8(transmute(a), transmute(b))); assert_eq!(r, e); - let a: i8x8 = i8x8::new(0x7F, 0x7F, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); - let b: i8x8 = i8x8::new(0x7F, -128, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08); + let a: i8x8 = i8x8::new(-128, -128, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let b: i8x8 = i8x8::new(-128, 0x7F, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08); let e: u8x8 = u8x8::new(0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0); let r: u8x8 = transmute(vceq_s8(transmute(a), transmute(b))); assert_eq!(r, e); @@ -3560,14 +3560,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceqq_s8() { - let a: i8x16 = i8x16::new(0x7F, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, -128); - let b: i8x16 = i8x16::new(0x7F, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, -128); + let a: i8x16 = i8x16::new(-128, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x7F); + let b: i8x16 = i8x16::new(-128, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x7F); let e: u8x16 = u8x16::new(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); let r: u8x16 = transmute(vceqq_s8(transmute(a), transmute(b))); assert_eq!(r, e); - let a: i8x16 = i8x16::new(0x7F, 0x7F, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xCC, 0x0D, 0xEE, -128); - let b: i8x16 = i8x16::new(0x7F, -128, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08, 0x08, 0x00, 0x0A, 0x0A, 0xCC, 0xD0, 0xEE, 0x7F); + let a: i8x16 = i8x16::new(-128, -128, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xCC, 0x0D, 0xEE, 0x7F); + let b: i8x16 = i8x16::new(-128, 0x7F, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08, 0x08, 0x00, 0x0A, 0x0A, 0xCC, 0xD0, 0xEE, -128); let e: u8x16 = u8x16::new(0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF, 0); let r: u8x16 = transmute(vceqq_s8(transmute(a), transmute(b))); assert_eq!(r, e); @@ -3575,14 +3575,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceq_s16() { - let a: i16x4 = i16x4::new(0x7F_FF, 0x01, 0x02, 0x03); - let b: i16x4 = i16x4::new(0x7F_FF, 0x01, 0x02, 0x03); + let a: i16x4 = i16x4::new(-32768, 0x01, 0x02, 0x03); + let b: i16x4 = i16x4::new(-32768, 0x01, 0x02, 0x03); let e: u16x4 = u16x4::new(0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF); let r: u16x4 = transmute(vceq_s16(transmute(a), transmute(b))); assert_eq!(r, e); - let a: i16x4 = i16x4::new(0x7F_FF, 0x7F_FF, 0x02, 0x03); - let b: i16x4 = i16x4::new(0x7F_FF, -32768, 0x02, 0x04); + let a: i16x4 = i16x4::new(-32768, -32768, 0x02, 0x03); + let b: i16x4 = i16x4::new(-32768, 0x7F_FF, 0x02, 0x04); let e: u16x4 = u16x4::new(0xFF_FF, 0, 0xFF_FF, 0); let r: u16x4 = transmute(vceq_s16(transmute(a), transmute(b))); assert_eq!(r, e); @@ -3590,14 +3590,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceqq_s16() { - let a: i16x8 = i16x8::new(0x7F_FF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); - let b: i16x8 = i16x8::new(0x7F_FF, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let a: i16x8 = i16x8::new(-32768, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let b: i16x8 = i16x8::new(-32768, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); let e: u16x8 = u16x8::new(0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF, 0xFF_FF); let r: u16x8 = transmute(vceqq_s16(transmute(a), transmute(b))); assert_eq!(r, e); - let a: i16x8 = i16x8::new(0x7F_FF, 0x7F_FF, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); - let b: i16x8 = i16x8::new(0x7F_FF, -32768, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08); + let a: i16x8 = i16x8::new(-32768, -32768, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07); + let b: i16x8 = i16x8::new(-32768, 0x7F_FF, 0x02, 0x04, 0x04, 0x00, 0x06, 0x08); let e: u16x8 = u16x8::new(0xFF_FF, 0, 0xFF_FF, 0, 0xFF_FF, 0, 0xFF_FF, 0); let r: u16x8 = transmute(vceqq_s16(transmute(a), transmute(b))); assert_eq!(r, e); @@ -3605,14 +3605,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceq_s32() { - let a: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x01); - let b: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x01); + let a: i32x2 = i32x2::new(-2147483648, 0x01); + let b: i32x2 = i32x2::new(-2147483648, 0x01); let e: u32x2 = u32x2::new(0xFF_FF_FF_FF, 0xFF_FF_FF_FF); let r: u32x2 = transmute(vceq_s32(transmute(a), transmute(b))); assert_eq!(r, e); - let a: i32x2 = i32x2::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF); - let b: i32x2 = i32x2::new(0x7F_FF_FF_FF, -2147483648); + let a: i32x2 = i32x2::new(-2147483648, -2147483648); + let b: i32x2 = i32x2::new(-2147483648, 0x7F_FF_FF_FF); let e: u32x2 = u32x2::new(0xFF_FF_FF_FF, 0); let r: u32x2 = transmute(vceq_s32(transmute(a), transmute(b))); assert_eq!(r, e); @@ -3620,14 +3620,14 @@ mod test { #[simd_test(enable = "neon")] unsafe fn test_vceqq_s32() { - let a: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x01, 0x02, 0x03); - let b: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x01, 0x02, 0x03); + let a: i32x4 = i32x4::new(-2147483648, 0x01, 0x02, 0x03); + let b: i32x4 = i32x4::new(-2147483648, 0x01, 0x02, 0x03); let e: u32x4 = u32x4::new(0xFF_FF_FF_FF, 0xFF_FF_FF_FF, 0xFF_FF_FF_FF, 0xFF_FF_FF_FF); let r: u32x4 = transmute(vceqq_s32(transmute(a), transmute(b))); assert_eq!(r, e); - let a: i32x4 = i32x4::new(0x7F_FF_FF_FF, 0x7F_FF_FF_FF, 0x02, 0x03); - let b: i32x4 = i32x4::new(0x7F_FF_FF_FF, -2147483648, 0x02, 0x04); + let a: i32x4 = i32x4::new(-2147483648, -2147483648, 0x02, 0x03); + let b: i32x4 = i32x4::new(-2147483648, 0x7F_FF_FF_FF, 0x02, 0x04); let e: u32x4 = u32x4::new(0xFF_FF_FF_FF, 0, 0xFF_FF_FF_FF, 0); let r: u32x4 = transmute(vceqq_s32(transmute(a), transmute(b))); assert_eq!(r, e); diff --git a/library/stdarch/crates/core_arch/src/macros.rs b/library/stdarch/crates/core_arch/src/macros.rs index 87e49fba4bcb..5d05adfa6ac8 100644 --- a/library/stdarch/crates/core_arch/src/macros.rs +++ b/library/stdarch/crates/core_arch/src/macros.rs @@ -426,13 +426,13 @@ macro_rules! constify_imm3 { macro_rules! types { ($( $(#[$doc:meta])* - pub struct $name:ident($($fields:tt)*); + pub struct $name:ident($field:ty$(, $fields:ty)*$(,)?); )*) => ($( $(#[$doc])* #[derive(Copy, Clone, Debug)] #[allow(non_camel_case_types)] #[repr(simd)] #[allow(clippy::missing_inline_in_public_items)] - pub struct $name($($fields)*); + pub struct $name(pub $field$(, pub $fields)*); )*) } diff --git a/library/stdarch/crates/stdarch-gen/neon.spec b/library/stdarch/crates/stdarch-gen/neon.spec index 5c705c15db48..7805df501bfa 100644 --- a/library/stdarch/crates/stdarch-gen/neon.spec +++ b/library/stdarch/crates/stdarch-gen/neon.spec @@ -136,6 +136,26 @@ arm = vceq. // we are missing float16x4_t:uint16x4_t, float16x8_t:uint16x8_t generate float32x2_t:uint32x2_t, float32x4_t:uint32x4_t +/// Signed Compare bitwise equal to zero +name = vceqz +fn = simd_eq +a = MIN, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, MAX +fixed = 0 +validate FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE + +aarch64 = vceqz +generate int8x8_t:uint8x8_t, int8x16_t:uint8x16_t, int16x4_t:uint16x4_t, int16x8_t:uint16x8_t, int32x2_t:uint32x2_t, int32x4_t:uint32x4_t, int64x1_t:uint64x1_t, int64x2_t:uint64x2_t, poly64x1_t:uint64x1_t, poly64x2_t:uint64x2_t + +/// Unsigned Compare bitwise equal to zero +name = vceqz +fn = simd_eq +a = MIN, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, MAX +fixed = 0 +validate TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE + +aarch64 = vceqz +generate uint*_t, uint64x*_t + //////////////////// // greater then //////////////////// diff --git a/library/stdarch/crates/stdarch-gen/src/main.rs b/library/stdarch/crates/stdarch-gen/src/main.rs index 6e341c00dd8a..7498ab93ff50 100644 --- a/library/stdarch/crates/stdarch-gen/src/main.rs +++ b/library/stdarch/crates/stdarch-gen/src/main.rs @@ -282,8 +282,8 @@ fn map_val<'v>(t: &str, v: &'v str) -> &'v str { match v { "FALSE" => false_val(t), "TRUE" => true_val(t), - "MAX" => min_val(t), - "MIN" => max_val(t), + "MAX" => max_val(t), + "MIN" => min_val(t), "FF" => ff_val(t), o => o, } @@ -299,6 +299,8 @@ fn gen_aarch64( in_t: &str, out_t: &str, current_tests: &[(Vec, Vec, Vec)], + has_b: bool, + fixed: &Option, ) -> (String, String) { let _global_t = type_to_global_type(in_t); let _global_ret_t = type_to_global_type(out_t); @@ -333,20 +335,40 @@ fn gen_aarch64( } else { String::new() }; + let call = if has_b { + format!( + r#"pub unsafe fn {}(a: {}, b: {}) -> {} {{ + {}{}(a, b) +}}"#, + name, in_t, in_t, out_t, ext_c, current_fn, + ) + } else if let Some(fixed_val) = fixed { + let mut fixed_vals = fixed_val.clone(); + for _i in 1..type_len(in_t) { + fixed_vals.push_str(", "); + fixed_vals.push_str(fixed_val); + } + format!( + r#"pub unsafe fn {}(a: {}) -> {} {{ + {}{}(a, {}({})) +}}"#, + name, in_t, out_t, ext_c, current_fn, in_t, fixed_vals, + ) + } else { + String::new() + }; let function = format!( r#" {} #[inline] #[target_feature(enable = "neon")] #[cfg_attr(test, assert_instr({}))] -pub unsafe fn {}(a: {}, b: {}) -> {} {{ - {}{}(a, b) -}} +{} "#, - current_comment, current_aarch64, name, in_t, in_t, out_t, ext_c, current_fn, + current_comment, current_aarch64, call ); - let test = gen_test(name, &in_t, &out_t, current_tests, type_len(in_t)); + let test = gen_test(name, &in_t, &out_t, current_tests, type_len(in_t), has_b); (function, test) } @@ -356,6 +378,7 @@ fn gen_test( out_t: &str, current_tests: &[(Vec, Vec, Vec)], len: usize, + has_b: bool, ) -> String { let mut test = format!( r#" @@ -367,20 +390,35 @@ fn gen_test( let a: Vec = a.iter().take(len).cloned().collect(); let b: Vec = b.iter().take(len).cloned().collect(); let e: Vec = e.iter().take(len).cloned().collect(); - let t = format!( - r#" + let t = if has_b { + format!( + r#" let a{}; let b{}; let e{}; let r: {} = transmute({}(transmute(a), transmute(b))); assert_eq!(r, e); "#, - values(in_t, &a), - values(in_t, &b), - values(out_t, &e), - type_to_global_type(out_t), - name - ); + values(in_t, &a), + values(in_t, &b), + values(out_t, &e), + type_to_global_type(out_t), + name + ) + } else { + format!( + r#" + let a{}; + let e{}; + let r: {} = transmute({}(transmute(a))); + assert_eq!(r, e); +"#, + values(in_t, &a), + values(out_t, &e), + type_to_global_type(out_t), + name + ) + }; test.push_str(&t); } test.push_str(" }\n"); @@ -399,6 +437,8 @@ fn gen_arm( in_t: &str, out_t: &str, current_tests: &[(Vec, Vec, Vec)], + has_b: bool, + fixed: &Option, ) -> (String, String) { let _global_t = type_to_global_type(in_t); let _global_ret_t = type_to_global_type(out_t); @@ -446,7 +486,28 @@ fn gen_arm( } else { String::new() }; - + let call = if has_b { + format!( + r#"pub unsafe fn {}(a: {}, b: {}) -> {} {{ + {}{}(a, b) +}}"#, + name, in_t, in_t, out_t, ext_c, current_fn, + ) + } else if let Some(fixed_val) = fixed { + let mut fixed_vals = fixed_val.clone(); + for _i in 1..type_len(in_t) { + fixed_vals.push_str(", "); + fixed_vals.push_str(fixed_val); + } + format!( + r#"pub unsafe fn {}(a: {}) -> {} {{ + {}{}(a, {}({})) +}}"#, + name, in_t, out_t, ext_c, current_fn, in_t, fixed_vals, + ) + } else { + String::new() + }; let function = format!( r#" {} @@ -455,21 +516,14 @@ fn gen_arm( #[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))] #[cfg_attr(all(test, target_arch = "arm"), assert_instr({}))] #[cfg_attr(all(test, target_arch = "aarch64"), assert_instr({}))] -pub unsafe fn {}(a: {}, b: {}) -> {} {{ - {}{}(a, b) -}} +{} "#, current_comment, expand_intrinsic(¤t_arm, in_t), expand_intrinsic(¤t_aarch64, in_t), - name, - in_t, - in_t, - out_t, - ext_c, - current_fn, + call, ); - let test = gen_test(name, &in_t, &out_t, current_tests, type_len(in_t)); + let test = gen_test(name, &in_t, &out_t, current_tests, type_len(in_t), has_b); (function, test) } @@ -558,6 +612,7 @@ fn main() -> io::Result<()> { let mut link_aarch64: Option = None; let mut a: Vec = Vec::new(); let mut b: Vec = Vec::new(); + let mut fixed: Option = None; let mut current_tests: Vec<(Vec, Vec, Vec)> = Vec::new(); // @@ -628,6 +683,9 @@ mod test { link_aarch64 = None; link_arm = None; current_tests = Vec::new(); + a = Vec::new(); + b = Vec::new(); + fixed = None; } else if line.starts_with("//") { } else if line.starts_with("name = ") { current_name = Some(String::from(&line[7..])); @@ -641,6 +699,8 @@ mod test { a = line[4..].split(',').map(|v| v.trim().to_string()).collect(); } else if line.starts_with("b = ") { b = line[4..].split(',').map(|v| v.trim().to_string()).collect(); + } else if line.starts_with("fixed = ") { + fixed = Some(String::from(&line[8..])); } else if line.starts_with("validate ") { let e = line[9..].split(',').map(|v| v.trim().to_string()).collect(); current_tests.push((a.clone(), b.clone(), e)); @@ -692,6 +752,8 @@ mod test { &in_t, &out_t, ¤t_tests, + b.len() > 0, + &fixed, ); out_arm.push_str(&function); tests_arm.push_str(&test); @@ -705,6 +767,8 @@ mod test { &in_t, &out_t, ¤t_tests, + b.len() > 0, + &fixed, ); out_aarch64.push_str(&function); tests_aarch64.push_str(&test);