@@ -233,32 +233,37 @@ public void Invoke(int y, Span<Vector4> span)
233233 // Clear the target buffer for each row run
234234 Span < ComplexVector4 > targetBuffer = this . targetValues . GetRowSpan ( y ) ;
235235 targetBuffer . Clear ( ) ;
236- ref ComplexVector4 targetBase = ref MemoryMarshal . GetReference ( targetBuffer ) ;
237236
238237 // Execute the bulk pixel format conversion for the current row
239238 Span < TPixel > sourceRow = this . sourcePixels . GetRowSpan ( y ) . Slice ( boundsX , boundsWidth ) ;
240239 PixelOperations < TPixel > . Instance . ToVector4 ( this . configuration , sourceRow , span ) ;
241240
242241 ref Vector4 sourceBase = ref MemoryMarshal . GetReference ( span ) ;
242+ ref ComplexVector4 targetStart = ref MemoryMarshal . GetReference ( targetBuffer ) ;
243+ ref ComplexVector4 targetEnd = ref Unsafe . Add ( ref targetStart , span . Length ) ;
243244 ref Complex64 kernelBase = ref this . kernel [ 0 ] ;
245+ ref Complex64 kernelEnd = ref Unsafe . Add ( ref kernelBase , kernelSize ) ;
244246 ref int sampleColumnBase = ref MemoryMarshal . GetReference ( this . map . GetColumnOffsetSpan ( ) ) ;
245247
246- for ( int x = 0 ; x < span . Length ; x ++ )
248+ while ( Unsafe . IsAddressLessThan ( ref targetStart , ref targetEnd ) )
247249 {
248- ref ComplexVector4 target = ref Unsafe . Add ( ref targetBase , x ) ;
250+ ref Complex64 kernelStart = ref kernelBase ;
251+ ref int sampleColumnStart = ref sampleColumnBase ;
249252
250- for ( int kX = 0 ; kX < kernelSize ; kX ++ )
253+ while ( Unsafe . IsAddressLessThan ( ref kernelStart , ref kernelEnd ) )
251254 {
252- int sampleX = Unsafe . Add ( ref sampleColumnBase , kX ) - boundsX ;
253- Vector4 sample = Unsafe . Add ( ref sourceBase , sampleX ) ;
254- Complex64 factor = Unsafe . Add ( ref kernelBase , kX ) ;
255+ Vector4 sample = Unsafe . Add ( ref sourceBase , sampleColumnStart - boundsX ) ;
255256
256- target . Sum ( factor * sample ) ;
257+ targetStart . Sum ( kernelStart * sample ) ;
258+
259+ kernelStart = ref Unsafe . Add ( ref kernelStart , 1 ) ;
260+ sampleColumnStart = ref Unsafe . Add ( ref sampleColumnStart , 1 ) ;
257261 }
258262
259263 // Shift the base column sampling reference by one row at the end of each outer
260264 // iteration so that the inner tight loop indexing can skip the multiplication
261265 sampleColumnBase = ref Unsafe . Add ( ref sampleColumnBase , kernelSize ) ;
266+ targetStart = ref Unsafe . Add ( ref targetStart , 1 ) ;
262267 }
263268 }
264269 }
0 commit comments