Added using of (read|write)_unaligned for unaligned pointers on arm64 architecture.

This commit is contained in:
Kirill Kuzminykh
2023-05-03 15:16:52 +03:00
parent 351c749974
commit 07778909a7
5 changed files with 23 additions and 17 deletions
+8 -1
View File
@@ -1,8 +1,15 @@
## [Unreleased] - ReleaseDate
### Crate
- Added using of (read|write)_unaligned for unaligned pointers on `arm64` architecture.
([#15](https://github.com/Cykooz/fast_image_resize/issues/15)).
## [2.7.1] - 2023-04-28
### Crate
- Use (read|write)_unaligned for unaligned pointers
- Added using of (read|write)_unaligned for unaligned pointers on `x86_64` architecture.
([#16](https://github.com/Cykooz/fast_image_resize/pull/16)).
## [2.7.0] - 2023-03-24
+2 -2
View File
@@ -157,7 +157,7 @@ unsafe fn store_tmp_buf_into_dst_row<const IMM: i32>(
let sss_u16 = vcombine_u16(vqmovun_s32(sss_i32), vqmovun_s32(sss_i32));
let res = vdupd_laneq_u64::<0>(vreinterpretq_u64_u16(sss_u16));
let dst_ptr = dst_chunk.as_mut_ptr() as *mut u64;
*dst_ptr = res;
dst_ptr.write_unaligned(res);
}
let mut dst_chunks_2 = dst_chunks_4.into_remainder().chunks_exact_mut(2);
@@ -170,7 +170,7 @@ unsafe fn store_tmp_buf_into_dst_row<const IMM: i32>(
let sss_u16 = vcombine_u16(vqmovun_s32(sss_i32), vqmovun_s32(sss_i32));
let res = vdups_laneq_u32::<0>(vreinterpretq_u32_u16(sss_u16));
let dst_ptr = dst_chunk.as_mut_ptr() as *mut u32;
*dst_ptr = res;
dst_ptr.write_unaligned(res);
}
let dst_chunk = dst_chunks_2.into_remainder();
+2 -2
View File
@@ -167,7 +167,7 @@ unsafe fn store_tmp_buf_into_dst_row<const IMM: i32>(
let sss_u8 = vcombine_u8(vqmovun_s16(sss_i16), vqmovun_s16(sss_i16));
let res = vdupd_laneq_u64::<0>(vreinterpretq_u64_u8(sss_u8));
let dst_ptr = dst_chunk.as_mut_ptr() as *mut u64;
*dst_ptr = res;
dst_ptr.write_unaligned(res);
}
let mut dst_chunks_4 = dst_chunks_8.into_remainder().chunks_exact_mut(4);
@@ -180,7 +180,7 @@ unsafe fn store_tmp_buf_into_dst_row<const IMM: i32>(
let sss_u8 = vcombine_u8(vqmovun_s16(sss_i16), vqmovun_s16(sss_i16));
let res = vdups_laneq_u32::<0>(vreinterpretq_u32_u8(sss_u8));
let dst_ptr = dst_chunk.as_mut_ptr() as *mut u32;
*dst_ptr = res;
dst_ptr.write_unaligned(res);
}
let dst_chunk = dst_chunks_4.into_remainder();
+9 -9
View File
@@ -3,19 +3,19 @@ use std::arch::aarch64::*;
#[inline(always)]
pub unsafe fn load_u8x1<T>(buf: &[T], index: usize) -> uint8x8_t {
let ptr = buf.get_unchecked(index..).as_ptr() as *const u8;
vcreate_u8(*ptr as u64)
vcreate_u8(ptr.read_unaligned() as u64)
}
#[inline(always)]
pub unsafe fn load_u8x2<T>(buf: &[T], index: usize) -> uint8x8_t {
let ptr = buf.get_unchecked(index..).as_ptr() as *const u16;
vcreate_u8(*ptr as u64)
vcreate_u8(ptr.read_unaligned() as u64)
}
#[inline(always)]
pub unsafe fn load_u8x4<T>(buf: &[T], index: usize) -> uint8x8_t {
let ptr = buf.get_unchecked(index..).as_ptr() as *const u32;
vcreate_u8(*ptr as u64)
vcreate_u8(ptr.read_unaligned() as u64)
}
#[inline(always)]
@@ -71,13 +71,13 @@ pub unsafe fn load_deintrel_u8x16x4<T>(buf: &[T], index: usize) -> uint8x16x4_t
#[inline(always)]
pub unsafe fn load_u16x1<T>(buf: &[T], index: usize) -> uint16x4_t {
let ptr = buf.get_unchecked(index..).as_ptr() as *const u16;
vcreate_u16(*ptr as u64)
vcreate_u16(ptr.read_unaligned() as u64)
}
#[inline(always)]
pub unsafe fn load_u16x2<T>(buf: &[T], index: usize) -> uint16x4_t {
let ptr = buf.get_unchecked(index..).as_ptr() as *const u32;
vcreate_u16(*ptr as u64)
vcreate_u16(ptr.read_unaligned() as u64)
}
#[inline(always)]
@@ -151,7 +151,7 @@ pub unsafe fn load_deintrel_u16x8x4<T>(buf: &[T], index: usize) -> uint16x8x4_t
#[inline(always)]
pub unsafe fn load_i32x1<T>(buf: &[T], index: usize) -> int32x2_t {
let ptr = buf.get_unchecked(index..).as_ptr() as *const u32;
vcreate_s32(*ptr as u64)
vcreate_s32(ptr.read_unaligned() as u64)
}
#[inline(always)]
@@ -217,13 +217,13 @@ pub unsafe fn store_i64x2x4<T>(buf: &mut [T], index: usize, v: int64x2x4_t) {
#[inline(always)]
pub unsafe fn load_i16x1<T>(buf: &[T], index: usize) -> int16x4_t {
let ptr = buf.get_unchecked(index..).as_ptr() as *const u16;
vcreate_s16(*ptr as u64)
vcreate_s16(ptr.read_unaligned() as u64)
}
#[inline(always)]
pub unsafe fn load_i16x2<T>(buf: &[T], index: usize) -> int16x4_t {
let ptr = buf.get_unchecked(index..).as_ptr() as *const u32;
vcreate_s16(*ptr as u64)
vcreate_s16(ptr.read_unaligned() as u64)
}
#[inline(always)]
@@ -252,7 +252,7 @@ pub unsafe fn load_i16x8x2<T>(buf: &[T], index: usize) -> int16x8x2_t {
#[inline(always)]
pub unsafe fn create_u8x16_from_one_u32<T>(buf: &[T], index: usize) -> uint8x16_t {
let ptr = buf.get_unchecked(index..).as_ptr() as *const u32;
vreinterpretq_u8_u32(vsetq_lane_u32::<0>(*ptr, vdupq_n_u32(0u32)))
vreinterpretq_u8_u32(vsetq_lane_u32::<0>(ptr.read_unaligned(), vdupq_n_u32(0u32)))
}
/// Multiply the packed unsigned 16-bit integers in a and b, producing
+2 -3
View File
@@ -1,6 +1,5 @@
use std::arch::x86_64::*;
use std::intrinsics::transmute;
use std::ptr;
use crate::pixels::{U8x3, U8x4};
@@ -17,13 +16,13 @@ pub unsafe fn loadu_si256<T>(buf: &[T], index: usize) -> __m256i {
#[inline(always)]
pub unsafe fn loadl_epi16<T>(buf: &[T], index: usize) -> __m128i {
let mem_addr = buf.get_unchecked(index..).as_ptr() as *const i16;
_mm_set_epi16(0, 0, 0, 0, 0, 0, 0, ptr::read_unaligned(mem_addr))
_mm_set_epi16(0, 0, 0, 0, 0, 0, 0, mem_addr.read_unaligned())
}
#[inline(always)]
pub unsafe fn loadl_epi32<T>(buf: &[T], index: usize) -> __m128i {
let mem_addr = buf.get_unchecked(index..).as_ptr() as *const i32;
_mm_set_epi32(0, 0, 0, ptr::read_unaligned(mem_addr))
_mm_set_epi32(0, 0, 0, mem_addr.read_unaligned())
}
#[inline(always)]