// File: /workspace/github_cpp_makefile_star2_O3/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 0x10092
leaq 0x1a7a(%rip), %r10      # 0x118d4
movl %r9d, %eax
movslq (%r10,%rax,4), %rax
addq %r10, %rax
jmpq *%rax
testq %rcx, %rcx
je 0x10092
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0xfe71
jmp 0x10092
testq %rdx, %rdx
je 0x1000a
testq %r8, %r8
je 0xfea8
xorl %eax, %eax
movb (%rsi,%rax), %r9b
subb (%rdx,%rax), %r9b
movb %r9b, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0xfe94
cmpq %r8, %rcx
jbe 0x10092
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movl $0xff, %r9d
xorl %eax, %eax
movzbl (%rdx,%r8), %r11d
movzbl (%rdx,%rax), %r10d
movzbl (%rsi,%rax), %r14d
movl %r11d, %ebp
subl %r10d, %ebp
movl %r14d, %r15d
leal (%r11,%r14), %r12d
movl %ebp, %ebx
negl %ebx
cmovsl %ebp, %ebx
subl %r10d, %r15d
andl %r9d, %ebx
movl %r15d, %ebp
negl %ebp
cmovsl %r15d, %ebp
subl %r10d, %r12d
subl %r10d, %r12d
andl %r9d, %ebp
movl %r12d, %r15d
negl %r15d
cmovsl %r12d, %r15d
cmpl %ebx, %ebp
jb 0xff0d
movl %r14d, %r11d
movb (%rsi,%r8), %r14b
cmpl %ebp, %r15d
cmovael %r11d, %r10d
cmpl %ebx, %r15d
cmovael %r11d, %r10d
incq %rax
subb %r10b, %r14b
movb %r14b, (%rdi,%r8)
incq %r8
cmpq %r8, %rcx
jne 0xfec1
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
testq %rdx, %rdx
je 0x10040
testq %rcx, %rcx
je 0x10092
xorl %eax, %eax
movb (%rsi,%rax), %r8b
subb (%rdx,%rax), %r8b
movb %r8b, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0xff4e
jmp 0x10092
testq %rdx, %rdx
je 0x10057
testq %r8, %r8
je 0xff91
xorl %eax, %eax
movb (%rdx,%rax), %r10b
movb (%rsi,%rax), %r9b
shrb %r10b
subb %r10b, %r9b
movb %r9b, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0xff77
subq %r8, %rcx
jbe 0x10092
addq %r8, %rdi
addq %r8, %rdx
addq %rsi, %r8
xorl %eax, %eax
movzbl (%rsi,%rax), %r10d
movzbl (%rdx,%rax), %r11d
movb (%r8,%rax), %r9b
addl %r10d, %r11d
shrl %r11d
subb %r11b, %r9b
movb %r9b, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0xffa5
jmp 0x10092
testq %r8, %r8
je 0xffe2
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0xffd4
subq %r8, %rcx
jbe 0x10092
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 0xfff3
jmp 0x10092
testq %r8, %r8
je 0x1001f
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0x10011
subq %r8, %rcx
jbe 0x10092
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 0x1002c
jmp 0x10092
testq %rcx, %rcx
je 0x10092
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0x10047
jmp 0x10092
testq %r8, %r8
je 0x1006c
xorl %eax, %eax
movb (%rsi,%rax), %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %r8
jne 0x1005e
subq %r8, %rcx
jbe 0x10092
addq %r8, %rdi
addq %rsi, %r8
xorl %eax, %eax
movb (%rsi,%rax), %r9b
movb (%r8,%rax), %dl
shrb %r9b
subb %r9b, %dl
movb %dl, (%rdi,%rax)
incq %rax
cmpq %rax, %rcx
jne 0x10079
retq
nop