Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
platform_intrinsics,
stmt_expr_attributes,
simd_ffi,
link_llvm_intrinsics
link_llvm_intrinsics,
rustc_attrs
)
)]

Expand Down
219 changes: 206 additions & 13 deletions src/neon/intrinsics.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//use std::arch::

use crate::neon::simd_llvm;

use crate::neon::simd_llvm::{self, *};
use std::hint::unreachable_unchecked;
use std::mem;
use core;

Expand Down Expand Up @@ -67,21 +67,214 @@ pub unsafe fn vnegq_s8(a: int8x16_t) -> int8x16_t {
}


/// Extract vector from pair of vectors
//uint8x16_t vextq_s8 (uint8x16_t a, uint8x16_t b, const int n)
#[inline]
fn rotate_(a: u128, b: u128, n: u128) -> u128 {
let az = a >> (n * 8);
let bz = b << (128 - (n * 8));
az | bz
}

#[inline]
pub unsafe fn vextq_u8(a: uint8x16_t, b: uint8x16_t, n: u8) -> uint8x16_t {
mem::transmute(rotate_(mem::transmute(a), mem::transmute(b), n as u128))
#[target_feature(enable = "neon")]
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
#[rustc_args_required_const(2)]
pub unsafe fn vextq_u8(a: uint8x16_t, b: uint8x16_t, n: i32) -> uint8x16_t {
if n < 0 || n > 15 {
unreachable_unchecked();
};
match n & 0b1111 {
0 => simd_shuffle16(a, b, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
1 => simd_shuffle16(
a,
b,
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
),
2 => simd_shuffle16(
a,
b,
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
),
3 => simd_shuffle16(
a,
b,
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
),
4 => simd_shuffle16(
a,
b,
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
),
5 => simd_shuffle16(
a,
b,
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
),
6 => simd_shuffle16(
a,
b,
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21],
),
7 => simd_shuffle16(
a,
b,
[7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22],
),
8 => simd_shuffle16(
a,
b,
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
),
9 => simd_shuffle16(
a,
b,
[
9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
],
),
10 => simd_shuffle16(
a,
b,
[
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
],
),
11 => simd_shuffle16(
a,
b,
[
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
],
),
12 => simd_shuffle16(
a,
b,
[
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
],
),
13 => simd_shuffle16(
a,
b,
[
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
],
),
14 => simd_shuffle16(
a,
b,
[
14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
],
),
15 => simd_shuffle16(
a,
b,
[
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
],
),
_ => unreachable_unchecked(),
}
}

/// Extract vector from pair of vectors
//int8x16_t vextq_s8 (int8x16_t a, int8x16_t b, const int n)
#[inline]
pub unsafe fn vextq_s8(a: int8x16_t, b: int8x16_t, n: u8) -> int8x16_t {
mem::transmute(rotate_(mem::transmute(a), mem::transmute(b), n as u128))
#[target_feature(enable = "neon")]
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
#[rustc_args_required_const(2)]
pub unsafe fn vextq_s8(a: int8x16_t, b: int8x16_t, n: i32) -> int8x16_t {
if n < 0 || n > 15 {
unreachable_unchecked();
};
match n & 0b1111 {
0 => simd_shuffle16(a, b, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
1 => simd_shuffle16(
a,
b,
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
),
2 => simd_shuffle16(
a,
b,
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
),
3 => simd_shuffle16(
a,
b,
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
),
4 => simd_shuffle16(
a,
b,
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
),
5 => simd_shuffle16(
a,
b,
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
),
6 => simd_shuffle16(
a,
b,
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21],
),
7 => simd_shuffle16(
a,
b,
[7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22],
),
8 => simd_shuffle16(
a,
b,
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
),
9 => simd_shuffle16(
a,
b,
[
9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
],
),
10 => simd_shuffle16(
a,
b,
[
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
],
),
11 => simd_shuffle16(
a,
b,
[
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
],
),
12 => simd_shuffle16(
a,
b,
[
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
],
),
13 => simd_shuffle16(
a,
b,
[
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
],
),
14 => simd_shuffle16(
a,
b,
[
14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
],
),
15 => simd_shuffle16(
a,
b,
[
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
],
),
_ => unreachable_unchecked(),
}
}

#[inline]
Expand Down
4 changes: 2 additions & 2 deletions src/neon/simd_llvm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ extern "platform-intrinsic" {
// pub fn simd_shuffle2<T, U>(x: T, y: T, idx: [u32; 2]) -> U;
// pub fn simd_shuffle4<T, U>(x: T, y: T, idx: [u32; 4]) -> U;
// pub fn simd_shuffle8<T, U>(x: T, y: T, idx: [u32; 8]) -> U;
// pub fn simd_shuffle16<T, U>(x: T, y: T, idx: [u32; 16]) -> U;
pub fn simd_shuffle16<T, U>(x: T, y: T, idx: [u32; 16]) -> U;
// pub fn simd_shuffle32<T, U>(x: T, y: T, idx: [u32; 32]) -> U;
// pub fn simd_shuffle64<T, U>(x: T, y: T, idx: [u32; 64]) -> U;
// pub fn simd_shuffle128<T, U>(x: T, y: T, idx: [u32; 128]) -> U;
Expand Down Expand Up @@ -51,4 +51,4 @@ extern "platform-intrinsic" {
//
// pub fn simd_fsqrt<T>(a: T) -> T;
// pub fn simd_fma<T>(a: T, b: T, c: T) -> T;
}
}