// File: /workspace/github_cpp_makefile_star2_O1/phillip-h[P]fractal-gen/lodepng.cpp
// Function: filterScanline(unsigned char*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned char)
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*/
      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] >> 1);
        for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - ((scanline[i - bytewidth] + prevline[i]) >> 1);
      }
      else
      {
        for(i = 0; i != bytewidth; ++i) out[i] = scanline[i];
        for(i = bytewidth; i < length; ++i) out[i] = scanline[i] - (scanline[i - bytewidth] >> 1);
      }
      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 0x10571
movl %r9d, %eax
leaq 0x155c(%rip), %r9       # 0x11894
movslq (%r9,%rax,4), %rax
addq %r9, %rax
jmpq *%rax
testq %rcx, %rcx
je 0x10571
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0x1034c
jmp 0x10571
testq %rdx, %rdx
je 0x104e9
testq %r8, %r8
je 0x10383
xorl %eax, %eax
movb (%rsi,%rax), %r9b
subb (%rdx,%rax), %r9b
movb %r9b, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0x1036f
cmpq %r8, %rcx
jbe 0x10571
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 0x103e8
movl %r14d, %r11d
movb (%rsi,%r8), %r14b
movzwl %r15w, %r15d
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 0x1039c
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
testq %rdx, %rdx
je 0x1051f
testq %rcx, %rcx
je 0x10571
xorl %eax, %eax
movb (%rsi,%rax), %r8b
subb (%rdx,%rax), %r8b
movb %r8b, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0x1042d
jmp 0x10571
testq %rdx, %rdx
je 0x10536
testq %r8, %r8
je 0x10470
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 0x10456
subq %r8, %rcx
jbe 0x10571
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 0x10484
jmp 0x10571
testq %r8, %r8
je 0x104c1
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0x104b3
subq %r8, %rcx
jbe 0x10571
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 0x104d2
jmp 0x10571
testq %r8, %r8
je 0x104fe
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0x104f0
subq %r8, %rcx
jbe 0x10571
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 0x1050b
jmp 0x10571
testq %rcx, %rcx
je 0x10571
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0x10526
jmp 0x10571
testq %r8, %r8
je 0x1054b
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0x1053d
subq %r8, %rcx
jbe 0x10571
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 0x10558
retq