// File: alan0201tw[P]RayTracer/include/stb_image.h
// Function: stbi__YCbCr_to_RGB_simd(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, int, int)
static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step)
{
   int i = 0;

#ifdef STBI_SSE2
   // step == 3 is pretty ugly on the final interleave, and i'm not convinced
   // it's useful in practice (you wouldn't use it for textures, for example).
   // so just accelerate step == 4 case.
   if (step == 4) {
      // this is a fairly straightforward implementation and not super-optimized.
      __m128i signflip  = _mm_set1_epi8(-0x80);
      __m128i cr_const0 = _mm_set1_epi16(   (short) ( 1.40200f*4096.0f+0.5f));
      __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));
      __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));
      __m128i cb_const1 = _mm_set1_epi16(   (short) ( 1.77200f*4096.0f+0.5f));
      __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);
      __m128i xw = _mm_set1_epi16(255); // alpha channel

      for (; i+7 < count; i += 8) {
         // load
         __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
         __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
         __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
         __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128
         __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128

         // unpack to short (and left-shift cr, cb by 8)
         __m128i yw  = _mm_unpacklo_epi8(y_bias, y_bytes);
         __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
         __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);

         // color transform
         __m128i yws = _mm_srli_epi16(yw, 4);
         __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
         __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
         __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
         __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
         __m128i rws = _mm_add_epi16(cr0, yws);
         __m128i gwt = _mm_add_epi16(cb0, yws);
         __m128i bws = _mm_add_epi16(yws, cb1);
         __m128i gws = _mm_add_epi16(gwt, cr1);

         // descale
         __m128i rw = _mm_srai_epi16(rws, 4);
         __m128i bw = _mm_srai_epi16(bws, 4);
         __m128i gw = _mm_srai_epi16(gws, 4);

         // back to byte, set up for transpose
         __m128i brb = _mm_packus_epi16(rw, bw);
         __m128i gxb = _mm_packus_epi16(gw, xw);

         // transpose to interleave channels
         __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
         __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
         __m128i o0 = _mm_unpacklo_epi16(t0, t1);
         __m128i o1 = _mm_unpackhi_epi16(t0, t1);

         // store
         _mm_storeu_si128((__m128i *) (out + 0), o0);
         _mm_storeu_si128((__m128i *) (out + 16), o1);
         out += 32;
      }
   }
#endif

#ifdef STBI_NEON
   // in this version, step=3 support would be easy to add. but is there demand?
   if (step == 4) {
      // this is a fairly straightforward implementation and not super-optimized.
      uint8x8_t signflip = vdup_n_u8(0x80);
      int16x8_t cr_const0 = vdupq_n_s16(   (short) ( 1.40200f*4096.0f+0.5f));
      int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));
      int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));
      int16x8_t cb_const1 = vdupq_n_s16(   (short) ( 1.77200f*4096.0f+0.5f));

      for (; i+7 < count; i += 8) {
         // load
         uint8x8_t y_bytes  = vld1_u8(y + i);
         uint8x8_t cr_bytes = vld1_u8(pcr + i);
         uint8x8_t cb_bytes = vld1_u8(pcb + i);
         int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
         int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));

         // expand to s16
         int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
         int16x8_t crw = vshll_n_s8(cr_biased, 7);
         int16x8_t cbw = vshll_n_s8(cb_biased, 7);

         // color transform
         int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
         int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
         int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
         int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
         int16x8_t rws = vaddq_s16(yws, cr0);
         int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
         int16x8_t bws = vaddq_s16(yws, cb1);

         // undo scaling, round, convert to byte
         uint8x8x4_t o;
         o.val[0] = vqrshrun_n_s16(rws, 4);
         o.val[1] = vqrshrun_n_s16(gws, 4);
         o.val[2] = vqrshrun_n_s16(bws, 4);
         o.val[3] = vdup_n_u8(255);

         // store, interleaving r/g/b/a
         vst4_u8(out, o);
         out += 8*4;
      }
   }
#endif

   for (; i < count; ++i) {
      int y_fixed = (y[i] << 20) + (1<<19); // rounding
      int r,g,b;
      int cr = pcr[i] - 128;
      int cb = pcb[i] - 128;
      r = y_fixed + cr* stbi__float2fixed(1.40200f);
      g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
      b = y_fixed                                   +   cb* stbi__float2fixed(1.77200f);
      r >>= 20;
      g >>= 20;
      b >>= 20;
      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
      out[0] = (stbi_uc)r;
      out[1] = (stbi_uc)g;
      out[2] = (stbi_uc)b;
      out[3] = 255;
      out += step;
   }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x6c0, %rsp            # imm = 0x6C0
movq %rdi, -0x4d8(%rbp)
movq %rsi, -0x4e0(%rbp)
movq %rdx, -0x4e8(%rbp)
movq %rcx, -0x4f0(%rbp)
movl %r8d, -0x4f4(%rbp)
movl %r9d, -0x4f8(%rbp)
movl $0x0, -0x4fc(%rbp)
cmpl $0x4, -0x4f8(%rbp)
jne 0x642ef
movb $-0x80, -0x303(%rbp)
movb -0x303(%rbp), %al
movb %al, -0x735(%rbp)
movb %al, -0x21(%rbp)
movb %al, -0x22(%rbp)
movb %al, -0x23(%rbp)
movb %al, -0x24(%rbp)
movb %al, -0x25(%rbp)
movb %al, -0x26(%rbp)
movb %al, -0x27(%rbp)
movb %al, -0x28(%rbp)
movb %al, -0x29(%rbp)
movb %al, -0x2a(%rbp)
movb %al, -0x2b(%rbp)
movb %al, -0x2c(%rbp)
movb %al, -0x2d(%rbp)
movb %al, -0x2e(%rbp)
movb %al, -0x2f(%rbp)
movb %al, -0x30(%rbp)
movzbl -0x21(%rbp), %eax
movd %eax, %xmm0
movzbl -0x22(%rbp), %eax
movd %eax, %xmm1
punpcklbw %xmm0, %xmm1    # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
movzbl -0x23(%rbp), %eax
movd %eax, %xmm2
movzbl -0x24(%rbp), %eax
movd %eax, %xmm0
punpcklbw %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
punpcklwd %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
movzbl -0x25(%rbp), %eax
movd %eax, %xmm1
movzbl -0x26(%rbp), %eax
movd %eax, %xmm2
punpcklbw %xmm1, %xmm2    # xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
movzbl -0x27(%rbp), %eax
movd %eax, %xmm3
movzbl -0x28(%rbp), %eax
movd %eax, %xmm1
punpcklbw %xmm3, %xmm1    # xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
punpcklwd %xmm2, %xmm1    # xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
punpckldq %xmm0, %xmm1    # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
movzbl -0x29(%rbp), %eax
movd %eax, %xmm2
movzbl -0x2a(%rbp), %eax
movd %eax, %xmm0
punpcklbw %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
movzbl -0x2b(%rbp), %eax
movd %eax, %xmm3
movzbl -0x2c(%rbp), %eax
movd %eax, %xmm2
punpcklbw %xmm3, %xmm2    # xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
punpcklwd %xmm0, %xmm2    # xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
movzbl -0x2d(%rbp), %eax
movd %eax, %xmm0
movzbl -0x2e(%rbp), %eax
movd %eax, %xmm3
punpcklbw %xmm0, %xmm3    # xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
movzbl -0x2f(%rbp), %eax
movd %eax, %xmm4
movzbl -0x30(%rbp), %eax
movd %eax, %xmm0
punpcklbw %xmm4, %xmm0    # xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
punpcklwd %xmm3, %xmm0    # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
punpckldq %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
punpcklqdq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0]
movaps %xmm0, -0x40(%rbp)
movaps -0x40(%rbp), %xmm0
movaps %xmm0, -0x510(%rbp)
movw $0x166f, -0x242(%rbp)   # imm = 0x166F
movw -0x242(%rbp), %ax
movw %ax, -0x734(%rbp)
movw %ax, -0x222(%rbp)
movw %ax, -0x224(%rbp)
movw %ax, -0x226(%rbp)
movw %ax, -0x228(%rbp)
movw %ax, -0x22a(%rbp)
movw %ax, -0x22c(%rbp)
movw %ax, -0x22e(%rbp)
movw %ax, -0x230(%rbp)
movzwl -0x222(%rbp), %eax
movd %eax, %xmm1
movzwl -0x224(%rbp), %eax
movd %eax, %xmm0
punpcklwd %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
movzwl -0x226(%rbp), %eax
movd %eax, %xmm2
movzwl -0x228(%rbp), %eax
movd %eax, %xmm1
punpcklwd %xmm2, %xmm1    # xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
punpckldq %xmm0, %xmm1    # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
movzwl -0x22a(%rbp), %eax
movd %eax, %xmm0
movzwl -0x22c(%rbp), %eax
movd %eax, %xmm2
punpcklwd %xmm0, %xmm2    # xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
movzwl -0x22e(%rbp), %eax
movd %eax, %xmm3
movzwl -0x230(%rbp), %eax
movd %eax, %xmm0
punpcklwd %xmm3, %xmm0    # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
punpckldq %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
punpcklqdq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0]
movaps %xmm0, -0x240(%rbp)
movaps -0x240(%rbp), %xmm0
movaps %xmm0, -0x520(%rbp)
movw $0xf493, -0x272(%rbp)   # imm = 0xF493
movw -0x272(%rbp), %ax
movw %ax, -0x732(%rbp)
movw %ax, -0x244(%rbp)
movw %ax, -0x246(%rbp)
movw %ax, -0x248(%rbp)
movw %ax, -0x24a(%rbp)
movw %ax, -0x24c(%rbp)
movw %ax, -0x24e(%rbp)
movw %ax, -0x250(%rbp)
movw %ax, -0x252(%rbp)
movzwl -0x244(%rbp), %eax
movd %eax, %xmm1
movzwl -0x246(%rbp), %eax
movd %eax, %xmm0
punpcklwd %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
movzwl -0x248(%rbp), %eax
movd %eax, %xmm2
movzwl -0x24a(%rbp), %eax
movd %eax, %xmm1
punpcklwd %xmm2, %xmm1    # xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
punpckldq %xmm0, %xmm1    # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
movzwl -0x24c(%rbp), %eax
movd %eax, %xmm0
movzwl -0x24e(%rbp), %eax
movd %eax, %xmm2
punpcklwd %xmm0, %xmm2    # xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
movzwl -0x250(%rbp), %eax
movd %eax, %xmm3
movzwl -0x252(%rbp), %eax
movd %eax, %xmm0
punpcklwd %xmm3, %xmm0    # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
punpckldq %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
punpcklqdq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0]
movaps %xmm0, -0x270(%rbp)
movaps -0x270(%rbp), %xmm0
movaps %xmm0, -0x530(%rbp)
movw $0xfa7e, -0x2a2(%rbp)   # imm = 0xFA7E
movw -0x2a2(%rbp), %ax
movw %ax, -0x730(%rbp)
movw %ax, -0x274(%rbp)
movw %ax, -0x276(%rbp)
movw %ax, -0x278(%rbp)
movw %ax, -0x27a(%rbp)
movw %ax, -0x27c(%rbp)
movw %ax, -0x27e(%rbp)
movw %ax, -0x280(%rbp)
movw %ax, -0x282(%rbp)
movzwl -0x274(%rbp), %eax
movd %eax, %xmm1
movzwl -0x276(%rbp), %eax
movd %eax, %xmm0
punpcklwd %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
movzwl -0x278(%rbp), %eax
movd %eax, %xmm2
movzwl -0x27a(%rbp), %eax
movd %eax, %xmm1
punpcklwd %xmm2, %xmm1    # xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
punpckldq %xmm0, %xmm1    # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
movzwl -0x27c(%rbp), %eax
movd %eax, %xmm0
movzwl -0x27e(%rbp), %eax
movd %eax, %xmm2
punpcklwd %xmm0, %xmm2    # xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
movzwl -0x280(%rbp), %eax
movd %eax, %xmm3
movzwl -0x282(%rbp), %eax
movd %eax, %xmm0
punpcklwd %xmm3, %xmm0    # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
punpckldq %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
punpcklqdq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0]
movaps %xmm0, -0x2a0(%rbp)
movaps -0x2a0(%rbp), %xmm0
movaps %xmm0, -0x540(%rbp)
movw $0x1c5a, -0x2d2(%rbp)   # imm = 0x1C5A
movw -0x2d2(%rbp), %ax
movw %ax, -0x72e(%rbp)
movw %ax, -0x2a4(%rbp)
movw %ax, -0x2a6(%rbp)
movw %ax, -0x2a8(%rbp)
movw %ax, -0x2aa(%rbp)
movw %ax, -0x2ac(%rbp)
movw %ax, -0x2ae(%rbp)
movw %ax, -0x2b0(%rbp)
movw %ax, -0x2b2(%rbp)
movzwl -0x2a4(%rbp), %eax
movd %eax, %xmm1
movzwl -0x2a6(%rbp), %eax
movd %eax, %xmm0
punpcklwd %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
movzwl -0x2a8(%rbp), %eax
movd %eax, %xmm2
movzwl -0x2aa(%rbp), %eax
movd %eax, %xmm1
punpcklwd %xmm2, %xmm1    # xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
punpckldq %xmm0, %xmm1    # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
movzwl -0x2ac(%rbp), %eax
movd %eax, %xmm0
movzwl -0x2ae(%rbp), %eax
movd %eax, %xmm2
punpcklwd %xmm0, %xmm2    # xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
movzwl -0x2b0(%rbp), %eax
movd %eax, %xmm3
movzwl -0x2b2(%rbp), %eax
movd %eax, %xmm0
punpcklwd %xmm3, %xmm0    # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
punpckldq %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
punpcklqdq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0]
movaps %xmm0, -0x2d0(%rbp)
movaps -0x2d0(%rbp), %xmm0
movaps %xmm0, -0x550(%rbp)
movb $-0x80, -0x304(%rbp)
movb -0x304(%rbp), %al
movb %al, -0x72b(%rbp)
movb %al, -0x1(%rbp)
movb %al, -0x2(%rbp)
movb %al, -0x3(%rbp)
movb %al, -0x4(%rbp)
movb %al, -0x5(%rbp)
movb %al, -0x6(%rbp)
movb %al, -0x7(%rbp)
movb %al, -0x8(%rbp)
movb %al, -0x9(%rbp)
movb %al, -0xa(%rbp)
movb %al, -0xb(%rbp)
movb %al, -0xc(%rbp)
movb %al, -0xd(%rbp)
movb %al, -0xe(%rbp)
movb %al, -0xf(%rbp)
movb %al, -0x10(%rbp)
movzbl -0x1(%rbp), %eax
movd %eax, %xmm0
movzbl -0x2(%rbp), %eax
movd %eax, %xmm1
punpcklbw %xmm0, %xmm1    # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
movzbl -0x3(%rbp), %eax
movd %eax, %xmm2
movzbl -0x4(%rbp), %eax
movd %eax, %xmm0
punpcklbw %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
punpcklwd %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
movzbl -0x5(%rbp), %eax
movd %eax, %xmm1
movzbl -0x6(%rbp), %eax
movd %eax, %xmm2
punpcklbw %xmm1, %xmm2    # xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
movzbl -0x7(%rbp), %eax
movd %eax, %xmm3
movzbl -0x8(%rbp), %eax
movd %eax, %xmm1
punpcklbw %xmm3, %xmm1    # xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
punpcklwd %xmm2, %xmm1    # xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
punpckldq %xmm0, %xmm1    # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
movzbl -0x9(%rbp), %eax
movd %eax, %xmm2
movzbl -0xa(%rbp), %eax
movd %eax, %xmm0
punpcklbw %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
movzbl -0xb(%rbp), %eax
movd %eax, %xmm3
movzbl -0xc(%rbp), %eax
movd %eax, %xmm2
punpcklbw %xmm3, %xmm2    # xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3],xmm2[4],xmm3[4],xmm2[5],xmm3[5],xmm2[6],xmm3[6],xmm2[7],xmm3[7]
punpcklwd %xmm0, %xmm2    # xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
movzbl -0xd(%rbp), %eax
movd %eax, %xmm0
movzbl -0xe(%rbp), %eax
movd %eax, %xmm3
punpcklbw %xmm0, %xmm3    # xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
movzbl -0xf(%rbp), %eax
movd %eax, %xmm4
movzbl -0x10(%rbp), %eax
movd %eax, %xmm0
punpcklbw %xmm4, %xmm0    # xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
punpcklwd %xmm3, %xmm0    # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
punpckldq %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
punpcklqdq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0]
movaps %xmm0, -0x20(%rbp)
movaps -0x20(%rbp), %xmm0
movaps %xmm0, -0x560(%rbp)
movw $0xff, -0x302(%rbp)
movw -0x302(%rbp), %ax
movw %ax, -0x72a(%rbp)
movw %ax, -0x2d4(%rbp)
movw %ax, -0x2d6(%rbp)
movw %ax, -0x2d8(%rbp)
movw %ax, -0x2da(%rbp)
movw %ax, -0x2dc(%rbp)
movw %ax, -0x2de(%rbp)
movw %ax, -0x2e0(%rbp)
movw %ax, -0x2e2(%rbp)
movzwl -0x2d4(%rbp), %eax
movd %eax, %xmm1
movzwl -0x2d6(%rbp), %eax
movd %eax, %xmm0
punpcklwd %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
movzwl -0x2d8(%rbp), %eax
movd %eax, %xmm2
movzwl -0x2da(%rbp), %eax
movd %eax, %xmm1
punpcklwd %xmm2, %xmm1    # xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
punpckldq %xmm0, %xmm1    # xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
movzwl -0x2dc(%rbp), %eax
movd %eax, %xmm0
movzwl -0x2de(%rbp), %eax
movd %eax, %xmm2
punpcklwd %xmm0, %xmm2    # xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3]
movzwl -0x2e0(%rbp), %eax
movd %eax, %xmm3
movzwl -0x2e2(%rbp), %eax
movd %eax, %xmm0
punpcklwd %xmm3, %xmm0    # xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
punpckldq %xmm2, %xmm0    # xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
punpcklqdq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0]
movdqa %xmm0, -0x300(%rbp)
movdqa -0x300(%rbp), %xmm0
movdqa %xmm0, -0x570(%rbp)
movl -0x4fc(%rbp), %eax
addl $0x7, %eax
cmpl -0x4f4(%rbp), %eax
jge 0x642ed
movq -0x4e0(%rbp), %rax
movslq -0x4fc(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x1c8(%rbp)
movq -0x1c8(%rbp), %rax
movq (%rax), %xmm0
movaps %xmm0, -0x1e0(%rbp)
movaps -0x1e0(%rbp), %xmm0
movaps %xmm0, -0x580(%rbp)
movq -0x4f0(%rbp), %rax
movslq -0x4fc(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x1e8(%rbp)
movq -0x1e8(%rbp), %rax
movq (%rax), %xmm0
movaps %xmm0, -0x200(%rbp)
movaps -0x200(%rbp), %xmm0
movaps %xmm0, -0x590(%rbp)
movq -0x4e8(%rbp), %rax
movslq -0x4fc(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x208(%rbp)
movq -0x208(%rbp), %rax
movq (%rax), %xmm0
movaps %xmm0, -0x220(%rbp)
movaps -0x220(%rbp), %xmm0
movaps %xmm0, -0x5a0(%rbp)
movaps -0x590(%rbp), %xmm1
movaps -0x510(%rbp), %xmm0
movaps %xmm1, -0x190(%rbp)
movaps %xmm0, -0x1a0(%rbp)
movaps -0x190(%rbp), %xmm0
movaps -0x1a0(%rbp), %xmm1
pxor %xmm1, %xmm0
movaps %xmm0, -0x5b0(%rbp)
movaps -0x5a0(%rbp), %xmm1
movaps -0x510(%rbp), %xmm0
movaps %xmm1, -0x1b0(%rbp)
movaps %xmm0, -0x1c0(%rbp)
movaps -0x1b0(%rbp), %xmm0
movaps -0x1c0(%rbp), %xmm1
pxor %xmm1, %xmm0
movaps %xmm0, -0x5c0(%rbp)
movaps -0x560(%rbp), %xmm1
movaps -0x580(%rbp), %xmm0
movaps %xmm1, -0x340(%rbp)
movaps %xmm0, -0x350(%rbp)
movaps -0x340(%rbp), %xmm0
movaps -0x350(%rbp), %xmm1
punpcklbw %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
movaps %xmm0, -0x5d0(%rbp)
xorps %xmm0, %xmm0
movaps %xmm0, -0x400(%rbp)
movaps -0x400(%rbp), %xmm2
movaps -0x5b0(%rbp), %xmm1
movaps %xmm2, -0x360(%rbp)
movaps %xmm1, -0x370(%rbp)
movaps -0x360(%rbp), %xmm1
movaps -0x370(%rbp), %xmm2
punpcklbw %xmm2, %xmm1    # xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
movaps %xmm1, -0x5e0(%rbp)
movaps %xmm0, -0x410(%rbp)
movaps -0x410(%rbp), %xmm1
movaps -0x5c0(%rbp), %xmm0
movaps %xmm1, -0x380(%rbp)
movaps %xmm0, -0x390(%rbp)
movaps -0x380(%rbp), %xmm0
movaps -0x390(%rbp), %xmm1
punpcklbw %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
movaps %xmm0, -0x5f0(%rbp)
movaps -0x5d0(%rbp), %xmm0
movaps %xmm0, -0x170(%rbp)
movl $0x4, -0x174(%rbp)
movaps -0x170(%rbp), %xmm0
movd -0x174(%rbp), %xmm1
psrlw %xmm1, %xmm0
movaps %xmm0, -0x600(%rbp)
movaps -0x520(%rbp), %xmm1
movaps -0x5e0(%rbp), %xmm0
movaps %xmm1, -0xf0(%rbp)
movaps %xmm0, -0x100(%rbp)
movaps -0xf0(%rbp), %xmm0
movaps -0x100(%rbp), %xmm1
pmulhw %xmm1, %xmm0
movaps %xmm0, -0x610(%rbp)
movaps -0x540(%rbp), %xmm1
movaps -0x5f0(%rbp), %xmm0
movaps %xmm1, -0x110(%rbp)
movaps %xmm0, -0x120(%rbp)
movaps -0x110(%rbp), %xmm0
movaps -0x120(%rbp), %xmm1
pmulhw %xmm1, %xmm0
movaps %xmm0, -0x620(%rbp)
movaps -0x5f0(%rbp), %xmm1
movaps -0x550(%rbp), %xmm0
movaps %xmm1, -0x130(%rbp)
movaps %xmm0, -0x140(%rbp)
movaps -0x130(%rbp), %xmm0
movaps -0x140(%rbp), %xmm1
pmulhw %xmm1, %xmm0
movaps %xmm0, -0x630(%rbp)
movaps -0x5e0(%rbp), %xmm1
movaps -0x530(%rbp), %xmm0
movaps %xmm1, -0x150(%rbp)
movaps %xmm0, -0x160(%rbp)
movaps -0x150(%rbp), %xmm0
movaps -0x160(%rbp), %xmm1
pmulhw %xmm1, %xmm0
movaps %xmm0, -0x640(%rbp)
movaps -0x610(%rbp), %xmm1
movaps -0x600(%rbp), %xmm0
movaps %xmm1, -0x420(%rbp)
movaps %xmm0, -0x430(%rbp)
movaps -0x420(%rbp), %xmm0
movaps -0x430(%rbp), %xmm1
paddw %xmm1, %xmm0
movaps %xmm0, -0x650(%rbp)
movaps -0x620(%rbp), %xmm1
movaps -0x600(%rbp), %xmm0
movaps %xmm1, -0x440(%rbp)
movaps %xmm0, -0x450(%rbp)
movaps -0x440(%rbp), %xmm0
movaps -0x450(%rbp), %xmm1
paddw %xmm1, %xmm0
movaps %xmm0, -0x660(%rbp)
movaps -0x600(%rbp), %xmm1
movaps -0x630(%rbp), %xmm0
movaps %xmm1, -0x460(%rbp)
movaps %xmm0, -0x470(%rbp)
movaps -0x460(%rbp), %xmm0
movaps -0x470(%rbp), %xmm1
paddw %xmm1, %xmm0
movaps %xmm0, -0x670(%rbp)
movaps -0x660(%rbp), %xmm1
movaps -0x640(%rbp), %xmm0
movaps %xmm1, -0x480(%rbp)
movaps %xmm0, -0x490(%rbp)
movaps -0x480(%rbp), %xmm0
movaps -0x490(%rbp), %xmm1
paddw %xmm1, %xmm0
movaps %xmm0, -0x680(%rbp)
movaps -0x650(%rbp), %xmm0
movaps %xmm0, -0x90(%rbp)
movl $0x4, -0x94(%rbp)
movaps -0x90(%rbp), %xmm0
movd -0x94(%rbp), %xmm1
psraw %xmm1, %xmm0
movaps %xmm0, -0x690(%rbp)
movaps -0x670(%rbp), %xmm0
movaps %xmm0, -0xb0(%rbp)
movl $0x4, -0xb4(%rbp)
movaps -0xb0(%rbp), %xmm0
movd -0xb4(%rbp), %xmm1
psraw %xmm1, %xmm0
movaps %xmm0, -0x6a0(%rbp)
movaps -0x680(%rbp), %xmm0
movaps %xmm0, -0xd0(%rbp)
movl $0x4, -0xd4(%rbp)
movaps -0xd0(%rbp), %xmm0
movd -0xd4(%rbp), %xmm1
psraw %xmm1, %xmm0
movaps %xmm0, -0x6b0(%rbp)
movaps -0x690(%rbp), %xmm1
movaps -0x6a0(%rbp), %xmm0
movaps %xmm1, -0x3c0(%rbp)
movaps %xmm0, -0x3d0(%rbp)
movaps -0x3c0(%rbp), %xmm0
movaps -0x3d0(%rbp), %xmm1
packuswb %xmm1, %xmm0
movaps %xmm0, -0x6c0(%rbp)
movaps -0x6b0(%rbp), %xmm1
movaps -0x570(%rbp), %xmm0
movaps %xmm1, -0x3e0(%rbp)
movaps %xmm0, -0x3f0(%rbp)
movaps -0x3e0(%rbp), %xmm0
movaps -0x3f0(%rbp), %xmm1
packuswb %xmm1, %xmm0
movaps %xmm0, -0x6d0(%rbp)
movaps -0x6c0(%rbp), %xmm1
movaps -0x6d0(%rbp), %xmm0
movaps %xmm1, -0x3a0(%rbp)
movaps %xmm0, -0x3b0(%rbp)
movaps -0x3a0(%rbp), %xmm0
movaps -0x3b0(%rbp), %xmm1
punpcklbw %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
movaps %xmm0, -0x6e0(%rbp)
movaps -0x6c0(%rbp), %xmm1
movaps -0x6d0(%rbp), %xmm0
movaps %xmm1, -0x320(%rbp)
movaps %xmm0, -0x330(%rbp)
movaps -0x320(%rbp), %xmm0
movaps -0x330(%rbp), %xmm1
punpckhbw %xmm1, %xmm0    # xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
movaps %xmm0, -0x6f0(%rbp)
movaps -0x6e0(%rbp), %xmm1
movaps -0x6f0(%rbp), %xmm0
movaps %xmm1, -0x4c0(%rbp)
movaps %xmm0, -0x4d0(%rbp)
movaps -0x4c0(%rbp), %xmm0
movaps -0x4d0(%rbp), %xmm1
punpcklwd %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
movaps %xmm0, -0x700(%rbp)
movaps -0x6e0(%rbp), %xmm1
movaps -0x6f0(%rbp), %xmm0
movaps %xmm1, -0x4a0(%rbp)
movaps %xmm0, -0x4b0(%rbp)
movaps -0x4a0(%rbp), %xmm0
movaps -0x4b0(%rbp), %xmm1
punpckhwd %xmm1, %xmm0    # xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
movdqa %xmm0, -0x710(%rbp)
movq -0x4d8(%rbp), %rax
movdqa -0x700(%rbp), %xmm0
movq %rax, -0x48(%rbp)
movdqa %xmm0, -0x60(%rbp)
movdqa -0x60(%rbp), %xmm0
movq -0x48(%rbp), %rax
movdqu %xmm0, (%rax)
movq -0x4d8(%rbp), %rax
addq $0x10, %rax
movdqa -0x710(%rbp), %xmm0
movq %rax, -0x68(%rbp)
movdqa %xmm0, -0x80(%rbp)
movdqa -0x80(%rbp), %xmm0
movq -0x68(%rbp), %rax
movdqu %xmm0, (%rax)
movq -0x4d8(%rbp), %rax
addq $0x20, %rax
movq %rax, -0x4d8(%rbp)
movl -0x4fc(%rbp), %eax
addl $0x8, %eax
movl %eax, -0x4fc(%rbp)
jmp 0x63cf3
jmp 0x642ef
jmp 0x642f1
movl -0x4fc(%rbp), %eax
cmpl -0x4f4(%rbp), %eax
jge 0x644d9
movq -0x4e0(%rbp), %rax
movslq -0x4fc(%rbp), %rcx
movzbl (%rax,%rcx), %eax
shll $0x14, %eax
addl $0x80000, %eax          # imm = 0x80000
movl %eax, -0x714(%rbp)
movq -0x4f0(%rbp), %rax
movslq -0x4fc(%rbp), %rcx
movzbl (%rax,%rcx), %eax
subl $0x80, %eax
movl %eax, -0x724(%rbp)
movq -0x4e8(%rbp), %rax
movslq -0x4fc(%rbp), %rcx
movzbl (%rax,%rcx), %eax
subl $0x80, %eax
movl %eax, -0x728(%rbp)
movl -0x714(%rbp), %eax
imull $0x166f00, -0x724(%rbp), %ecx # imm = 0x166F00
addl %ecx, %eax
movl %eax, -0x718(%rbp)
movl -0x714(%rbp), %eax
imull $0xfff49300, -0x724(%rbp), %ecx # imm = 0xFFF49300
addl %ecx, %eax
imull $0xfffa7e00, -0x728(%rbp), %ecx # imm = 0xFFFA7E00
andl $0xffff0000, %ecx       # imm = 0xFFFF0000
addl %ecx, %eax
movl %eax, -0x71c(%rbp)
movl -0x714(%rbp), %eax
imull $0x1c5a00, -0x728(%rbp), %ecx # imm = 0x1C5A00
addl %ecx, %eax
movl %eax, -0x720(%rbp)
movl -0x718(%rbp), %eax
sarl $0x14, %eax
movl %eax, -0x718(%rbp)
movl -0x71c(%rbp), %eax
sarl $0x14, %eax
movl %eax, -0x71c(%rbp)
movl -0x720(%rbp), %eax
sarl $0x14, %eax
movl %eax, -0x720(%rbp)
cmpl $0xff, -0x718(%rbp)
jbe 0x64411
cmpl $0x0, -0x718(%rbp)
jge 0x64405
movl $0x0, -0x718(%rbp)
jmp 0x6440f
movl $0xff, -0x718(%rbp)
jmp 0x64411
cmpl $0xff, -0x71c(%rbp)
jbe 0x6443e
cmpl $0x0, -0x71c(%rbp)
jge 0x64432
movl $0x0, -0x71c(%rbp)
jmp 0x6443c
movl $0xff, -0x71c(%rbp)
jmp 0x6443e
cmpl $0xff, -0x720(%rbp)
jbe 0x6446b
cmpl $0x0, -0x720(%rbp)
jge 0x6445f
movl $0x0, -0x720(%rbp)
jmp 0x64469
movl $0xff, -0x720(%rbp)
jmp 0x6446b
movl -0x718(%rbp), %eax
movb %al, %cl
movq -0x4d8(%rbp), %rax
movb %cl, (%rax)
movl -0x71c(%rbp), %eax
movb %al, %cl
movq -0x4d8(%rbp), %rax
movb %cl, 0x1(%rax)
movl -0x720(%rbp), %eax
movb %al, %cl
movq -0x4d8(%rbp), %rax
movb %cl, 0x2(%rax)
movq -0x4d8(%rbp), %rax
movb $-0x1, 0x3(%rax)
movl -0x4f8(%rbp), %ecx
movq -0x4d8(%rbp), %rax
movslq %ecx, %rcx
addq %rcx, %rax
movq %rax, -0x4d8(%rbp)
movl -0x4fc(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4fc(%rbp)
jmp 0x642f1
addq $0x6c0, %rsp            # imm = 0x6C0
popq %rbp
retq
nopw %cs:(%rax,%rax)