// File: lvandeve[P]lodepng/lodepng_util.cpp
// Function: lodepng::modelsEqual(LodePNGState const*, LodePNGState const*)
static unsigned modelsEqual(const LodePNGState* state_a,
                            const LodePNGState* state_b) {
  size_t i;
  const LodePNGInfo* a = state_a ? &state_a->info_png : 0;
  const LodePNGInfo* b = state_b ? &state_b->info_png : 0;
  unsigned a_srgb = isSRGB(a);
  unsigned b_srgb = isSRGB(b);
  if(a_srgb != b_srgb) return 0;
  if(a_srgb && b_srgb) return 1;
  /* now a and b are both non-sRGB, and both guaranteed to be non-NULL: only
  non-NULL can represent a different color model than sRGB. */
  if(a->iccp_defined != b->iccp_defined) return 0;
  if(a->iccp_defined) {
    if(a->iccp_profile_size != b->iccp_profile_size) return 0;
    /* TODO: return equal in more cases, such as when two ICC profiles that are
    not byte-for-byte equal, but represent the same color model. */
    for(i = 0; i < a->iccp_profile_size; i++) {
      if(a->iccp_profile[i] != b->iccp_profile[i]) return 0;
    }
    /* since the ICC model overrides gamma and chrm, those can be ignored. */
    /* TODO: this doesn't cover the case where the ICC profile is invalid */
    return 1;
  }

  if(a->srgb_defined != b->srgb_defined) return 0;
  if(a->srgb_defined) {
    /* since the sRGB model overrides gamma and chrm, those can be ignored.
    srgb_intent not checked since the conversion ignores it */
    return 1;
  }

  if(a->gama_defined != b->gama_defined) return 0;
  if(a->gama_defined) {
    if(a->gama_gamma != b->gama_gamma) return 0;
  }

  if(a->chrm_defined != b->chrm_defined) return 0;
  if(a->chrm_defined) {
    if(a->chrm_white_x != b->chrm_white_x) return 0;
    if(a->chrm_white_y != b->chrm_white_y) return 0;
    if(a->chrm_red_x != b->chrm_red_x) return 0;
    if(a->chrm_red_y != b->chrm_red_y) return 0;
    if(a->chrm_green_x != b->chrm_green_x) return 0;
    if(a->chrm_green_y != b->chrm_green_y) return 0;
    if(a->chrm_blue_x != b->chrm_blue_x) return 0;
    if(a->chrm_blue_y != b->chrm_blue_y) return 0;
  }

  return 1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
cmpq $0x0, -0x10(%rbp)
je 0x205c7
movq -0x10(%rbp), %rax
addq $0xd0, %rax
movq %rax, -0x40(%rbp)
jmp 0x205cf
xorl %eax, %eax
movq %rax, -0x40(%rbp)
jmp 0x205cf
movq -0x40(%rbp), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x18(%rbp)
je 0x205ee
movq -0x18(%rbp), %rax
addq $0xd0, %rax
movq %rax, -0x48(%rbp)
jmp 0x205f6
xorl %eax, %eax
movq %rax, -0x48(%rbp)
jmp 0x205f6
movq -0x48(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rdi
callq 0x23030
movl %eax, -0x34(%rbp)
movq -0x30(%rbp), %rdi
callq 0x23030
movl %eax, -0x38(%rbp)
movl -0x34(%rbp), %eax
cmpl -0x38(%rbp), %eax
je 0x2062a
movl $0x0, -0x4(%rbp)
jmp 0x208d2
cmpl $0x0, -0x34(%rbp)
je 0x20642
cmpl $0x0, -0x38(%rbp)
je 0x20642
movl $0x1, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
movl 0xfc(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xfc(%rcx), %eax
je 0x20664
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
cmpl $0x0, 0xfc(%rax)
je 0x20704
movq -0x28(%rbp), %rax
movl 0x110(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0x110(%rcx), %eax
je 0x20697
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq $0x0, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x28(%rbp), %rcx
movl 0x110(%rcx), %ecx
cmpq %rcx, %rax
jae 0x206f8
movq -0x28(%rbp), %rax
movq 0x108(%rax), %rax
movq -0x20(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movq -0x30(%rbp), %rcx
movq 0x108(%rcx), %rcx
movq -0x20(%rbp), %rdx
movzbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
je 0x206e8
movl $0x0, -0x4(%rbp)
jmp 0x208d2
jmp 0x206ea
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x20(%rbp)
jmp 0x2069f
movl $0x1, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
movl 0xf4(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xf4(%rcx), %eax
je 0x20726
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
cmpl $0x0, 0xf4(%rax)
je 0x2073f
movl $0x1, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
movl 0xc8(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xc8(%rcx), %eax
je 0x20761
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
cmpl $0x0, 0xc8(%rax)
je 0x20792
movq -0x28(%rbp), %rax
movl 0xcc(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xcc(%rcx), %eax
je 0x20790
movl $0x0, -0x4(%rbp)
jmp 0x208d2
jmp 0x20792
movq -0x28(%rbp), %rax
movl 0xd0(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xd0(%rcx), %eax
je 0x207b4
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
cmpl $0x0, 0xd0(%rax)
je 0x208cb
movq -0x28(%rbp), %rax
movl 0xd4(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xd4(%rcx), %eax
je 0x207e7
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
movl 0xd8(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xd8(%rcx), %eax
je 0x20809
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
movl 0xdc(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xdc(%rcx), %eax
je 0x2082b
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
movl 0xe0(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xe0(%rcx), %eax
je 0x2084d
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
movl 0xe4(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xe4(%rcx), %eax
je 0x2086c
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
movl 0xe8(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xe8(%rcx), %eax
je 0x2088b
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
movl 0xec(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xec(%rcx), %eax
je 0x208aa
movl $0x0, -0x4(%rbp)
jmp 0x208d2
movq -0x28(%rbp), %rax
movl 0xf0(%rax), %eax
movq -0x30(%rbp), %rcx
cmpl 0xf0(%rcx), %eax
je 0x208c9
movl $0x0, -0x4(%rbp)
jmp 0x208d2
jmp 0x208cb
movl $0x1, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x50, %rsp
popq %rbp
retq
nopl (%rax,%rax)