/** * @file * * @author jeff.daily@pnnl.gov * * Copyright (c) 2015 Battelle Memorial Institute. */ #include "config.h" #include %(HEADER)s #include "parasail.h" #include "parasail/memory.h" #include "parasail/internal_%(ISA)s.h" #define NEG_INF %(NEG_INF)s %(FIXES)s #ifdef PARASAIL_TABLE static inline void arr_store_si%(BITS)s( int *array, %(VTYPE)s vWscore, %(INDEX)s i, %(INDEX)s s1Len, %(INDEX)s j, %(INDEX)s s2Len) { %(PRINTER)s } #endif #ifdef PARASAIL_ROWCOL static inline void arr_store_rowcol( int *row, int *col, %(VTYPE)s vWscore, %(INDEX)s i, %(INDEX)s s1Len, %(INDEX)s j, %(INDEX)s s2Len) { %(PRINTER_ROWCOL)s } #endif #ifdef PARASAIL_TABLE #define FNAME %(NAME_TABLE)s #else #ifdef PARASAIL_ROWCOL #define FNAME %(NAME_ROWCOL)s #else #define FNAME %(NAME)s #endif #endif parasail_result_t* FNAME( const char * const restrict _s1, const int s1Len, const char * const restrict _s2, const int s2Len, const int open, const int gap, const parasail_matrix_t *matrix) { const %(INDEX)s N = %(LANES)s; /* number of values in vector */ const %(INDEX)s PAD = N-1; const %(INDEX)s PAD2 = PAD*2; const %(INDEX)s s1Len_PAD = s1Len+PAD; const %(INDEX)s s2Len_PAD = s2Len+PAD; %(INT)s * const restrict s1 = parasail_memalign_%(INT)s(%(ALIGNMENT)s, s1Len+PAD); %(INT)s * const restrict s2B= parasail_memalign_%(INT)s(%(ALIGNMENT)s, s2Len+PAD2); %(INT)s * const restrict _tbl_pr = parasail_memalign_%(INT)s(%(ALIGNMENT)s, s2Len+PAD2); %(INT)s * const restrict _del_pr = parasail_memalign_%(INT)s(%(ALIGNMENT)s, s2Len+PAD2); %(INT)s * const restrict s2 = s2B+PAD; /* will allow later for negative indices */ %(INT)s * const restrict tbl_pr = _tbl_pr+PAD; %(INT)s * const restrict del_pr = _del_pr+PAD; #ifdef PARASAIL_TABLE parasail_result_t *result = parasail_result_new_table1(s1Len, s2Len); #else #ifdef PARASAIL_ROWCOL parasail_result_t *result = parasail_result_new_rowcol1(s1Len, s2Len); #else parasail_result_t *result = parasail_result_new(); #endif #endif %(INDEX)s i = 0; %(INDEX)s j = 0; %(INDEX)s end_query = 0; %(INDEX)s end_ref = 0; %(INT)s score = NEG_INF; %(VTYPE)s vNegInf = %(VSET1)s(NEG_INF); %(VTYPE)s vNegInf0 = %(VRSHIFT)s(vNegInf, %(BYTES)s); /* shift in a 0 */ %(VTYPE)s vOpen = %(VSET1)s(open); %(VTYPE)s vGap = %(VSET1)s(gap); %(VTYPE)s vOne16 = %(VSET1x16)s(1); %(VTYPE)s vN16 = %(VSET1x16)s(N); %(VTYPE)s vNegOne16 = %(VSET1x16)s(-1); %(VTYPE)s vILo16 = %(VSETx16)s(%(DIAG_ILO)s); %(VTYPE)s vIHi16 = %(VSETx16)s(%(DIAG_IHI)s); %(VTYPE)s vJresetLo16 = %(VSETx16)s(%(DIAG_JLO)s); %(VTYPE)s vJresetHi16 = %(VSETx16)s(%(DIAG_JHI)s); %(VTYPE)s vMaxScore = vNegInf; %(VTYPE)s vEndILo = vNegInf; %(VTYPE)s vEndIHi = vNegInf; %(VTYPE)s vEndJLo = vNegInf; %(VTYPE)s vEndJHi = vNegInf; %(VTYPE)s vILimit16 = %(VSET1x16)s(s1Len); %(VTYPE)s vILimit116 = %(VSUBx16)s(vILimit16, vOne16); %(VTYPE)s vJLimit16 = %(VSET1x16)s(s2Len); %(VTYPE)s vJLimit116 = %(VSUBx16)s(vJLimit16, vOne16); %(SATURATION_CHECK_INIT)s /* convert _s1 from char to int in range 0-23 */ for (i=0; imapper[(unsigned char)_s1[i]]; } /* pad back of s1 with dummy values */ for (i=s1Len; imapper[(unsigned char)_s2[j]]; } /* pad front of s2 with dummy values */ for (j=-PAD; j<0; ++j) { s2[j] = 0; /* point to first matrix row because we don't care */ } /* pad back of s2 with dummy values */ for (j=s2Len; jscore_table, vWscore, i, s1Len, j, s2Len); #endif #ifdef PARASAIL_ROWCOL arr_store_rowcol(result->score_row, result->score_col, vWscore, i, s1Len, j, s2Len); #endif tbl_pr[j-%(LAST_POS)s] = (%(INT)s)%(VEXTRACT)s(vWscore,0); del_pr[j-%(LAST_POS)s] = (%(INT)s)%(VEXTRACT)s(vDel,0); /* as minor diagonal vector passes across the i or j limit * boundary, extract the last value of the column or row */ { %(VTYPE)s vJeqLimit1 = %(VPACKS)s( %(VCMPEQx16)s(vJLo16, vJLimit116), %(VCMPEQx16)s(vJHi16, vJLimit116)); %(VTYPE)s vJgtNegOne = %(VPACKS)s( %(VCMPGTx16)s(vJLo16, vNegOne16), %(VCMPGTx16)s(vJHi16, vNegOne16)); %(VTYPE)s vJltLimit = %(VPACKS)s( %(VCMPLTx16)s(vJLo16, vJLimit16), %(VCMPLTx16)s(vJHi16, vJLimit16)); %(VTYPE)s cond_j = %(VAND)s(vIltLimit, vJeqLimit1); %(VTYPE)s cond_i = %(VAND)s(vIeqLimit1, %(VAND)s(vJgtNegOne, vJltLimit)); %(VTYPE)s cond_ij = %(VOR)s(cond_i, cond_j); %(VTYPE)s cond_eq = %(VCMPEQ)s(vWscore, vMaxScore); %(VTYPE)s cond_max = %(VCMPGT)s(vWscore, vMaxScore); %(VTYPE)s cond_all = %(VAND)s(cond_max, cond_ij); %(VTYPE)s cond_Jlt = %(VPACKS)s( %(VCMPLTx16)s(vJLo16, vEndJLo), %(VCMPLTx16)s(vJHi16, vEndJHi)); %(VTYPE)s cond_lo = %(VUNPACKLO)s(cond_all, cond_all); %(VTYPE)s cond_hi = %(VUNPACKHI)s(cond_all, cond_all); vMaxScore = %(VBLEND)s(vMaxScore, vWscore, cond_all); vEndILo = %(VBLEND)s(vEndILo, vILo16, cond_lo); vEndIHi = %(VBLEND)s(vEndIHi, vIHi16, cond_hi); vEndJLo = %(VBLEND)s(vEndJLo, vJLo16, cond_lo); vEndJHi = %(VBLEND)s(vEndJHi, vJHi16, cond_hi); cond_all = %(VAND)s(cond_Jlt, cond_eq); cond_all = %(VAND)s(cond_all, cond_ij); cond_lo = %(VUNPACKLO)s(cond_all, cond_all); cond_hi = %(VUNPACKHI)s(cond_all, cond_all); vEndILo = %(VBLEND)s(vEndILo, vILo16, cond_lo); vEndIHi = %(VBLEND)s(vEndIHi, vIHi16, cond_hi); vEndJLo = %(VBLEND)s(vEndJLo, vJLo16, cond_lo); vEndJHi = %(VBLEND)s(vEndJHi, vJHi16, cond_hi); } vJLo16 = %(VADDx16)s(vJLo16, vOne16); vJHi16 = %(VADDx16)s(vJHi16, vOne16); } vILo16 = %(VADDx16)s(vILo16, vN16); vIHi16 = %(VADDx16)s(vIHi16, vN16); } /* alignment ending position */ { %(INT)s *t = (%(INT)s*)&vMaxScore; int16_t *ilo = (int16_t*)&vEndILo; int16_t *jlo = (int16_t*)&vEndJLo; int16_t *ihi = (int16_t*)&vEndIHi; int16_t *jhi = (int16_t*)&vEndJHi; %(INDEX)s k; for (k=0; k score) { score = *t; end_query = *ilo; end_ref = *jlo; } else if (*t == score) { if (*jlo < end_ref) { end_query = *ilo; end_ref = *jlo; } else if (*jlo == end_ref && *ilo < end_query) { end_query = *ilo; end_ref = *jlo; } } } for (k=N/2; k score) { score = *t; end_query = *ihi; end_ref = *jhi; } else if (*t == score) { if (*jhi < end_ref) { end_query = *ihi; end_ref = *jhi; } else if (*jhi == end_ref && *ihi < end_query) { end_query = *ihi; end_ref = *jhi; } } } } %(SATURATION_CHECK_FINAL)s result->score = score; result->end_query = end_query; result->end_ref = end_ref; parasail_free(_del_pr); parasail_free(_tbl_pr); parasail_free(s2B); parasail_free(s1); return result; }