// File: lvandeve[P]lodepng/lodepng_util.cpp
// Function: lodepng::iccForwardTRC(lodepng::LodePNGICCCurve const*, float)
static float iccForwardTRC(const LodePNGICCCurve* curve, float x) {
  if(curve->type == 0) {
    return x;
  }
  if(curve->type == 1) { /* Lookup table */
    float v0, v1, fraction;
    size_t index;
    if(!curve->lut) return 0; /* error */
    if(x < 0) return x;
    index = (size_t)(x * (curve->lut_size - 1));
    if(index >= curve->lut_size) return x;

    /* LERP */
    v0 = curve->lut[index];
    v1 = (index + 1 < curve->lut_size) ? curve->lut[index + 1] : 1.0f;
    fraction = (x * (curve->lut_size - 1)) - index;
    return v0 * (1 - fraction) + v1 * fraction;
  }
  if(curve->type == 2) {
    /* Gamma expansion */
    return (x > 0) ? lodepng_powf(x, curve->gamma) : x;
  }
  /* TODO: all the ones below are untested */
  if(curve->type == 3) {
    if(x < 0) return x;
    return x >= (-curve->b / curve->a) ? (lodepng_powf(curve->a * x + curve->b, curve->gamma) + curve->c) : 0;
  }
  if(curve->type == 4) {
    if(x < 0) return x;
    return x >= (-curve->b / curve->a) ? (lodepng_powf(curve->a * x + curve->b, curve->gamma) + curve->c) : curve->c;
  }
  if(curve->type == 5) {
    return x >= curve->d ? (lodepng_powf(curve->a * x + curve->b, curve->gamma)) : (curve->c * x);
  }
  if(curve->type == 6) {
    return x >= curve->d ? (lodepng_powf(curve->a * x + curve->b, curve->gamma) + curve->c) : (curve->c * x + curve->f);
  }
  return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x10(%rbp)
movss %xmm0, -0x14(%rbp)
movq -0x10(%rbp), %rax
cmpl $0x0, (%rax)
jne 0x20cb9
movss -0x14(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
movq -0x10(%rbp), %rax
cmpl $0x1, (%rax)
jne 0x20ed3
movq -0x10(%rbp), %rax
cmpq $0x0, 0x8(%rax)
jne 0x20cde
xorps %xmm0, %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
xorps %xmm0, %xmm0
ucomiss -0x14(%rbp), %xmm0
jbe 0x20cf6
movss -0x14(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
movss -0x14(%rbp), %xmm0
movss %xmm0, -0x34(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
decq %rax
movq %rax, %rdx
shrq %rdx
movl %eax, %ecx
andl $0x1, %ecx
orq %rdx, %rcx
cvtsi2ss %rcx, %xmm0
addss %xmm0, %xmm0
cvtsi2ss %rax, %xmm1
movss %xmm1, -0x30(%rbp)
testq %rax, %rax
movss %xmm0, -0x2c(%rbp)
js 0x20d40
movss -0x30(%rbp), %xmm0
movss %xmm0, -0x2c(%rbp)
movss -0x34(%rbp), %xmm0
movss -0x2c(%rbp), %xmm1
mulss %xmm1, %xmm0
movaps %xmm0, %xmm1
cvttss2si %xmm1, %rax
movq %rax, %rdx
sarq $0x3f, %rdx
movss 0x91cc7(%rip), %xmm1    # 0xb2a2c
subss %xmm1, %xmm0
cvttss2si %xmm0, %rcx
andq %rdx, %rcx
orq %rcx, %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq -0x10(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jb 0x20d95
movss -0x14(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x28(%rbp), %rcx
movss (%rax,%rcx,4), %xmm0
movss %xmm0, -0x18(%rbp)
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq -0x10(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jae 0x20dd6
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x28(%rbp), %rcx
movss 0x4(%rax,%rcx,4), %xmm0
movss %xmm0, -0x38(%rbp)
jmp 0x20de5
movss 0x91c16(%rip), %xmm0    # 0xb29f4
movss %xmm0, -0x38(%rbp)
jmp 0x20de5
movss -0x38(%rbp), %xmm0
movss %xmm0, -0x1c(%rbp)
movss -0x14(%rbp), %xmm0
movss %xmm0, -0x44(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
decq %rax
movq %rax, %rdx
shrq %rdx
movl %eax, %ecx
andl $0x1, %ecx
orq %rdx, %rcx
cvtsi2ss %rcx, %xmm0
addss %xmm0, %xmm0
cvtsi2ss %rax, %xmm1
movss %xmm1, -0x40(%rbp)
testq %rax, %rax
movss %xmm0, -0x3c(%rbp)
js 0x20e39
movss -0x40(%rbp), %xmm0
movss %xmm0, -0x3c(%rbp)
movss -0x3c(%rbp), %xmm0
movss %xmm0, -0x50(%rbp)
movq -0x28(%rbp), %rax
movq %rax, %rdx
shrq %rdx
movl %eax, %ecx
andl $0x1, %ecx
orq %rdx, %rcx
cvtsi2ss %rcx, %xmm0
addss %xmm0, %xmm0
cvtsi2ss %rax, %xmm1
movss %xmm1, -0x4c(%rbp)
testq %rax, %rax
movss %xmm0, -0x48(%rbp)
js 0x20e7c
movss -0x4c(%rbp), %xmm0
movss %xmm0, -0x48(%rbp)
movss -0x50(%rbp), %xmm2
movss -0x44(%rbp), %xmm0
movss -0x48(%rbp), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x20(%rbp)
movss -0x18(%rbp), %xmm0
movss 0x91b42(%rip), %xmm2    # 0xb29f4
subss -0x20(%rbp), %xmm2
movss -0x1c(%rbp), %xmm1
mulss -0x20(%rbp), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
movq -0x10(%rbp), %rax
cmpl $0x2, (%rax)
jne 0x20f1c
movss -0x14(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jbe 0x20f03
movss -0x14(%rbp), %xmm0
movq -0x10(%rbp), %rax
movss 0x18(%rax), %xmm1
callq 0x21170
movss %xmm0, -0x54(%rbp)
jmp 0x20f0d
movss -0x14(%rbp), %xmm0
movss %xmm0, -0x54(%rbp)
movss -0x54(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
movq -0x10(%rbp), %rax
cmpl $0x3, (%rax)
jne 0x20fc0
xorps %xmm0, %xmm0
ucomiss -0x14(%rbp), %xmm0
jbe 0x20f41
movss -0x14(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
movss -0x14(%rbp), %xmm0
movq -0x10(%rbp), %rax
movss 0x20(%rax), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
movq -0x10(%rbp), %rax
divss 0x1c(%rax), %xmm1
ucomiss %xmm1, %xmm0
jb 0x20fa7
movq -0x10(%rbp), %rax
movss 0x1c(%rax), %xmm0
movss -0x14(%rbp), %xmm2
movq -0x10(%rbp), %rax
movss 0x20(%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x10(%rbp), %rax
movss 0x18(%rax), %xmm1
callq 0x21170
movq -0x10(%rbp), %rax
addss 0x24(%rax), %xmm0
movss %xmm0, -0x58(%rbp)
jmp 0x20fb1
xorps %xmm0, %xmm0
movss %xmm0, -0x58(%rbp)
jmp 0x20fb1
movss -0x58(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
movq -0x10(%rbp), %rax
cmpl $0x4, (%rax)
jne 0x21068
xorps %xmm0, %xmm0
ucomiss -0x14(%rbp), %xmm0
jbe 0x20fe5
movss -0x14(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
movss -0x14(%rbp), %xmm0
movq -0x10(%rbp), %rax
movss 0x20(%rax), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
movq -0x10(%rbp), %rax
divss 0x1c(%rax), %xmm1
ucomiss %xmm1, %xmm0
jb 0x2104b
movq -0x10(%rbp), %rax
movss 0x1c(%rax), %xmm0
movss -0x14(%rbp), %xmm2
movq -0x10(%rbp), %rax
movss 0x20(%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x10(%rbp), %rax
movss 0x18(%rax), %xmm1
callq 0x21170
movq -0x10(%rbp), %rax
addss 0x24(%rax), %xmm0
movss %xmm0, -0x5c(%rbp)
jmp 0x21059
movq -0x10(%rbp), %rax
movss 0x24(%rax), %xmm0
movss %xmm0, -0x5c(%rbp)
movss -0x5c(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
movq -0x10(%rbp), %rax
cmpl $0x5, (%rax)
jne 0x210d6
movss -0x14(%rbp), %xmm0
movq -0x10(%rbp), %rax
ucomiss 0x28(%rax), %xmm0
jb 0x210b4
movq -0x10(%rbp), %rax
movss 0x1c(%rax), %xmm0
movss -0x14(%rbp), %xmm2
movq -0x10(%rbp), %rax
movss 0x20(%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x10(%rbp), %rax
movss 0x18(%rax), %xmm1
callq 0x21170
movss %xmm0, -0x60(%rbp)
jmp 0x210c7
movq -0x10(%rbp), %rax
movss 0x24(%rax), %xmm0
mulss -0x14(%rbp), %xmm0
movss %xmm0, -0x60(%rbp)
movss -0x60(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
movq -0x10(%rbp), %rax
cmpl $0x6, (%rax)
jne 0x2115b
movss -0x14(%rbp), %xmm0
movq -0x10(%rbp), %rax
ucomiss 0x28(%rax), %xmm0
jb 0x2112b
movq -0x10(%rbp), %rax
movss 0x1c(%rax), %xmm0
movss -0x14(%rbp), %xmm2
movq -0x10(%rbp), %rax
movss 0x20(%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x10(%rbp), %rax
movss 0x18(%rax), %xmm1
callq 0x21170
movq -0x10(%rbp), %rax
addss 0x24(%rax), %xmm0
movss %xmm0, -0x64(%rbp)
jmp 0x2114f
movq -0x10(%rbp), %rax
movss 0x24(%rax), %xmm0
movss -0x14(%rbp), %xmm2
movq -0x10(%rbp), %rax
movss 0x30(%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x64(%rbp)
movss -0x64(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x21163
xorps %xmm0, %xmm0
movss %xmm0, -0x4(%rbp)
movss -0x4(%rbp), %xmm0
addq $0x70, %rsp
popq %rbp
retq
nop