@@ -2438,34 +2438,57 @@ internal func vDSP_vfixru32D(_ src: UnsafePointer<Double>, _ srcStride: Int, _ d
24382438
24392439// MARK: - vDSP Wrapper Functions for WASI
24402440
2441+ @inline ( __always)
2442+ fileprivate func _adjust_ptr< T> ( _ ptr: UnsafePointer < T > , _ stride: Int , _ size: Int ) -> UnsafePointer < T > {
2443+ guard stride < 0 , size > 0 else { return ptr }
2444+ return ptr + ( size - 1 ) * stride
2445+ }
2446+
2447+ @inline ( __always)
2448+ fileprivate func _adjust_mptr< T> ( _ ptr: UnsafeMutablePointer < T > , _ stride: Int , _ size: Int ) -> UnsafeMutablePointer < T > {
2449+ guard stride < 0 , size > 0 else { return ptr }
2450+ return ptr + ( size - 1 ) * stride
2451+ }
2452+
24412453@inline ( __always)
24422454internal func wrap_vDSP_convert< T, U> ( _ size: Int , _ srcptr: UnsafePointer < T > , _ srcStride: Int , _ dstptr: UnsafeMutablePointer < U > , _ dstStride: Int , _ vDSP_func: ( UnsafePointer < T > , Int , UnsafeMutablePointer < U > , Int , Int ) -> Void ) {
2455+ let srcptr = _adjust_ptr ( srcptr, srcStride, size)
2456+ let dstptr = _adjust_mptr ( dstptr, dstStride, size)
24432457 vDSP_func ( srcptr, srcStride, dstptr, dstStride, size)
24442458}
24452459
24462460@inline ( __always)
24472461internal func wrap_vDSP_biopvv< T> ( _ size: Int , _ lsrcptr: UnsafePointer < T > , _ lsrcStride: Int , _ rsrcptr: UnsafePointer < T > , _ rsrcStride: Int , _ dstptr: UnsafeMutablePointer < T > , _ dstStride: Int , _ vDSP_func: vDSP_biopvv_func < T > ) {
2462+ let lsrcptr = _adjust_ptr ( lsrcptr, lsrcStride, size)
2463+ let rsrcptr = _adjust_ptr ( rsrcptr, rsrcStride, size)
2464+ let dstptr = _adjust_mptr ( dstptr, dstStride, size)
24482465 vDSP_func ( rsrcptr, rsrcStride, lsrcptr, lsrcStride, dstptr, dstStride, size)
24492466}
24502467
24512468@inline ( __always)
24522469internal func wrap_vDSP_biopvs< T> ( _ size: Int , _ srcptr: UnsafePointer < T > , _ srcStride: Int , _ scalar: UnsafePointer < T > , _ dstptr: UnsafeMutablePointer < T > , _ dstStride: Int , _ vDSP_func: vDSP_biopvs_func < T > ) {
2470+ let srcptr = _adjust_ptr ( srcptr, srcStride, size)
2471+ let dstptr = _adjust_mptr ( dstptr, dstStride, size)
24532472 vDSP_func ( srcptr, srcStride, scalar, dstptr, dstStride, size)
24542473}
24552474
24562475@inline ( __always)
24572476internal func wrap_vDSP_biopsv< T> ( _ size: Int , _ scalar: UnsafePointer < T > , _ srcptr: UnsafePointer < T > , _ srcStride: Int , _ dstptr: UnsafeMutablePointer < T > , _ dstStride: Int , _ vDSP_func: vDSP_biopsv_func < T > ) {
2477+ let srcptr = _adjust_ptr ( srcptr, srcStride, size)
2478+ let dstptr = _adjust_mptr ( dstptr, dstStride, size)
24582479 vDSP_func ( scalar, srcptr, srcStride, dstptr, dstStride, size)
24592480}
24602481
24612482@inline ( __always)
24622483internal func wrap_vDSP_stats< T> ( _ size: Int , _ srcptr: UnsafePointer < T > , _ stride: Int , _ dstptr: UnsafeMutablePointer < T > , _ vDSP_func: vDSP_stats_func < T > ) {
2484+ let srcptr = _adjust_ptr ( srcptr, stride, size)
24632485 vDSP_func ( srcptr, stride, dstptr, size)
24642486}
24652487
24662488@inline ( __always)
24672489internal func wrap_vDSP_stats_index< T: MfStorable > ( _ size: Int , _ srcptr: UnsafePointer < T > , _ stride: Int , _ dstptr: UnsafeMutablePointer < UInt > , _ vDSP_func: vDSP_stats_index_func < T > ) {
24682490 var tmp = Array ( repeating: T . zero, count: size)
2491+ let srcptr = _adjust_ptr ( srcptr, stride, size)
24692492 vDSP_func ( srcptr, stride, & tmp, dstptr, size)
24702493}
24712494
@@ -2489,16 +2512,23 @@ internal func wrap_vDSP_clip<T: MfStorable>(_ size: Int, _ srcptr: UnsafePointer
24892512
24902513@inline ( __always)
24912514internal func wrap_vDSP_cmprs< T: MfStorable > ( _ size: Int , _ srcptr: UnsafePointer < T > , _ srcStride: Int , _ indptr: UnsafePointer < T > , _ indStride: Int , _ dstptr: UnsafeMutablePointer < T > , _ dstStride: Int , _ vDSP_func: vDSP_vcmprs_func < T > ) {
2515+ let srcptr = _adjust_ptr ( srcptr, srcStride, size)
2516+ let indptr = _adjust_ptr ( indptr, indStride, size)
2517+ let dstptr = _adjust_mptr ( dstptr, dstStride, size)
24922518 vDSP_func ( srcptr, srcStride, indptr, indStride, dstptr, dstStride, size)
24932519}
24942520
24952521@inline ( __always)
24962522internal func wrap_vDSP_gathr< T: MfStorable > ( _ size: Int , _ srcptr: UnsafePointer < T > , _ indptr: UnsafePointer < UInt > , _ indStride: Int , _ dstptr: UnsafeMutablePointer < T > , _ dstStride: Int , _ vDSP_func: vDSP_vgathr_func < T > ) {
2523+ let indptr = _adjust_ptr ( indptr, indStride, size)
2524+ let dstptr = _adjust_mptr ( dstptr, dstStride, size)
24972525 vDSP_func ( srcptr, indptr, indStride, dstptr, dstStride, size)
24982526}
24992527
25002528@inline ( __always)
25012529internal func wrap_vDSP_dotpr< T> ( _ size: Int , _ lsrcptr: UnsafePointer < T > , _ lsrcStride: Int , _ rsrcptr: UnsafePointer < T > , _ rsrcStride: Int , _ dstptr: UnsafeMutablePointer < T > , _ vDSP_func: vDSP_dotpr_func < T > ) {
2530+ let lsrcptr = _adjust_ptr ( lsrcptr, lsrcStride, size)
2531+ let rsrcptr = _adjust_ptr ( rsrcptr, rsrcStride, size)
25022532 vDSP_func ( lsrcptr, lsrcStride, rsrcptr, rsrcStride, dstptr, size)
25032533}
25042534
0 commit comments