// File: /workspace/github_c_makefile_star2_O3/pje[P]pixelsort/lodepng.c
// Function: filterScanline
static void filterScanline(unsigned char* out, const unsigned char* scanline, const unsigned char* prevline,
                           size_t length, size_t bytewidth, unsigned char filterType)
{
  size_t i;
  switch(filterType)
  {
    case 0: /*None*/
      for(i = 0; i < length; i++) out[i] = scanline[i];
      break;
    case 1: /*Sub*/
      if(prevline)
      {
        for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
        for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth];
      }
      else
      {
        for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
        for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth];
      }
      break;
    case 2: /*Up*/
      if(prevline)
      {
        for(i = 0; i < length; i++) out[i] = scanline[i] - prevline[i];
      }
      else
      {
        for(i = 0; i < length; i++) out[i] = scanline[i];
      }
      break;
    case 3: /*Average*/
      if(prevline)
      {
        for(i = 0; i < bytewidth; i++) out[i] = scanline[i] - prevline[i] / 2;
        for(i = bytewidth; i < length; i++) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) / 2);
      }
      else
      {
        for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
        for(i = bytewidth; i < length; i++) out[i] = scanline[i] - scanline[i - bytewidth] / 2;
      }
      break;
    case 4: /*Paeth*/
      if(prevline)
      {
        /*paethPredictor(0, prevline[i], 0) is always prevline[i]*/
        for(i = 0; i < bytewidth; i++) out[i] = (scanline[i] - prevline[i]);
        for(i = bytewidth; i < length; i++)
        {
          out[i] = (scanline[i] - paethPredictor(scanline[i - bytewidth], prevline[i], prevline[i - bytewidth]));
        }
      }
      else
      {
        for(i = 0; i < bytewidth; i++) out[i] = scanline[i];
        /*paethPredictor(scanline[i - bytewidth], 0, 0) is always scanline[i - bytewidth]*/
        for(i = bytewidth; i < length; i++) out[i] = (scanline[i] - scanline[i - bytewidth]);
      }
      break;
    default: return; /*unexisting filter type given*/
  }
}

// Assembly:
cmpl $0x4, %r9d
ja 0xc951
movl %r9d, %eax
leaq 0x1b46(%rip), %r9       # 0xe218
movslq (%r9,%rax,4), %rax
addq %r9, %rax
jmpq *%rax
testq %rcx, %rcx
je 0xc951
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0xc6e6
jmp 0xc951
testq %rdx, %rdx
je 0xc888
testq %r8, %r8
je 0xc71d
xorl %eax, %eax
movb (%rsi,%rax), %r9b
subb (%rdx,%rax), %r9b
movb %r9b, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0xc709
cmpq %r8, %rcx
jbe 0xc951
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
xorl %eax, %eax
movl $0xff, %r9d
movzbl (%rsi,%rax), %r14d
movzbl (%rdx,%r8), %r11d
movzbl (%rdx,%rax), %r10d
movl %r11d, %ebp
subl %r10d, %ebp
movl %ebp, %ebx
negl %ebx
cmovsl %ebp, %ebx
andl %r9d, %ebx
movl %r14d, %r15d
subl %r10d, %r15d
movl %r15d, %ebp
negl %ebp
cmovsl %r15d, %ebp
andl %r9d, %ebp
leal (%r11,%r14), %r12d
subl %r10d, %r12d
subl %r10d, %r12d
movl %r12d, %r15d
negl %r15d
cmovsl %r12d, %r15d
cmpl %ebx, %ebp
jb 0xc782
movl %r14d, %r11d
movb (%rsi,%r8), %r14b
cmpl %ebp, %r15d
cmovael %r11d, %r10d
cmpl %ebx, %r15d
cmovael %r11d, %r10d
subb %r10b, %r14b
movb %r14b, (%rdi,%r8)
incq %r8
incq %rax
cmpq %r8, %rcx
jne 0xc736
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
testq %rdx, %rdx
je 0xc8c5
testq %rcx, %rcx
je 0xc951
xorl %eax, %eax
movb (%rsi,%rax), %r8b
subb (%rdx,%rax), %r8b
movb %r8b, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0xc7c3
jmp 0xc951
testq %rdx, %rdx
je 0xc8e0
testq %r8, %r8
je 0xc806
xorl %eax, %eax
movb (%rsi,%rax), %r9b
movb (%rdx,%rax), %r10b
shrb %r10b
subb %r10b, %r9b
movb %r9b, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0xc7ec
subq %r8, %rcx
jbe 0xc951
addq %r8, %rdi
addq %r8, %rdx
addq %rsi, %r8
xorl %eax, %eax
movb (%r8,%rax), %r9b
movzbl (%rsi,%rax), %r10d
movzbl (%rdx,%rax), %r11d
addl %r10d, %r11d
shrl %r11d
subb %r11b, %r9b
movb %r9b, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0xc81a
jmp 0xc951
testq %rdx, %rdx
je 0xc91d
testq %r8, %r8
je 0xc860
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0xc852
subq %r8, %rcx
jbe 0xc951
addq %r8, %rdi
addq %rsi, %r8
xorl %eax, %eax
movb (%r8,%rax), %dl
subb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0xc871
jmp 0xc951
testq %r8, %r8
je 0xc89d
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0xc88f
subq %r8, %rcx
jbe 0xc951
addq %r8, %rdi
addq %rsi, %r8
xorl %eax, %eax
movb (%r8,%rax), %dl
subb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0xc8ae
jmp 0xc951
testq %rcx, %rcx
je 0xc951
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0xc8d0
jmp 0xc951
testq %r8, %r8
je 0xc8f5
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0xc8e7
subq %r8, %rcx
jbe 0xc951
addq %r8, %rdi
addq %rsi, %r8
xorl %eax, %eax
movb (%r8,%rax), %dl
movb (%rsi,%rax), %r9b
shrb %r9b
subb %r9b, %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0xc902
jmp 0xc951
testq %r8, %r8
je 0xc932
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0xc924
subq %r8, %rcx
jbe 0xc951
addq %r8, %rdi
addq %rsi, %r8
xorl %eax, %eax
movb (%r8,%rax), %dl
subb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0xc93f
retq
nop