// File: /workspace/github_c_makefile_star2_O3/enzo1982[P]smooth/libraries/libwebp/src/dsp/dec_sse2.c
// Function: VFilter8i_SSE2
static void VFilter8i_SSE2(uint8_t* u, uint8_t* v, int stride,
                           int thresh, int ithresh, int hev_thresh) {
  __m128i mask;
  __m128i t1, t2, p1, p0, q0, q1;

  // Load p3, p2, p1, p0
  LOADUV_H_EDGES4(u, v, stride, t2, t1, p1, p0);
  MAX_DIFF1(t2, t1, p1, p0, mask);

  u += 4 * stride;
  v += 4 * stride;

  // Load q0, q1, q2, q3
  LOADUV_H_EDGES4(u, v, stride, q0, q1, t1, t2);
  MAX_DIFF2(t2, t1, q1, q0, mask);

  ComplexMask_SSE2(&p1, &p0, &q0, &q1, thresh, ithresh, &mask);
  DoFilter4_SSE2(&p1, &p0, &q0, &q1, &mask, hev_thresh);

  // Store
  STOREUV(p1, u, v, -2 * stride);
  STOREUV(p0, u, v, -1 * stride);
  STOREUV(q0, u, v, 0 * stride);
  STOREUV(q1, u, v, 1 * stride);
}

// Assembly:
pushq %rbx
movq (%rsi), %xmm0
movq (%rdi), %xmm1
punpcklqdq %xmm0, %xmm1    # xmm1 = xmm1[0],xmm0[0]
movslq %edx, %rax
movq (%rsi,%rax), %xmm0
movq (%rdi,%rax), %xmm6
punpcklqdq %xmm0, %xmm6    # xmm6 = xmm6[0],xmm0[0]
leaq (%rax,%rax), %rdx
movq (%rsi,%rax,2), %xmm2
movq (%rdi,%rax,2), %xmm0
punpcklqdq %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0]
leaq (%rax,%rax,2), %rbx
movq (%rsi,%rbx), %xmm2
movq (%rdi,%rbx), %xmm3
punpcklqdq %xmm2, %xmm3    # xmm3 = xmm3[0],xmm2[0]
movdqa %xmm3, %xmm2
psubusb %xmm0, %xmm2
movdqa %xmm0, %xmm4
psubusb %xmm3, %xmm4
por %xmm2, %xmm4
movdqa %xmm6, %xmm2
psubusb %xmm1, %xmm2
psubusb %xmm6, %xmm1
por %xmm2, %xmm1
movdqa %xmm0, %xmm2
psubusb %xmm6, %xmm2
psubusb %xmm0, %xmm6
por %xmm2, %xmm6
pmaxub %xmm1, %xmm6
pmaxub %xmm4, %xmm6
leaq (%rdi,%rax,4), %r11
leaq (%rsi,%rax,4), %r10
movq (%rsi,%rax,4), %xmm2
movq (%rdi,%rax,4), %xmm1
punpcklqdq %xmm2, %xmm1    # xmm1 = xmm1[0],xmm2[0]
movq (%rax,%r10), %xmm5
movq (%rax,%r11), %xmm2
punpcklqdq %xmm5, %xmm2    # xmm2 = xmm2[0],xmm5[0]
movq (%r10,%rax,2), %xmm5
movq (%r11,%rax,2), %xmm8
punpcklqdq %xmm5, %xmm8    # xmm8 = xmm8[0],xmm5[0]
movq (%r10,%rbx), %xmm5
movq (%r11,%rbx), %xmm7
punpcklqdq %xmm5, %xmm7    # xmm7 = xmm7[0],xmm5[0]
movdqa %xmm1, %xmm9
psubusb %xmm2, %xmm9
movdqa %xmm2, %xmm5
psubusb %xmm1, %xmm5
por %xmm9, %xmm5
movdqa %xmm8, %xmm9
psubusb %xmm7, %xmm9
psubusb %xmm8, %xmm7
por %xmm9, %xmm7
pmaxub %xmm5, %xmm7
pmaxub %xmm6, %xmm7
movdqa %xmm2, %xmm6
psubusb %xmm8, %xmm6
psubusb %xmm2, %xmm8
por %xmm6, %xmm8
pmaxub %xmm7, %xmm8
movd %r8d, %xmm6
punpcklbw %xmm6, %xmm6    # xmm6 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
pshuflw $0x0, %xmm6, %xmm6      # xmm6 = xmm6[0,0,0,0,4,5,6,7]
pshufd $0x0, %xmm6, %xmm7      # xmm7 = xmm6[0,0,0,0]
pminub %xmm8, %xmm7
pcmpeqb %xmm8, %xmm7
movd %ecx, %xmm6
punpcklbw %xmm6, %xmm6    # xmm6 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
pshuflw $0x0, %xmm6, %xmm6      # xmm6 = xmm6[0,0,0,0,4,5,6,7]
pshufd $0x0, %xmm6, %xmm8      # xmm8 = xmm6[0,0,0,0]
movdqa %xmm2, %xmm6
psubusb %xmm0, %xmm6
movdqa %xmm0, %xmm9
psubusb %xmm2, %xmm9
por %xmm6, %xmm9
psrlw $0x1, %xmm9
movdqa %xmm1, %xmm6
psubusb %xmm3, %xmm6
movdqa %xmm3, %xmm10
psubusb %xmm1, %xmm10
por %xmm6, %xmm10
paddusb %xmm10, %xmm10
pand 0x4456f(%rip), %xmm9    # 0x128ea0
paddusb %xmm10, %xmm9
pminub %xmm9, %xmm8
pcmpeqb %xmm9, %xmm8
movd %r9d, %xmm6
punpcklbw %xmm6, %xmm6    # xmm6 = xmm6[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
pshuflw $0x0, %xmm6, %xmm6      # xmm6 = xmm6[0,0,0,0,4,5,6,7]
pshufd $0x0, %xmm6, %xmm6      # xmm6 = xmm6[0,0,0,0]
pmaxub %xmm4, %xmm5
pminub %xmm5, %xmm6
pcmpeqb %xmm5, %xmm6
movdqa 0x45d69(%rip), %xmm4    # 0x12a6d0
pxor %xmm4, %xmm0
pxor %xmm4, %xmm2
movdqa %xmm0, %xmm5
psubsb %xmm2, %xmm5
pxor %xmm4, %xmm1
pxor %xmm4, %xmm3
movdqa %xmm1, %xmm9
psubsb %xmm3, %xmm9
movdqa %xmm6, %xmm10
pandn %xmm5, %xmm10
paddsb %xmm9, %xmm10
paddsb %xmm9, %xmm10
paddsb %xmm9, %xmm10
pand %xmm7, %xmm10
pand %xmm8, %xmm10
movdqa 0x4831c(%rip), %xmm7    # 0x12ccd0
paddsb %xmm10, %xmm7
paddsb 0x4831e(%rip), %xmm10   # 0x12cce0
pxor %xmm8, %xmm8
punpcklbw %xmm7, %xmm5    # xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1],xmm5[2],xmm7[2],xmm5[3],xmm7[3],xmm5[4],xmm7[4],xmm5[5],xmm7[5],xmm5[6],xmm7[6],xmm5[7],xmm7[7]
punpckhbw %xmm7, %xmm7    # xmm7 = xmm7[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
psraw $0xb, %xmm5
psraw $0xb, %xmm7
packsswb %xmm7, %xmm5
punpcklbw %xmm10, %xmm7   # xmm7 = xmm7[0],xmm10[0],xmm7[1],xmm10[1],xmm7[2],xmm10[2],xmm7[3],xmm10[3],xmm7[4],xmm10[4],xmm7[5],xmm10[5],xmm7[6],xmm10[6],xmm7[7],xmm10[7]
punpckhbw %xmm10, %xmm9   # xmm9 = xmm9[8],xmm10[8],xmm9[9],xmm10[9],xmm9[10],xmm10[10],xmm9[11],xmm10[11],xmm9[12],xmm10[12],xmm9[13],xmm10[13],xmm9[14],xmm10[14],xmm9[15],xmm10[15]
psraw $0xb, %xmm7
psraw $0xb, %xmm9
packsswb %xmm9, %xmm7
paddsb %xmm3, %xmm5
psubsb %xmm7, %xmm1
pxor %xmm4, %xmm5
pxor %xmm4, %xmm1
pxor %xmm4, %xmm7
pavgb %xmm8, %xmm7
paddb 0x482f8(%rip), %xmm7    # 0x12cd10
pand %xmm6, %xmm7
psubsb %xmm7, %xmm2
paddsb %xmm0, %xmm7
pxor %xmm4, %xmm7
pxor %xmm4, %xmm2
movq %r11, %rcx
subq %rdx, %rcx
movq %xmm7, (%rcx)
movq %r10, %rcx
subq %rdx, %rcx
pshufd $0xee, %xmm7, %xmm0     # xmm0 = xmm7[2,3,2,3]
movq %xmm0, (%rcx)
movq %r11, %rcx
subq %rax, %rcx
movq %xmm5, (%rcx)
movq %r10, %rcx
subq %rax, %rcx
pshufd $0xee, %xmm5, %xmm0     # xmm0 = xmm5[2,3,2,3]
movq %xmm0, (%rcx)
movq %xmm1, (%rdi,%rax,4)
pshufd $0xee, %xmm1, %xmm0     # xmm0 = xmm1[2,3,2,3]
movq %xmm0, (%rsi,%rax,4)
movq %xmm2, (%rax,%r11)
pshufd $0xee, %xmm2, %xmm0     # xmm0 = xmm2[2,3,2,3]
movq %xmm0, (%rax,%r10)
popq %rbx
retq