// File: /workspace/github_c_makefile_star2_O3/nh13[P]ksw/src/parasail/src/nw_trace_scan_sse2_128_8.c
// Function: parasail_nw_trace_scan_profile_sse2_128_8
parasail_result_t* PNAME(
        const parasail_profile_t * const restrict profile,
        const char * const restrict s2, const int s2Len,
        const int open, const int gap)
{
    /* declare local variables */
    int32_t i = 0;
    int32_t j = 0;
    int32_t k = 0;
    int32_t s1Len = 0;
    int32_t end_query = 0;
    int32_t end_ref = 0;
    const parasail_matrix_t *matrix = NULL;
    int32_t segWidth = 0;
    int32_t segLen = 0;
    int32_t offset = 0;
    int32_t position = 0;
    __m128i* restrict pvP = NULL;
    __m128i* restrict pvE = NULL;
    int8_t* restrict boundary = NULL;
    __m128i* restrict pvHt = NULL;
    __m128i* restrict pvH = NULL;
    __m128i* restrict pvGapper = NULL;
    __m128i vGapO;
    __m128i vGapE;
    int8_t NEG_LIMIT = 0;
    int8_t POS_LIMIT = 0;
    __m128i vZero;
    int8_t score = 0;
    __m128i vNegLimit;
    __m128i vPosLimit;
    __m128i vSaturationCheckMin;
    __m128i vSaturationCheckMax;
    __m128i vNegInfFront;
    __m128i vSegLenXgap;
    parasail_result_t *result = NULL;
    __m128i vTIns;
    __m128i vTDel;
    __m128i vTDiag;
    __m128i vTDiagE;
    __m128i vTInsE;
    __m128i vTDiagF;
    __m128i vTDelF;

    /* validate inputs */
    PARASAIL_CHECK_NULL(profile);
    PARASAIL_CHECK_NULL(profile->profile8.score);
    PARASAIL_CHECK_NULL(profile->matrix);
    PARASAIL_CHECK_GT0(profile->s1Len);
    PARASAIL_CHECK_NULL(s2);
    PARASAIL_CHECK_GT0(s2Len);
    PARASAIL_CHECK_GE0(open);
    PARASAIL_CHECK_GE0(gap);

    /* initialize stack variables */
    i = 0;
    j = 0;
    k = 0;
    s1Len = profile->s1Len;
    end_query = s1Len-1;
    end_ref = s2Len-1;
    matrix = profile->matrix;
    segWidth = 16; /* number of values in vector unit */
    segLen = (s1Len + segWidth - 1) / segWidth;
    offset = (s1Len - 1) % segLen;
    position = (segWidth - 1) - (s1Len - 1) / segLen;
    pvP = (__m128i*)profile->profile8.score;
    vGapO = _mm_set1_epi8(open);
    vGapE = _mm_set1_epi8(gap);
    NEG_LIMIT = (-open < matrix->min ? INT8_MIN + open : INT8_MIN - matrix->min) + 1;
    POS_LIMIT = INT8_MAX - matrix->max - 1;
    vZero = _mm_setzero_si128();
    score = NEG_LIMIT;
    vNegLimit = _mm_set1_epi8(NEG_LIMIT);
    vPosLimit = _mm_set1_epi8(POS_LIMIT);
    vSaturationCheckMin = vPosLimit;
    vSaturationCheckMax = vNegLimit;
    vNegInfFront = vZero;
    vTIns  = _mm_set1_epi8(PARASAIL_INS);
    vTDel  = _mm_set1_epi8(PARASAIL_DEL);
    vTDiag = _mm_set1_epi8(PARASAIL_DIAG);
    vTDiagE = _mm_set1_epi8(PARASAIL_DIAG_E);
    vTInsE = _mm_set1_epi8(PARASAIL_INS_E);
    vTDiagF = _mm_set1_epi8(PARASAIL_DIAG_F);
    vTDelF = _mm_set1_epi8(PARASAIL_DEL_F);
    vNegInfFront = _mm_insert_epi8_rpl(vNegInfFront, NEG_LIMIT, 0);
    vSegLenXgap = _mm_adds_epi8(vNegInfFront,
            _mm_slli_si128(_mm_set1_epi8(-segLen*gap), 1));

    /* initialize result */
    result = parasail_result_new_trace(segLen, s2Len, 16, sizeof(__m128i));
    if (!result) return NULL;

    /* set known flags */
    result->flag |= PARASAIL_FLAG_NW | PARASAIL_FLAG_SCAN
        | PARASAIL_FLAG_TRACE
        | PARASAIL_FLAG_BITS_8 | PARASAIL_FLAG_LANES_16;

    /* initialize heap variables */
    pvE = parasail_memalign___m128i(16, segLen);
    boundary = parasail_memalign_int8_t(16, s2Len+1);
    pvHt= parasail_memalign___m128i(16, segLen);
    pvH = parasail_memalign___m128i(16, segLen);
    pvGapper = parasail_memalign___m128i(16, segLen);

    /* validate heap variables */
    if (!pvE) return NULL;
    if (!boundary) return NULL;
    if (!pvHt) return NULL;
    if (!pvH) return NULL;
    if (!pvGapper) return NULL;

    /* initialize H and E */
    {
        int32_t index = 0;
        for (i=0; i<segLen; ++i) {
            int32_t segNum = 0;
            __m128i_8_t h;
            __m128i_8_t e;
            for (segNum=0; segNum<segWidth; ++segNum) {
                int64_t tmp = -open-gap*(segNum*segLen+i);
                h.v[segNum] = tmp < INT8_MIN ? INT8_MIN : tmp;
                tmp = tmp - open;
                e.v[segNum] = tmp < INT8_MIN ? INT8_MIN : tmp;
            }
            _mm_store_si128(&pvH[index], h.m);
            _mm_store_si128(&pvE[index], e.m);
            ++index;
        }
    }

    /* initialize uppder boundary */
    {
        boundary[0] = 0;
        for (i=1; i<=s2Len; ++i) {
            int64_t tmp = -open-gap*(i-1);
            boundary[i] = tmp < INT8_MIN ? INT8_MIN : tmp;
        }
    }

    {
        __m128i vGapper = _mm_subs_epi8(vZero,vGapO);
        for (i=segLen-1; i>=0; --i) {
            _mm_store_si128(pvGapper+i, vGapper);
            vGapper = _mm_subs_epi8(vGapper, vGapE);
        }
    }

    /* outer loop over database sequence */
    for (j=0; j<s2Len; ++j) {
        __m128i vE;
        __m128i vE_ext;
        __m128i vE_opn;
        __m128i vHt;
        __m128i vF;
        __m128i vF_ext;
        __m128i vF_opn;
        __m128i vH;
        __m128i vHp;
        __m128i *pvW;
        __m128i vW;
        __m128i case1;
        __m128i case2;
        __m128i vGapper;
        __m128i vT;
        __m128i vET;
        __m128i vFT;

        /* calculate E */
        /* calculate Ht */
        /* calculate F and H first pass */
        vHp = _mm_load_si128(pvH+(segLen-1));
        vHp = _mm_slli_si128(vHp, 1);
        vHp = _mm_insert_epi8_rpl(vHp, boundary[j], 0);
        pvW = pvP + matrix->mapper[(unsigned char)s2[j]]*segLen;
        vHt = _mm_subs_epi8(vNegLimit, pvGapper[0]);
        vF = vNegLimit;
        for (i=0; i<segLen; ++i) {
            vH = _mm_load_si128(pvH+i);
            vE = _mm_load_si128(pvE+i);
            vW = _mm_load_si128(pvW+i);
            vGapper = _mm_load_si128(pvGapper+i);
            vE_opn = _mm_subs_epi8(vH, vGapO);
            vE_ext = _mm_subs_epi8(vE, vGapE);
            case1 = _mm_cmpgt_epi8(vE_opn, vE_ext);
            vET = _mm_blendv_epi8_rpl(vTInsE, vTDiagE, case1);
            arr_store(result->trace->trace_table, vET, i, segLen, j);
            vE = _mm_max_epi8_rpl(vE_opn, vE_ext);
            vSaturationCheckMin = _mm_min_epi8_rpl(vSaturationCheckMin, vE);
            vGapper = _mm_adds_epi8(vHt, vGapper);
            vF = _mm_max_epi8_rpl(vF, vGapper);
            vHp = _mm_adds_epi8(vHp, vW);
            vHt = _mm_max_epi8_rpl(vE, vHp);
            _mm_store_si128(pvE+i, vE);
            _mm_store_si128(pvHt+i, vHt);
            _mm_store_si128(pvH+i, vHp);
            vHp = vH;
        }

        /* pseudo prefix scan on F and H */
        vHt = _mm_slli_si128(vHt, 1);
        vHt = _mm_insert_epi8_rpl(vHt, boundary[j+1], 0);
        vGapper = _mm_load_si128(pvGapper);
        vGapper = _mm_adds_epi8(vHt, vGapper);
        vF = _mm_max_epi8_rpl(vF, vGapper);
        for (i=0; i<segWidth-2; ++i) {
            __m128i vFt = _mm_slli_si128(vF, 1);
            vFt = _mm_adds_epi8(vFt, vSegLenXgap);
            vF = _mm_max_epi8_rpl(vF, vFt);
        }

        /* calculate final H */
        vF = _mm_slli_si128(vF, 1);
        vF = _mm_adds_epi8(vF, vNegInfFront);
        vH = _mm_max_epi8_rpl(vF, vHt);
        for (i=0; i<segLen; ++i) {
            vET = arr_load(result->trace->trace_table, i, segLen, j);
            vHp = _mm_load_si128(pvH+i);
            vHt = _mm_load_si128(pvHt+i);
            vF_opn = _mm_subs_epi8(vH, vGapO);
            vF_ext = _mm_subs_epi8(vF, vGapE);
            vF = _mm_max_epi8_rpl(vF_opn, vF_ext);
            case1 = _mm_cmpgt_epi8(vF_opn, vF_ext);
            vFT = _mm_blendv_epi8_rpl(vTDelF, vTDiagF, case1);
            vH = _mm_max_epi8_rpl(vHt, vF);
            case1 = _mm_cmpeq_epi8(vH, vHp);
            case2 = _mm_cmpeq_epi8(vH, vF);
            vT = _mm_blendv_epi8_rpl(
                    _mm_blendv_epi8_rpl(vTIns, vTDel, case2),
                    vTDiag, case1);
            vT = _mm_or_si128(vT, vET);
            vT = _mm_or_si128(vT, vFT);
            arr_store(result->trace->trace_table, vT, i, segLen, j);
            _mm_store_si128(pvH+i, vH);
            vSaturationCheckMin = _mm_min_epi8_rpl(vSaturationCheckMin, vH);
            vSaturationCheckMin = _mm_min_epi8_rpl(vSaturationCheckMin, vF);
            vSaturationCheckMax = _mm_max_epi8_rpl(vSaturationCheckMax, vH);
        }
    }

    /* extract last value from the last column */
    {
        __m128i vH = _mm_load_si128(pvH + offset);
        for (k=0; k<position; ++k) {
            vH = _mm_slli_si128(vH, 1);
        }
        score = (int8_t) _mm_extract_epi8_rpl (vH, 15);
    }

    if (_mm_movemask_epi8(_mm_or_si128(
            _mm_cmplt_epi8(vSaturationCheckMin, vNegLimit),
            _mm_cmpgt_epi8(vSaturationCheckMax, vPosLimit)))) {
        result->flag |= PARASAIL_FLAG_SATURATED;
        score = 0;
        end_query = 0;
        end_ref = 0;
    }

    result->score = score;
    result->end_query = end_query;
    result->end_ref = end_ref;

    parasail_free(pvGapper);
    parasail_free(pvH);
    parasail_free(pvHt);
    parasail_free(boundary);
    parasail_free(pvE);

    return result;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xf8, %rsp
movq %rsi, 0x58(%rsp)
testq %rdi, %rdi
je 0x3a8ee5
movq 0x18(%rdi), %rax
movq %rax, 0xa8(%rsp)
testq %rax, %rax
je 0x3a8eec
movq 0x10(%rdi), %rax
movq %rax, 0x50(%rsp)
testq %rax, %rax
je 0x3a8ef3
movl 0x8(%rdi), %r13d
testl %r13d, %r13d
jle 0x3a8efa
cmpq $0x0, 0x58(%rsp)
je 0x3a8f01
movl %edx, %ebp
testl %edx, %edx
jle 0x3a8f08
testl %ecx, %ecx
js 0x3a8f0f
testl %r8d, %r8d
js 0x3a8f16
movq %r8, 0x48(%rsp)
leal -0x1(%r13), %ebx
addq $0xf, %r13
shrq $0x4, %r13
movl %ebx, %eax
xorl %edx, %edx
divl %r13d
movl %eax, 0x4(%rsp)
movl %edx, %r12d
xorl %r15d, %r15d
movl %ecx, %esi
negl %esi
movq 0x50(%rsp), %rdx
movl 0x20(%rdx), %eax
movl %eax, %edi
negb %dil
movl %esi, 0x20(%rsp)
cmpl %esi, %eax
movzbl %dil, %eax
movl %ecx, 0x80(%rsp)
cmovgl %ecx, %eax
movl %eax, 0x30(%rsp)
movb $0x7e, %al
subb 0x1c(%rdx), %al
movb %al, 0x90(%rsp)
movl $0x10, %edx
movl $0x10, %ecx
movl %r13d, %edi
movl %ebp, %esi
callq 0x20adf4
testq %rax, %rax
je 0x3a8f1e
movq %rax, %r14
movl %r12d, 0x1c(%rsp)
movl %ebx, 0x18(%rsp)
orl $0x10180401, 0xc(%rax)  # imm = 0x10180401
movl $0x10, %edi
movq %r13, %rsi
callq 0x2f600c
movq %rax, %r12
movq %rbp, 0x60(%rsp)
leal 0x1(%rbp), %esi
movl $0x10, %edi
callq 0x20a620
movq %r13, %r15
movq %rax, %r13
movl $0x10, %edi
movq %r15, %rsi
callq 0x2f600c
movq %rax, %rbp
movl $0x10, %edi
movq %r15, %rsi
callq 0x2f600c
movq %rax, %rbx
movl $0x10, %edi
movq %r15, 0x8(%rsp)
movq %r15, %rsi
callq 0x2f600c
movq %r12, %xmm0
movq %r13, %xmm1
punpcklqdq %xmm1, %xmm0    # xmm0 = xmm0[0],xmm1[0]
movq %rbp, %xmm1
movq %rbx, %xmm2
punpcklqdq %xmm2, %xmm1    # xmm1 = xmm1[0],xmm2[0]
pxor %xmm2, %xmm2
pcmpeqd %xmm2, %xmm0
pcmpeqd %xmm2, %xmm1
movdqa %xmm0, %xmm2
shufps $0xdd, %xmm1, %xmm2     # xmm2 = xmm2[1,3],xmm1[1,3]
shufps $0x88, %xmm1, %xmm0     # xmm0 = xmm0[0,2],xmm1[0,2]
andps %xmm2, %xmm0
movmskps %xmm0, %ecx
xorl %r15d, %r15d
testl %ecx, %ecx
jne 0x3a8f1e
testq %rax, %rax
je 0x3a8f1e
movq 0x60(%rsp), %rcx
decl %ecx
movl %ecx, (%rsp)
movl $0xf, %ecx
subl 0x4(%rsp), %ecx
movl %ecx, 0x14(%rsp)
movl 0x80(%rsp), %esi
movd %esi, %xmm0
movdqa %xmm0, 0xc0(%rsp)
punpcklbw %xmm0, %xmm0    # xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
pshuflw $0x0, %xmm0, %xmm0      # xmm0 = xmm0[0,0,0,0,4,5,6,7]
pshufd $0x0, %xmm0, %xmm2      # xmm2 = xmm0[0,0,0,0]
movq 0x48(%rsp), %rdx
movd %edx, %xmm4
movdqa %xmm4, %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]
pshuflw $0x0, %xmm0, %xmm0      # xmm0 = xmm0[0,0,0,0,4,5,6,7]
pshufd $0x0, %xmm0, %xmm3      # xmm3 = xmm0[0,0,0,0]
movl 0x30(%rsp), %ecx
addb $-0x7f, %cl
movzbl %cl, %ecx
movd %ecx, %xmm1
movdqa %xmm1, %xmm0
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]
pshuflw $0x0, %xmm0, %xmm0      # xmm0 = xmm0[0,0,0,0,4,5,6,7]
pshufd $0x0, %xmm0, %xmm0      # xmm0 = xmm0[0,0,0,0]
movdqa %xmm0, 0x30(%rsp)
movzbl 0x90(%rsp), %ecx
movd %ecx, %xmm0
punpcklbw %xmm0, %xmm0    # xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
pshuflw $0x0, %xmm0, %xmm0      # xmm0 = xmm0[0,0,0,0,4,5,6,7]
pshufd $0x0, %xmm0, %xmm0      # xmm0 = xmm0[0,0,0,0]
movdqa %xmm0, 0x70(%rsp)
movq 0x8(%rsp), %r8
movl %r8d, %ecx
imull %edx, %ecx
negb %cl
movzbl %cl, %ecx
movd %ecx, %xmm0
punpcklbw %xmm0, %xmm0    # xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
pshuflw $0x0, %xmm0, %xmm0      # xmm0 = xmm0[0,0,0,0,4,5,6,7]
pshufd $0x0, %xmm0, %xmm6      # xmm6 = xmm0[0,0,0,0]
pslldq $0x1, %xmm6             # xmm6 = zero,xmm6[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movdqa %xmm1, 0x90(%rsp)
paddsb %xmm1, %xmm6
movl %esi, %ecx
movl %edx, %esi
movslq 0x20(%rsp), %rdi
negq %rcx
imulq %rsi, %r8
xorl %r9d, %r9d
movq $-0x80, %r10
movq %rdi, %r11
xorl %r15d, %r15d
cmpq $-0x7f, %r11
movq $-0x80, %rdx
cmovgeq %r11, %rdx
movb %dl, 0xe0(%rsp,%r15)
leaq (%rcx,%r11), %rdx
cmpq $-0x7f, %rdx
cmovlq %r10, %rdx
movb %dl, 0xd0(%rsp,%r15)
incq %r15
subq %r8, %r11
cmpq $0x10, %r15
jne 0x3a8375
movq %r9, %rdx
shlq $0x4, %rdx
movaps 0xe0(%rsp), %xmm0
movaps %xmm0, (%rbx,%rdx)
movdqa 0xd0(%rsp), %xmm0
movdqa %xmm0, (%r12,%rdx)
incq %r9
subq %rsi, %rdi
cmpq 0x8(%rsp), %r9
jne 0x3a836f
movdqa %xmm6, 0x80(%rsp)
movb $0x0, (%r13)
movq 0x60(%rsp), %rsi
movl %esi, %ecx
addl $0xf, %esi
andl $-0x10, %esi
movq %rcx, 0xa0(%rsp)
decq %rcx
movq %rcx, %xmm0
pshufd $0x44, %xmm0, %xmm0     # xmm0 = xmm0[0,1,0,1]
movdqa %xmm0, 0x60(%rsp)
movd 0x20(%rsp), %xmm0
movdqa %xmm0, 0xb0(%rsp)
pshufd $0x0, %xmm0, %xmm0      # xmm0 = xmm0[0,0,0,0]
movdqa %xmm0, 0x20(%rsp)
pshufd $0x0, %xmm4, %xmm5      # xmm5 = xmm4[0,0,0,0]
movq 0x48(%rsp), %r15
movl %r15d, %edi
negl %edi
movl %r15d, %r8d
shll $0x4, %r8d
leal (%r15,%r15,2), %r9d
addl %r15d, %r15d
xorl %r10d, %r10d
movdqa 0x280a4c(%rip), %xmm13  # 0x628ea0
pcmpeqd %xmm14, %xmm14
xorl %r11d, %r11d
movdqa 0x2817ab(%rip), %xmm12  # 0x629c10
movq %r11, %xmm0
pshufd $0x44, %xmm0, %xmm15    # xmm15 = xmm0[0,1,0,1]
movdqa %xmm15, %xmm0
por 0x280a13(%rip), %xmm0   # 0x628e90
movdqa 0x60(%rsp), %xmm7
pxor %xmm13, %xmm7
pxor %xmm13, %xmm0
movdqa %xmm0, %xmm1
pcmpgtd %xmm7, %xmm1
pshufd $0xa0, %xmm1, %xmm6     # xmm6 = xmm1[0,0,2,2]
pshuflw $0xe8, %xmm6, %xmm4     # xmm4 = xmm6[0,2,2,3,4,5,6,7]
pcmpeqd %xmm7, %xmm0
pshufd $0xf5, %xmm0, %xmm0     # xmm0 = xmm0[1,1,3,3]
pshuflw $0xe8, %xmm0, %xmm8     # xmm8 = xmm0[0,2,2,3,4,5,6,7]
pand %xmm4, %xmm8
pshufd $0xf5, %xmm1, %xmm11    # xmm11 = xmm1[1,1,3,3]
pshuflw $0xe8, %xmm11, %xmm1    # xmm1 = xmm11[0,2,2,3,4,5,6,7]
por %xmm8, %xmm1
pxor %xmm14, %xmm1
packssdw %xmm1, %xmm1
leal (%r15,%r10), %ecx
leal (%r9,%r10), %edx
movd %edi, %xmm4
punpcklqdq 0xb0(%rsp), %xmm4 # xmm4 = xmm4[0],mem[0]
pshufd $0xa2, %xmm4, %xmm8     # xmm8 = xmm4[2,0,2,2]
movd %edx, %xmm4
movd %ecx, %xmm9
punpckldq %xmm4, %xmm9    # xmm9 = xmm9[0],xmm4[0],xmm9[1],xmm4[1]
movd %r10d, %xmm4
punpckldq 0xc0(%rsp), %xmm4 # xmm4 = xmm4[0],mem[0],xmm4[1],mem[1]
punpcklqdq %xmm9, %xmm4    # xmm4 = xmm4[0],xmm9[0]
psubd %xmm4, %xmm8
movdqa %xmm8, %xmm4
pcmpgtd %xmm12, %xmm4
pand %xmm4, %xmm8
pandn %xmm12, %xmm4
por %xmm8, %xmm4
movd %xmm1, %ecx
testb $0x1, %cl
je 0x3a8539
movd %xmm4, %ecx
movb %cl, 0x1(%r13,%r11)
pand %xmm6, %xmm0
por %xmm11, %xmm0
packssdw %xmm0, %xmm0
pxor %xmm14, %xmm0
packssdw %xmm0, %xmm0
packsswb %xmm0, %xmm0
movd %xmm0, %ecx
shrl $0x8, %ecx
testb $0x1, %cl
je 0x3a8569
pextrw $0x2, %xmm4, %ecx
movb %cl, 0x2(%r13,%r11)
movdqa %xmm15, %xmm1
por 0x28090a(%rip), %xmm1   # 0x628e80
pxor %xmm13, %xmm1
movdqa %xmm1, %xmm6
pcmpgtd %xmm7, %xmm6
pshufd $0xa0, %xmm6, %xmm0     # xmm0 = xmm6[0,0,2,2]
pcmpeqd %xmm7, %xmm1
pshufd $0xf5, %xmm1, %xmm1     # xmm1 = xmm1[1,1,3,3]
movdqa %xmm1, %xmm8
pand %xmm0, %xmm8
pshufd $0xf5, %xmm6, %xmm6     # xmm6 = xmm6[1,1,3,3]
por %xmm6, %xmm8
packssdw %xmm8, %xmm8
pxor %xmm14, %xmm8
packssdw %xmm8, %xmm8
packsswb %xmm8, %xmm8
movd %xmm8, %ecx
shrl $0x10, %ecx
testb $0x1, %cl
je 0x3a85d0
pextrw $0x4, %xmm4, %ecx
movb %cl, 0x3(%r13,%r11)
pshufhw $0x84, %xmm0, %xmm0     # xmm0 = xmm0[0,1,2,3,4,5,4,6]
pshufhw $0x84, %xmm1, %xmm1     # xmm1 = xmm1[0,1,2,3,4,5,4,6]
pand %xmm0, %xmm1
pshufhw $0x84, %xmm6, %xmm0     # xmm0 = xmm6[0,1,2,3,4,5,4,6]
por %xmm1, %xmm0
pxor %xmm14, %xmm0
packssdw %xmm0, %xmm0
packsswb %xmm0, %xmm0
movd %xmm0, %ecx
shrl $0x18, %ecx
testb $0x1, %cl
je 0x3a860a
pextrw $0x6, %xmm4, %ecx
movb %cl, 0x4(%r13,%r11)
movdqa %xmm15, %xmm0
por 0x2808b9(%rip), %xmm0   # 0x628ed0
movd %r11d, %xmm1
pshufd $0x0, %xmm1, %xmm11     # xmm11 = xmm1[0,0,0,0]
movdqa %xmm11, %xmm1
por 0x2814d1(%rip), %xmm1   # 0x629b00
pshufd $0xf5, %xmm1, %xmm6     # xmm6 = xmm1[1,1,3,3]
pmuludq %xmm5, %xmm1
pshufd $0xe8, %xmm1, %xmm1     # xmm1 = xmm1[0,2,2,3]
pshufd $0xf5, %xmm5, %xmm4     # xmm4 = xmm5[1,1,3,3]
pmuludq %xmm4, %xmm6
pshufd $0xe8, %xmm6, %xmm6     # xmm6 = xmm6[0,2,2,3]
punpckldq %xmm6, %xmm1    # xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1]
movdqa 0x20(%rsp), %xmm8
psubd %xmm1, %xmm8
movdqa %xmm8, %xmm6
pcmpgtd %xmm12, %xmm6
pand %xmm6, %xmm8
pandn %xmm12, %xmm6
por %xmm8, %xmm6
pxor %xmm13, %xmm0
movdqa %xmm0, %xmm8
pcmpgtd %xmm7, %xmm8
pshufd $0xa0, %xmm8, %xmm1     # xmm1 = xmm8[0,0,2,2]
pshuflw $0xe8, %xmm1, %xmm9     # xmm9 = xmm1[0,2,2,3,4,5,6,7]
pcmpeqd %xmm7, %xmm0
pshufd $0xf5, %xmm0, %xmm0     # xmm0 = xmm0[1,1,3,3]
pshuflw $0xe8, %xmm0, %xmm10    # xmm10 = xmm0[0,2,2,3,4,5,6,7]
pand %xmm9, %xmm10
pshufd $0xf5, %xmm8, %xmm8     # xmm8 = xmm8[1,1,3,3]
pshuflw $0xe8, %xmm8, %xmm9     # xmm9 = xmm8[0,2,2,3,4,5,6,7]
por %xmm10, %xmm9
pxor %xmm14, %xmm9
packssdw %xmm9, %xmm9
packsswb %xmm9, %xmm9
pextrw $0x2, %xmm9, %ecx
testb $0x1, %cl
je 0x3a86d7
movd %xmm6, %ecx
movb %cl, 0x5(%r13,%r11)
pand %xmm1, %xmm0
por %xmm8, %xmm0
packssdw %xmm0, %xmm0
pxor %xmm14, %xmm0
packssdw %xmm0, %xmm0
packsswb %xmm0, %xmm0
pextrw $0x2, %xmm0, %ecx
shrl $0x8, %ecx
testb $0x1, %cl
je 0x3a8708
pextrw $0x2, %xmm6, %ecx
movb %cl, 0x6(%r13,%r11)
movdqa %xmm15, %xmm1
por 0x2807ab(%rip), %xmm1   # 0x628ec0
pxor %xmm13, %xmm1
movdqa %xmm1, %xmm8
pcmpgtd %xmm7, %xmm8
pshufd $0xa0, %xmm8, %xmm0     # xmm0 = xmm8[0,0,2,2]
pcmpeqd %xmm7, %xmm1
pshufd $0xf5, %xmm1, %xmm1     # xmm1 = xmm1[1,1,3,3]
movdqa %xmm1, %xmm9
pand %xmm0, %xmm9
pshufd $0xf5, %xmm8, %xmm8     # xmm8 = xmm8[1,1,3,3]
por %xmm8, %xmm9
packssdw %xmm9, %xmm9
pxor %xmm14, %xmm9
packssdw %xmm9, %xmm9
packsswb %xmm9, %xmm9
pextrw $0x3, %xmm9, %ecx
testb $0x1, %cl
je 0x3a8771
pextrw $0x4, %xmm6, %ecx
movb %cl, 0x7(%r13,%r11)
pshufhw $0x84, %xmm0, %xmm0     # xmm0 = xmm0[0,1,2,3,4,5,4,6]
pshufhw $0x84, %xmm1, %xmm1     # xmm1 = xmm1[0,1,2,3,4,5,4,6]
pand %xmm0, %xmm1
pshufhw $0x84, %xmm8, %xmm0     # xmm0 = xmm8[0,1,2,3,4,5,4,6]
por %xmm1, %xmm0
pxor %xmm14, %xmm0
packssdw %xmm0, %xmm0
packsswb %xmm0, %xmm0
pextrw $0x3, %xmm0, %ecx
shrl $0x8, %ecx
testb $0x1, %cl
je 0x3a87ad
pextrw $0x6, %xmm6, %ecx
movb %cl, 0x8(%r13,%r11)
movdqa %xmm15, %xmm0
por 0x281426(%rip), %xmm0   # 0x629be0
movdqa %xmm11, %xmm1
por 0x281429(%rip), %xmm1   # 0x629bf0
pshufd $0xf5, %xmm1, %xmm6     # xmm6 = xmm1[1,1,3,3]
pmuludq %xmm5, %xmm1
pshufd $0xe8, %xmm1, %xmm1     # xmm1 = xmm1[0,2,2,3]
pmuludq %xmm4, %xmm6
pshufd $0xe8, %xmm6, %xmm6     # xmm6 = xmm6[0,2,2,3]
punpckldq %xmm6, %xmm1    # xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1]
movdqa 0x20(%rsp), %xmm8
psubd %xmm1, %xmm8
movdqa %xmm8, %xmm6
pcmpgtd %xmm12, %xmm6
pand %xmm6, %xmm8
pandn %xmm12, %xmm6
por %xmm8, %xmm6
pxor %xmm13, %xmm0
movdqa %xmm0, %xmm8
pcmpgtd %xmm7, %xmm8
pshufd $0xa0, %xmm8, %xmm1     # xmm1 = xmm8[0,0,2,2]
pshuflw $0xe8, %xmm1, %xmm9     # xmm9 = xmm1[0,2,2,3,4,5,6,7]
pcmpeqd %xmm7, %xmm0
pshufd $0xf5, %xmm0, %xmm0     # xmm0 = xmm0[1,1,3,3]
pshuflw $0xe8, %xmm0, %xmm10    # xmm10 = xmm0[0,2,2,3,4,5,6,7]
pand %xmm9, %xmm10
pshufd $0xf5, %xmm8, %xmm8     # xmm8 = xmm8[1,1,3,3]
pshuflw $0xe8, %xmm8, %xmm9     # xmm9 = xmm8[0,2,2,3,4,5,6,7]
por %xmm10, %xmm9
pxor %xmm14, %xmm9
packssdw %xmm9, %xmm9
packsswb %xmm9, %xmm9
pextrw $0x4, %xmm9, %ecx
testb $0x1, %cl
je 0x3a886a
movd %xmm6, %ecx
movb %cl, 0x9(%r13,%r11)
pand %xmm1, %xmm0
por %xmm8, %xmm0
packssdw %xmm0, %xmm0
pxor %xmm14, %xmm0
packssdw %xmm0, %xmm0
packsswb %xmm0, %xmm0
pextrw $0x4, %xmm0, %ecx
shrl $0x8, %ecx
testb $0x1, %cl
je 0x3a889b
pextrw $0x2, %xmm6, %ecx
movb %cl, 0xa(%r13,%r11)
movdqa %xmm15, %xmm1
por 0x281328(%rip), %xmm1   # 0x629bd0
pxor %xmm13, %xmm1
movdqa %xmm1, %xmm8
pcmpgtd %xmm7, %xmm8
pshufd $0xa0, %xmm8, %xmm0     # xmm0 = xmm8[0,0,2,2]
pcmpeqd %xmm7, %xmm1
pshufd $0xf5, %xmm1, %xmm1     # xmm1 = xmm1[1,1,3,3]
movdqa %xmm1, %xmm9
pand %xmm0, %xmm9
pshufd $0xf5, %xmm8, %xmm8     # xmm8 = xmm8[1,1,3,3]
por %xmm8, %xmm9
packssdw %xmm9, %xmm9
pxor %xmm14, %xmm9
packssdw %xmm9, %xmm9
packsswb %xmm9, %xmm9
pextrw $0x5, %xmm9, %ecx
testb $0x1, %cl
je 0x3a8904
pextrw $0x4, %xmm6, %ecx
movb %cl, 0xb(%r13,%r11)
pshufhw $0x84, %xmm0, %xmm0     # xmm0 = xmm0[0,1,2,3,4,5,4,6]
pshufhw $0x84, %xmm1, %xmm1     # xmm1 = xmm1[0,1,2,3,4,5,4,6]
pand %xmm0, %xmm1
pshufhw $0x84, %xmm8, %xmm0     # xmm0 = xmm8[0,1,2,3,4,5,4,6]
por %xmm1, %xmm0
pxor %xmm14, %xmm0
packssdw %xmm0, %xmm0
packsswb %xmm0, %xmm0
pextrw $0x5, %xmm0, %ecx
shrl $0x8, %ecx
testb $0x1, %cl
je 0x3a8940
pextrw $0x6, %xmm6, %ecx
movb %cl, 0xc(%r13,%r11)
movdqa %xmm15, %xmm0
por 0x281273(%rip), %xmm0   # 0x629bc0
por 0x2812aa(%rip), %xmm11  # 0x629c00
pshufd $0xf5, %xmm11, %xmm1    # xmm1 = xmm11[1,1,3,3]
pmuludq %xmm5, %xmm11
pshufd $0xe8, %xmm11, %xmm6    # xmm6 = xmm11[0,2,2,3]
pmuludq %xmm4, %xmm1
pshufd $0xe8, %xmm1, %xmm1     # xmm1 = xmm1[0,2,2,3]
punpckldq %xmm1, %xmm6    # xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1]
movdqa 0x20(%rsp), %xmm1
psubd %xmm6, %xmm1
movdqa %xmm1, %xmm4
pcmpgtd %xmm12, %xmm4
pand %xmm4, %xmm1
pandn %xmm12, %xmm4
por %xmm1, %xmm4
pxor %xmm13, %xmm0
movdqa %xmm0, %xmm6
pcmpgtd %xmm7, %xmm6
pshufd $0xa0, %xmm6, %xmm1     # xmm1 = xmm6[0,0,2,2]
pshuflw $0xe8, %xmm1, %xmm8     # xmm8 = xmm1[0,2,2,3,4,5,6,7]
pcmpeqd %xmm7, %xmm0
pshufd $0xf5, %xmm0, %xmm0     # xmm0 = xmm0[1,1,3,3]
pshuflw $0xe8, %xmm0, %xmm9     # xmm9 = xmm0[0,2,2,3,4,5,6,7]
pand %xmm8, %xmm9
pshufd $0xf5, %xmm6, %xmm6     # xmm6 = xmm6[1,1,3,3]
pshuflw $0xe8, %xmm6, %xmm8     # xmm8 = xmm6[0,2,2,3,4,5,6,7]
por %xmm9, %xmm8
pxor %xmm14, %xmm8
packssdw %xmm8, %xmm8
packsswb %xmm8, %xmm8
pextrw $0x6, %xmm8, %ecx
testb $0x1, %cl
je 0x3a89f3
movd %xmm4, %ecx
movb %cl, 0xd(%r13,%r11)
pand %xmm1, %xmm0
por %xmm6, %xmm0
packssdw %xmm0, %xmm0
pxor %xmm14, %xmm0
packssdw %xmm0, %xmm0
packsswb %xmm0, %xmm0
pextrw $0x6, %xmm0, %ecx
shrl $0x8, %ecx
testb $0x1, %cl
je 0x3a8a23
pextrw $0x2, %xmm4, %ecx
movb %cl, 0xe(%r13,%r11)
por 0x281184(%rip), %xmm15  # 0x629bb0
pxor %xmm13, %xmm15
movdqa %xmm15, %xmm6
pcmpgtd %xmm7, %xmm6
pshufd $0xa0, %xmm6, %xmm0     # xmm0 = xmm6[0,0,2,2]
pcmpeqd %xmm7, %xmm15
pshufd $0xf5, %xmm15, %xmm1    # xmm1 = xmm15[1,1,3,3]
movdqa %xmm1, %xmm7
pand %xmm0, %xmm7
pshufd $0xf5, %xmm6, %xmm6     # xmm6 = xmm6[1,1,3,3]
por %xmm6, %xmm7
packssdw %xmm7, %xmm7
pxor %xmm14, %xmm7
packssdw %xmm7, %xmm7
packsswb %xmm7, %xmm7
pextrw $0x7, %xmm7, %ecx
testb $0x1, %cl
je 0x3a8a80
pextrw $0x4, %xmm4, %ecx
movb %cl, 0xf(%r13,%r11)
pshufhw $0x84, %xmm0, %xmm0     # xmm0 = xmm0[0,1,2,3,4,5,4,6]
pshufhw $0x84, %xmm1, %xmm1     # xmm1 = xmm1[0,1,2,3,4,5,4,6]
pand %xmm0, %xmm1
pshufhw $0x84, %xmm6, %xmm0     # xmm0 = xmm6[0,1,2,3,4,5,4,6]
por %xmm1, %xmm0
pxor %xmm14, %xmm0
packssdw %xmm0, %xmm0
packsswb %xmm0, %xmm0
pextrw $0x7, %xmm0, %ecx
shrl $0x8, %ecx
testb $0x1, %cl
je 0x3a8abb
pextrw $0x6, %xmm4, %ecx
movb %cl, 0x10(%r13,%r11)
addq $0x10, %r11
subl %r8d, %edi
addl %r8d, %r10d
cmpq %r11, %rsi
jne 0x3a8465
pxor %xmm0, %xmm0
psubsb %xmm2, %xmm0
movq 0x8(%rsp), %rdx
leal -0x1(%rdx), %ecx
shlq $0x4, %rcx
movq %rax, %rdi
addq %rcx, %rdi
movl %edx, %r8d
movdqa %xmm0, (%rdi)
psubsb %xmm3, %xmm0
addq $-0x10, %rdi
decl %r8d
jg 0x3a8aeb
movq %rbx, %rdi
addq %rcx, %rdi
movq 0x8(%rsp), %rcx
movq %rcx, %r8
shlq $0x4, %r8
xorl %r9d, %r9d
movdqa 0x281106(%rip), %xmm9   # 0x629c20
movl %ecx, %r10d
movdqa 0x282d8a(%rip), %xmm15  # 0x62b8b0
movdqa 0x221651(%rip), %xmm12  # 0x5ca180
movdqa 0x221668(%rip), %xmm13  # 0x5ca1a0
xorl %r11d, %r11d
movdqa 0x30(%rsp), %xmm6
movdqa 0x70(%rsp), %xmm1
movq 0xa0(%rsp), %rsi
movdqa (%rdi), %xmm0
pslldq $0x1, %xmm0             # xmm0 = zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movzbl (%r13,%r11), %ecx
movd %ecx, %xmm7
movdqa %xmm9, %xmm4
pandn %xmm7, %xmm4
por %xmm0, %xmm4
movq 0x50(%rsp), %rcx
movq 0x10(%rcx), %rcx
movq 0x58(%rsp), %rdx
movzbl (%rdx,%r11), %edx
movslq (%rcx,%rdx,4), %r15
imulq %r10, %r15
shlq $0x4, %r15
addq 0xa8(%rsp), %r15
movdqa %xmm15, %xmm10
movdqa 0x30(%rsp), %xmm15
movdqa %xmm15, %xmm14
psubsb (%rax), %xmm14
xorl %ecx, %ecx
movdqa 0x221609(%rip), %xmm11  # 0x5ca1c0
movdqa (%rbx,%rcx), %xmm8
movdqa (%r12,%rcx), %xmm5
movdqa %xmm8, %xmm0
psubsb %xmm2, %xmm0
psubsb %xmm3, %xmm5
movdqa %xmm0, %xmm7
pcmpgtb %xmm5, %xmm7
movdqa %xmm7, %xmm9
pand %xmm10, %xmm9
pxor %xmm11, %xmm9
movq 0x10(%r14), %rdx
movq (%rdx), %rdx
addq %r9, %rdx
paddsb (%rax,%rcx), %xmm14
paddsb (%r15,%rcx), %xmm4
movdqa %xmm9, (%rcx,%rdx)
pand %xmm7, %xmm0
pandn %xmm5, %xmm7
por %xmm0, %xmm7
movdqa %xmm1, %xmm0
pcmpgtb %xmm7, %xmm0
movdqa %xmm15, %xmm5
pcmpgtb %xmm14, %xmm15
pand %xmm15, %xmm5
pandn %xmm14, %xmm15
movdqa %xmm7, %xmm14
movdqa %xmm7, %xmm9
movdqa %xmm7, (%r12,%rcx)
pand %xmm0, %xmm7
pandn %xmm1, %xmm0
movdqa %xmm0, %xmm1
por %xmm7, %xmm1
por %xmm5, %xmm15
pcmpgtb %xmm4, %xmm14
pand %xmm14, %xmm9
pandn %xmm4, %xmm14
por %xmm9, %xmm14
movdqa %xmm14, (%rbp,%rcx)
movdqa %xmm4, (%rbx,%rcx)
addq $0x10, %rcx
movdqa %xmm8, %xmm4
cmpq %rcx, %r8
jne 0x3a8bb7
pslldq $0x1, %xmm14            # xmm14 = zero,xmm14[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
movzbl 0x1(%r13,%r11), %ecx
incq %r11
movd %ecx, %xmm0
movdqa 0x280f82(%rip), %xmm9   # 0x629c20
movdqa %xmm9, %xmm7
pandn %xmm0, %xmm7
por %xmm14, %xmm7
movdqa (%rax), %xmm0
paddsb %xmm7, %xmm0
movdqa %xmm15, %xmm4
pcmpgtb %xmm0, %xmm4
pand %xmm4, %xmm15
pandn %xmm0, %xmm4
por %xmm15, %xmm4
movl $0xe, %ecx
movdqa 0x80(%rsp), %xmm8
movdqa %xmm4, %xmm0
movdqa %xmm4, %xmm5
pslldq $0x1, %xmm4             # xmm4 = zero,xmm4[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
paddsb %xmm8, %xmm4
pcmpgtb %xmm4, %xmm0
pand %xmm0, %xmm5
pandn %xmm4, %xmm0
movdqa %xmm0, %xmm4
por %xmm5, %xmm4
decl %ecx
jne 0x3a8cda
pslldq $0x1, %xmm4             # xmm4 = zero,xmm4[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
paddsb 0x90(%rsp), %xmm4
movdqa %xmm4, %xmm0
pcmpgtb %xmm7, %xmm0
movdqa %xmm4, %xmm5
pand %xmm0, %xmm5
pandn %xmm7, %xmm0
por %xmm5, %xmm0
xorl %r15d, %r15d
movdqa %xmm10, %xmm15
movdqa 0x282b85(%rip), %xmm10  # 0x62b8c0
movdqa 0x22149c(%rip), %xmm11  # 0x5ca1e0
movq 0x10(%r14), %rcx
movq (%rcx), %rcx
addq %r9, %rcx
movdqa (%rbp,%r15), %xmm14
psubsb %xmm2, %xmm0
psubsb %xmm3, %xmm4
movdqa %xmm0, %xmm7
pcmpgtb %xmm4, %xmm7
movdqa %xmm7, %xmm5
pandn %xmm4, %xmm5
pand %xmm7, %xmm0
movdqa %xmm0, %xmm4
por %xmm5, %xmm4
pand %xmm10, %xmm7
pxor %xmm11, %xmm7
movdqa %xmm14, %xmm0
pcmpgtb %xmm4, %xmm0
movdqa %xmm0, %xmm5
pandn %xmm4, %xmm5
pand %xmm0, %xmm14
por %xmm5, %xmm14
movdqa (%rbx,%r15), %xmm5
pcmpeqb %xmm14, %xmm5
paddb %xmm12, %xmm0
movdqa %xmm5, %xmm8
pandn %xmm0, %xmm8
pand %xmm13, %xmm5
por %xmm8, %xmm5
por (%r15,%rcx), %xmm7
por %xmm5, %xmm7
movdqa %xmm7, (%r15,%rcx)
movdqa %xmm14, (%rbx,%r15)
movdqa %xmm1, %xmm7
pcmpgtb %xmm14, %xmm7
movdqa %xmm6, %xmm5
pcmpgtb %xmm14, %xmm6
pand %xmm6, %xmm5
pandn %xmm14, %xmm6
movdqa %xmm14, %xmm0
pand %xmm7, %xmm14
pandn %xmm1, %xmm7
por %xmm14, %xmm7
movdqa %xmm7, %xmm1
pcmpgtb %xmm4, %xmm1
movdqa %xmm4, %xmm8
pand %xmm1, %xmm8
pandn %xmm7, %xmm1
por %xmm8, %xmm1
por %xmm5, %xmm6
addq $0x10, %r15
cmpq %r15, %r8
jne 0x3a8d44
addq %r8, %r9
cmpq %rsi, %r11
jne 0x3a8b4f
movl 0x1c(%rsp), %ecx
shlq $0x4, %rcx
movdqa (%rbx,%rcx), %xmm0
cmpl $0xe, 0x4(%rsp)
jg 0x3a8e6e
xorl %ecx, %ecx
movl (%rsp), %esi
movl 0x14(%rsp), %edx
movdqa 0x70(%rsp), %xmm3
pslldq $0x1, %xmm0             # xmm0 = zero,xmm0[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
incl %ecx
cmpl %edx, %ecx
jl 0x3a8e61
jmp 0x3a8e77
movl (%rsp), %esi
movdqa 0x70(%rsp), %xmm3
movdqa 0x30(%rsp), %xmm2
pcmpgtb %xmm1, %xmm2
pcmpgtb %xmm3, %xmm6
por %xmm2, %xmm6
pmovmskb %xmm6, %ecx
testl %ecx, %ecx
je 0x3a8e9e
orb $0x40, 0xc(%r14)
xorl %ecx, %ecx
xorl %esi, %esi
xorl %edx, %edx
jmp 0x3a8eaa
pextrw $0x7, %xmm0, %ecx
shrl $0x8, %ecx
movl 0x18(%rsp), %edx
movsbl %cl, %ecx
movl %ecx, (%r14)
movl %edx, 0x4(%r14)
movl %esi, 0x8(%r14)
movq %rax, %rdi
callq 0x20a60d
movq %rbx, %rdi
callq 0x20a60d
movq %rbp, %rdi
callq 0x20a60d
movq %r13, %rdi
callq 0x20a60d
movq %r12, %rdi
callq 0x20a60d
movq %r14, %r15
jmp 0x3a8f1e
callq 0x1bd56b
jmp 0x3a8f1b
callq 0x1bd545
jmp 0x3a8f1b
callq 0x1bd51f
jmp 0x3a8f1b
callq 0x1bd4f9
jmp 0x3a8f1b
callq 0x1bd4d3
jmp 0x3a8f1b
callq 0x1bd4ad
jmp 0x3a8f1b
callq 0x1bd487
jmp 0x3a8f1b
callq 0x1bd461
xorl %r15d, %r15d
movq %r15, %rax
addq $0xf8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop