// File: lvandeve[P]lodepng/lodepng_util.cpp
// Function: lodepng::lodepng_powf(float, float)
static float lodepng_powf(float x, float y) {
  float j, t0, t1, l;
  int i = 0;
  /* handle all the special floating point rules */
  if(x == 1 || y == 0) return 1; /*these cases return 1 even if the other value is NaN, as specified*/
  if(y == 1) return x; /* preserves negative-0 */
  if(!(x > 0 && x <= lodepng_flt_max && y >= -lodepng_flt_max && y <= lodepng_flt_max)) { /*all special cases*/
    if(x != x || y != y) return x + y; /* nan */
    if(x > 0) {
      if(x > lodepng_flt_max) return y <= 0 ? (y == 0 ? 1 : 0) : x; /* x = +infinity */
    } else {
      if(!(y < -1073741824.0f || y > 1073741824.0f)) { /* large y always even integer, but cast would overflow */
        i = (int)y; /* not using floor: not using math lib */
        if(i != y) {
          return (x < -lodepng_flt_max) ? (y < 0 ? 0 : lodepng_flt_inf) :
              (x == 0 ? (y < 0 ? lodepng_flt_inf : 0) : lodepng_flt_nan);
        }
        if(i & 1) return x == 0 ? (y < 0 ? (1 / x) : x) : -lodepng_powf(-x, y);
      }
      if(x == 0) return y <= 0 ? lodepng_flt_inf : 0;
      if(x < -lodepng_flt_max) { /* x == -infinity */
        return y <= 0 ? (y == 0 ? 1 : 0) : ((i & 1) ?
            -lodepng_flt_inf : lodepng_flt_inf);
      }
      x = -x;
      if(x == 1) return 1; /* under the C++ rules, pow(-1, +/- infinity) also returns 1 */
    }
    if(y < -lodepng_flt_max || y > lodepng_flt_max) return ((x < 1) != (y > 0)) ? (y < 0 ? -y : y) : 0;
  }

  l = x;
  j = 0;
  while(l < (1.0f / 65536)) { j -= 16; l *= 65536.0f; }
  while(l > 65536) { j += 16; l *= (1.0f / 65536); }
  while(l < 1) { j--; l *= 2.0f; }
  while(l > 2) { j++; l *= 0.5f; }
  /* polynomial to approximate log2(x) with x in range 1..2 */
  t0 = -0.393118410458557f + l * (-0.0883639468229365f + l * (0.466142650227994f + l * 0.0153397331014276f));
  t1 = 0.0907447971403586f + l * (0.388892024755479f + l * 0.137228280305862f);
  l = t0 / t1 + j;

  l *= y; /* using the formula exp2(y * log2(x)) */

  /* prevent int shift overflow, 0 or inf result are ok to return since exp will be taken, 127 is max float exponent */
  if(l <= -128.0f || l >= 128.0f) return ((x > 1) == (y > 0)) ? lodepng_flt_inf : 0;
  i = (int)l;
  l -= i;
  /* polynomial to approximate exp2(x) with x in range -1..1 */
  t0 = 1.0f + l * (0.41777833582744256f + l * (0.0728482595347711f + l * 0.005635023478609625f));
  t1 = 1.0f + l * (-0.27537016151408167f + l * 0.023501446055084033f);
  while(i <= -31) { t0 *= (1.0f / 2147483648.0f); i += 31; }
  while(i >= 31) { t0 *= 2147483648.0f; i -= 31; }
  return (i < 0) ? (t0 / (t1 * (1 << -i))) : ((t0 * (1 << i)) / t1);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movss %xmm0, -0x8(%rbp)
movss %xmm1, -0xc(%rbp)
movl $0x0, -0x20(%rbp)
movss -0x8(%rbp), %xmm0
movss 0x9185e(%rip), %xmm1    # 0xb29f4
ucomiss %xmm1, %xmm0
jne 0x2119f
jp 0x2119f
jmp 0x211ae
movss -0xc(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0x211c0
jp 0x211c0
movss 0x9183e(%rip), %xmm0    # 0xb29f4
movss %xmm0, -0x4(%rbp)
jmp 0x2192f
movss -0xc(%rbp), %xmm0
movss 0x91827(%rip), %xmm1    # 0xb29f4
ucomiss %xmm1, %xmm0
jne 0x211e3
jp 0x211e3
movss -0x8(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x2192f
movss -0x8(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jbe 0x21222
movss 0x91838(%rip), %xmm0    # 0xb2a30
ucomiss -0x8(%rbp), %xmm0
jb 0x21222
movss -0xc(%rbp), %xmm0
movss 0x91829(%rip), %xmm1    # 0xb2a34
ucomiss %xmm1, %xmm0
jb 0x21222
movss 0x91818(%rip), %xmm0    # 0xb2a30
ucomiss -0xc(%rbp), %xmm0
jae 0x215dd
movss -0x8(%rbp), %xmm0
ucomiss -0x8(%rbp), %xmm0
jne 0x2123e
jp 0x2123e
movss -0xc(%rbp), %xmm0
ucomiss -0xc(%rbp), %xmm0
jne 0x2123e
jp 0x2123e
jmp 0x21252
movss -0x8(%rbp), %xmm0
addss -0xc(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x2192f
movss -0x8(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jbe 0x212c2
movss -0x8(%rbp), %xmm0
movss 0x917c4(%rip), %xmm1    # 0xb2a30
ucomiss %xmm1, %xmm0
jbe 0x212bd
xorps %xmm0, %xmm0
ucomiss -0xc(%rbp), %xmm0
jb 0x212a4
movss -0xc(%rbp), %xmm0
xorps %xmm1, %xmm1
xorl %eax, %eax
movl $0x1, %ecx
ucomiss %xmm1, %xmm0
setnp %sil
sete %dl
testb %sil, %dl
cmovnel %ecx, %eax
cvtsi2ss %eax, %xmm0
movss %xmm0, -0x24(%rbp)
jmp 0x212ae
movss -0x8(%rbp), %xmm0
movss %xmm0, -0x24(%rbp)
movss -0x24(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x2192f
jmp 0x2153e
movss 0x9176e(%rip), %xmm0    # 0xb2a38
ucomiss -0xc(%rbp), %xmm0
ja 0x2142d
movss -0xc(%rbp), %xmm0
movss 0x9175b(%rip), %xmm1    # 0xb2a3c
ucomiss %xmm1, %xmm0
ja 0x2142d
cvttss2si -0xc(%rbp), %eax
movl %eax, -0x20(%rbp)
cvtsi2ssl -0x20(%rbp), %xmm0
ucomiss -0xc(%rbp), %xmm0
jne 0x21304
jp 0x21304
jmp 0x213a1
movss 0x91728(%rip), %xmm0    # 0xb2a34
ucomiss -0x8(%rbp), %xmm0
jbe 0x2133e
xorps %xmm0, %xmm0
ucomiss -0xc(%rbp), %xmm0
jbe 0x21325
xorps %xmm0, %xmm0
movss %xmm0, -0x28(%rbp)
jmp 0x21332
movss 0xd6f53(%rip), %xmm0    # 0xf8280
movss %xmm0, -0x28(%rbp)
movss -0x28(%rbp), %xmm0
movss %xmm0, -0x2c(%rbp)
jmp 0x21392
movss -0x8(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0x2137b
jp 0x2137b
xorps %xmm0, %xmm0
ucomiss -0xc(%rbp), %xmm0
jbe 0x21365
movss 0xd6f22(%rip), %xmm0    # 0xf8280
movss %xmm0, -0x30(%rbp)
jmp 0x2136f
xorps %xmm0, %xmm0
movss %xmm0, -0x30(%rbp)
jmp 0x2136f
movss -0x30(%rbp), %xmm0
movss %xmm0, -0x34(%rbp)
jmp 0x21388
movss 0xd6f01(%rip), %xmm0    # 0xf8284
movss %xmm0, -0x34(%rbp)
movss -0x34(%rbp), %xmm0
movss %xmm0, -0x2c(%rbp)
movss -0x2c(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x2192f
movl -0x20(%rbp), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x2142b
movss -0x8(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0x213ee
jp 0x213ee
xorps %xmm0, %xmm0
ucomiss -0xc(%rbp), %xmm0
jbe 0x213d8
movss 0x91628(%rip), %xmm0    # 0xb29f4
divss -0x8(%rbp), %xmm0
movss %xmm0, -0x38(%rbp)
jmp 0x213e2
movss -0x8(%rbp), %xmm0
movss %xmm0, -0x38(%rbp)
movss -0x38(%rbp), %xmm0
movss %xmm0, -0x3c(%rbp)
jmp 0x2141c
movss -0x8(%rbp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss -0xc(%rbp), %xmm1
callq 0x21170
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss %xmm0, -0x3c(%rbp)
movss -0x3c(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x2192f
jmp 0x2142d
movss -0x8(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
jne 0x2146d
jp 0x2146d
xorps %xmm0, %xmm0
ucomiss -0xc(%rbp), %xmm0
jb 0x21454
movss 0xd6e33(%rip), %xmm0    # 0xf8280
movss %xmm0, -0x40(%rbp)
jmp 0x2145e
xorps %xmm0, %xmm0
movss %xmm0, -0x40(%rbp)
jmp 0x2145e
movss -0x40(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x2192f
movss 0x915bf(%rip), %xmm0    # 0xb2a34
ucomiss -0x8(%rbp), %xmm0
jbe 0x214ff
xorps %xmm0, %xmm0
ucomiss -0xc(%rbp), %xmm0
jb 0x214b2
movss -0xc(%rbp), %xmm0
xorps %xmm1, %xmm1
xorl %eax, %eax
movl $0x1, %ecx
ucomiss %xmm1, %xmm0
setnp %sil
sete %dl
testb %sil, %dl
cmovnel %ecx, %eax
cvtsi2ss %eax, %xmm0
movss %xmm0, -0x44(%rbp)
jmp 0x214f0
movl -0x20(%rbp), %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x214d9
movss 0xd6dbb(%rip), %xmm0    # 0xf8280
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss %xmm0, -0x48(%rbp)
jmp 0x214e6
movss 0xd6d9f(%rip), %xmm0    # 0xf8280
movss %xmm0, -0x48(%rbp)
movss -0x48(%rbp), %xmm0
movss %xmm0, -0x44(%rbp)
movss -0x44(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x2192f
movss -0x8(%rbp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss %xmm0, -0x8(%rbp)
movss -0x8(%rbp), %xmm0
movss 0x914d1(%rip), %xmm1    # 0xb29f4
ucomiss %xmm1, %xmm0
jne 0x2153c
jp 0x2153c
movss 0x914c2(%rip), %xmm0    # 0xb29f4
movss %xmm0, -0x4(%rbp)
jmp 0x2192f
jmp 0x2153e
movss 0x914ee(%rip), %xmm0    # 0xb2a34
ucomiss -0xc(%rbp), %xmm0
ja 0x2155e
movss -0xc(%rbp), %xmm0
movss 0x914d7(%rip), %xmm1    # 0xb2a30
ucomiss %xmm1, %xmm0
jbe 0x215db
movss 0x9148e(%rip), %xmm0    # 0xb29f4
ucomiss -0x8(%rbp), %xmm0
seta %al
andb $0x1, %al
movzbl %al, %eax
movss -0xc(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
seta %cl
andb $0x1, %cl
movzbl %cl, %ecx
cmpl %ecx, %eax
je 0x215c2
xorps %xmm0, %xmm0
ucomiss -0xc(%rbp), %xmm0
jbe 0x215ac
movss -0xc(%rbp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss %xmm0, -0x4c(%rbp)
jmp 0x215b6
movss -0xc(%rbp), %xmm0
movss %xmm0, -0x4c(%rbp)
movss -0x4c(%rbp), %xmm0
movss %xmm0, -0x50(%rbp)
jmp 0x215cc
xorps %xmm0, %xmm0
movss %xmm0, -0x50(%rbp)
jmp 0x215cc
movss -0x50(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x2192f
jmp 0x215dd
movss -0x8(%rbp), %xmm0
movss %xmm0, -0x1c(%rbp)
xorps %xmm0, %xmm0
movss %xmm0, -0x10(%rbp)
movss 0x91449(%rip), %xmm0    # 0xb2a40
ucomiss -0x1c(%rbp), %xmm0
jbe 0x21627
movss -0x10(%rbp), %xmm0
movss 0x91482(%rip), %xmm1    # 0xb2a8c
subss %xmm1, %xmm0
movss %xmm0, -0x10(%rbp)
movss 0x9140d(%rip), %xmm0    # 0xb2a28
mulss -0x1c(%rbp), %xmm0
movss %xmm0, -0x1c(%rbp)
jmp 0x215ef
jmp 0x21629
movss -0x1c(%rbp), %xmm0
movss 0x913f2(%rip), %xmm1    # 0xb2a28
ucomiss %xmm1, %xmm0
jbe 0x21661
movss 0x91449(%rip), %xmm0    # 0xb2a8c
addss -0x10(%rbp), %xmm0
movss %xmm0, -0x10(%rbp)
movss 0x913eb(%rip), %xmm0    # 0xb2a40
mulss -0x1c(%rbp), %xmm0
movss %xmm0, -0x1c(%rbp)
jmp 0x21629
jmp 0x21663
movss 0x91389(%rip), %xmm0    # 0xb29f4
ucomiss -0x1c(%rbp), %xmm0
jbe 0x21697
movss 0x9140f(%rip), %xmm0    # 0xb2a88
addss -0x10(%rbp), %xmm0
movss %xmm0, -0x10(%rbp)
movss 0x913b9(%rip), %xmm0    # 0xb2a44
mulss -0x1c(%rbp), %xmm0
movss %xmm0, -0x1c(%rbp)
jmp 0x21663
jmp 0x21699
movss -0x1c(%rbp), %xmm0
movss 0x9139e(%rip), %xmm1    # 0xb2a44
ucomiss %xmm1, %xmm0
jbe 0x216d1
movss 0x91341(%rip), %xmm0    # 0xb29f4
addss -0x10(%rbp), %xmm0
movss %xmm0, -0x10(%rbp)
movss 0x9134f(%rip), %xmm0    # 0xb2a14
mulss -0x1c(%rbp), %xmm0
movss %xmm0, -0x1c(%rbp)
jmp 0x21699
movss -0x1c(%rbp), %xmm0
movss -0x1c(%rbp), %xmm1
movss -0x1c(%rbp), %xmm2
movss 0x91378(%rip), %xmm3    # 0xb2a60
mulss %xmm3, %xmm2
movss 0x91370(%rip), %xmm3    # 0xb2a64
addss %xmm3, %xmm2
mulss %xmm2, %xmm1
movss 0x91358(%rip), %xmm2    # 0xb2a5c
addss %xmm2, %xmm1
mulss %xmm1, %xmm0
movss 0x91344(%rip), %xmm1    # 0xb2a58
addss %xmm1, %xmm0
movss %xmm0, -0x14(%rbp)
movss -0x1c(%rbp), %xmm0
movss -0x1c(%rbp), %xmm1
movss 0x91321(%rip), %xmm2    # 0xb2a50
mulss %xmm2, %xmm1
movss 0x91319(%rip), %xmm2    # 0xb2a54
addss %xmm2, %xmm1
mulss %xmm1, %xmm0
movss 0x91301(%rip), %xmm1    # 0xb2a4c
addss %xmm1, %xmm0
movss %xmm0, -0x18(%rbp)
movss -0x14(%rbp), %xmm0
divss -0x18(%rbp), %xmm0
addss -0x10(%rbp), %xmm0
movss %xmm0, -0x1c(%rbp)
movss -0xc(%rbp), %xmm0
mulss -0x1c(%rbp), %xmm0
movss %xmm0, -0x1c(%rbp)
movss 0x912c9(%rip), %xmm0    # 0xb2a48
ucomiss -0x1c(%rbp), %xmm0
jae 0x21797
movss -0x1c(%rbp), %xmm0
movss 0x912d6(%rip), %xmm1    # 0xb2a68
ucomiss %xmm1, %xmm0
jb 0x217ef
movss -0x8(%rbp), %xmm0
movss 0x91250(%rip), %xmm1    # 0xb29f4
ucomiss %xmm1, %xmm0
seta %al
andb $0x1, %al
movzbl %al, %eax
movss -0xc(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
seta %cl
andb $0x1, %cl
movzbl %cl, %ecx
cmpl %ecx, %eax
jne 0x217d6
movss 0xd6ab1(%rip), %xmm0    # 0xf8280
movss %xmm0, -0x54(%rbp)
jmp 0x217e0
xorps %xmm0, %xmm0
movss %xmm0, -0x54(%rbp)
jmp 0x217e0
movss -0x54(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
jmp 0x2192f
cvttss2si -0x1c(%rbp), %eax
movl %eax, -0x20(%rbp)
cvtsi2ssl -0x20(%rbp), %xmm1
movss -0x1c(%rbp), %xmm0
subss %xmm1, %xmm0
movss %xmm0, -0x1c(%rbp)
movss -0x1c(%rbp), %xmm0
movss -0x1c(%rbp), %xmm1
movss -0x1c(%rbp), %xmm2
movss 0x91257(%rip), %xmm3    # 0xb2a78
mulss %xmm3, %xmm2
movss 0x9124f(%rip), %xmm3    # 0xb2a7c
addss %xmm3, %xmm2
mulss %xmm2, %xmm1
movss 0x91237(%rip), %xmm2    # 0xb2a74
addss %xmm2, %xmm1
mulss %xmm1, %xmm0
movss 0x911a7(%rip), %xmm1    # 0xb29f4
addss %xmm1, %xmm0
movss %xmm0, -0x14(%rbp)
movss -0x1c(%rbp), %xmm0
movss -0x1c(%rbp), %xmm1
movss 0x91204(%rip), %xmm2    # 0xb2a6c
mulss %xmm2, %xmm1
movss 0x911fc(%rip), %xmm2    # 0xb2a70
addss %xmm2, %xmm1
mulss %xmm1, %xmm0
movss 0x91170(%rip), %xmm1    # 0xb29f4
addss %xmm1, %xmm0
movss %xmm0, -0x18(%rbp)
cmpl $-0x1f, -0x20(%rbp)
jg 0x218b0
movss 0x911e9(%rip), %xmm0    # 0xb2a84
mulss -0x14(%rbp), %xmm0
movss %xmm0, -0x14(%rbp)
movl -0x20(%rbp), %eax
addl $0x1f, %eax
movl %eax, -0x20(%rbp)
jmp 0x2188d
jmp 0x218b2
cmpl $0x1f, -0x20(%rbp)
jl 0x218d5
movss 0x911c0(%rip), %xmm0    # 0xb2a80
mulss -0x14(%rbp), %xmm0
movss %xmm0, -0x14(%rbp)
movl -0x20(%rbp), %eax
subl $0x1f, %eax
movl %eax, -0x20(%rbp)
jmp 0x218b2
cmpl $0x0, -0x20(%rbp)
jge 0x21904
movss -0x14(%rbp), %xmm0
movss -0x18(%rbp), %xmm1
xorl %ecx, %ecx
subl -0x20(%rbp), %ecx
movl $0x1, %eax
shll %cl, %eax
cvtsi2ss %eax, %xmm2
mulss %xmm2, %xmm1
divss %xmm1, %xmm0
movss %xmm0, -0x58(%rbp)
jmp 0x21925
movss -0x14(%rbp), %xmm0
movl -0x20(%rbp), %ecx
movl $0x1, %eax
shll %cl, %eax
cvtsi2ss %eax, %xmm1
mulss %xmm1, %xmm0
divss -0x18(%rbp), %xmm0
movss %xmm0, -0x58(%rbp)
movss -0x58(%rbp), %xmm0
movss %xmm0, -0x4(%rbp)
movss -0x4(%rbp), %xmm0
addq $0x60, %rsp
popq %rbp
retq
nopw (%rax,%rax)