#[cfg(target_arch = "x86")]
use std::arch::x86::*;
#[cfg(target_arch = "x86_64")]
use std::arch::x86_64::*;
#[target_feature(enable = "sse4.1")]
pub(crate) fn grad_pack_interior(cur: &[i32], prev: &[i32], out: &mut [u32], gw: usize) {
assert!(cur.len() >= gw && prev.len() >= gw && out.len() >= gw);
let zero = _mm_setzero_si128();
let mut gx = 1usize;
while gx + 4 <= gw {
let left = unsafe { _mm_loadu_si128(cur.as_ptr().add(gx - 1) as *const __m128i) };
let top = unsafe { _mm_loadu_si128(prev.as_ptr().add(gx) as *const __m128i) };
let topleft = unsafe { _mm_loadu_si128(prev.as_ptr().add(gx - 1) as *const __m128i) };
let px = unsafe { _mm_loadu_si128(cur.as_ptr().add(gx) as *const __m128i) };
let ac = _mm_sub_epi32(left, topleft);
let ab = _mm_sub_epi32(left, top);
let bc = _mm_sub_epi32(top, topleft);
let grad = _mm_add_epi32(ac, top);
let d = _mm_xor_si128(ab, bc);
let clamp = _mm_blendv_epi8(left, top, _mm_cmpgt_epi32(zero, d)); let s = _mm_xor_si128(ac, bc);
let pred = _mm_blendv_epi8(clamp, grad, _mm_cmpgt_epi32(zero, s));
let res = _mm_sub_epi32(px, pred);
let packed = _mm_xor_si128(_mm_slli_epi32::<1>(res), _mm_srai_epi32::<31>(res));
unsafe { _mm_storeu_si128(out.as_mut_ptr().add(gx) as *mut __m128i, packed) };
gx += 4;
}
while gx < gw {
let w = cur[gx - 1];
let n = prev[gx];
let nw = prev[gx - 1];
let ac = w.wrapping_sub(nw);
let bc = n.wrapping_sub(nw);
let grad = ac.wrapping_add(n);
let clamp = if (w.wrapping_sub(n) ^ bc) < 0 { n } else { w };
let pred = if (ac ^ bc) < 0 { grad } else { clamp };
let r = cur[gx].wrapping_sub(pred) as i64;
out[gx] = ((r << 1) ^ (r >> 63)) as u32;
gx += 1;
}
}