mirror of
https://github.com/Cykooz/fast_image_resize.git
synced 2026-10-08 01:11:09 +00:00
Added using of (read|write)_unaligned for unaligned pointers on arm64 architecture.
This commit is contained in:
+8
-1
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
@@ -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
@@ -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)]
|
||||
|
||||
Reference in New Issue
Block a user