Bounds check SIMD on ARM.

Closes #126.
This commit is contained in:
Patrick Walton 2019-04-18 14:05:30 -07:00
parent c688d04412
commit cb9fe3edf2
1 changed files with 5 additions and 0 deletions

View File

@ -139,6 +139,7 @@ impl Index<usize> for F32x4 {
#[inline] #[inline]
fn index(&self, index: usize) -> &f32 { fn index(&self, index: usize) -> &f32 {
unsafe { unsafe {
assert!(index < 4);
let ptr = &self.0 as *const float32x4_t as *const f32; let ptr = &self.0 as *const float32x4_t as *const f32;
mem::transmute::<*const f32, &f32>(ptr.offset(index as isize)) mem::transmute::<*const f32, &f32>(ptr.offset(index as isize))
} }
@ -149,6 +150,7 @@ impl IndexMut<usize> for F32x4 {
#[inline] #[inline]
fn index_mut(&mut self, index: usize) -> &mut f32 { fn index_mut(&mut self, index: usize) -> &mut f32 {
unsafe { unsafe {
assert!(index < 4);
let ptr = &mut self.0 as *mut float32x4_t as *mut f32; let ptr = &mut self.0 as *mut float32x4_t as *mut f32;
mem::transmute::<*mut f32, &mut f32>(ptr.offset(index as isize)) mem::transmute::<*mut f32, &mut f32>(ptr.offset(index as isize))
} }
@ -265,6 +267,7 @@ impl Index<usize> for I32x4 {
#[inline] #[inline]
fn index(&self, index: usize) -> &i32 { fn index(&self, index: usize) -> &i32 {
unsafe { unsafe {
assert!(index < 4);
let ptr = &self.0 as *const int32x4_t as *const i32; let ptr = &self.0 as *const int32x4_t as *const i32;
mem::transmute::<*const i32, &i32>(ptr.offset(index as isize)) mem::transmute::<*const i32, &i32>(ptr.offset(index as isize))
} }
@ -275,6 +278,7 @@ impl IndexMut<usize> for I32x4 {
#[inline] #[inline]
fn index_mut(&mut self, index: usize) -> &mut i32 { fn index_mut(&mut self, index: usize) -> &mut i32 {
unsafe { unsafe {
assert!(index < 4);
let ptr = &mut self.0 as *mut int32x4_t as *mut i32; let ptr = &mut self.0 as *mut int32x4_t as *mut i32;
mem::transmute::<*mut i32, &mut i32>(ptr.offset(index as isize)) mem::transmute::<*mut i32, &mut i32>(ptr.offset(index as isize))
} }
@ -335,6 +339,7 @@ impl Index<usize> for U32x4 {
#[inline] #[inline]
fn index(&self, index: usize) -> &u32 { fn index(&self, index: usize) -> &u32 {
unsafe { unsafe {
assert!(index < 4);
let ptr = &self.0 as *const uint32x4_t as *const u32; let ptr = &self.0 as *const uint32x4_t as *const u32;
mem::transmute::<*const u32, &u32>(ptr.offset(index as isize)) mem::transmute::<*const u32, &u32>(ptr.offset(index as isize))
} }