mirror of
https://github.com/lh3/minimap2.git
synced 2026-10-05 03:48:12 +08:00
r897: avx2 working on test/MT-*.fa
srli/slli behaves differently between SSE2 and AVX2, which is very annoying.
This commit is contained in:
+23
-8
@@ -31,6 +31,21 @@
|
|||||||
#define SIMD_WIDTH (1<<SIMD_SHIFT)
|
#define SIMD_WIDTH (1<<SIMD_SHIFT)
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__AVX2__)
|
||||||
|
static inline __m256i simd_slli_1(__m256i x)
|
||||||
|
{
|
||||||
|
return _mm256_insert_epi8(_mm256_slli_si256(x, 1), _mm256_extract_epi8(x, 15), 16);
|
||||||
|
}
|
||||||
|
static inline __m256i simd_srli_last(__m256i x)
|
||||||
|
{
|
||||||
|
return _mm256_insert_epi8(_mm256_setzero_si256(), _mm256_extract_epi8(x, 31), 0);
|
||||||
|
}
|
||||||
|
#elif defined(__SSE2__)
|
||||||
|
static inline __m128i simd_slli_1(__m128i x) { return _mm_slli_si128(x, 1); }
|
||||||
|
static inline __m128i simd_srli_last(__m128i x) { return _mm_srli_si128(x, 15); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef KSW_CPU_DISPATCH
|
#ifdef KSW_CPU_DISPATCH
|
||||||
#if defined(__AVX2__)
|
#if defined(__AVX2__)
|
||||||
void ksw_extd2_avx2(void *km, int qlen, const uint8_t *query, int tlen, const uint8_t *target, int8_t m, const int8_t *mat,
|
void ksw_extd2_avx2(void *km, int qlen, const uint8_t *query, int tlen, const uint8_t *target, int8_t m, const int8_t *mat,
|
||||||
@@ -50,26 +65,26 @@ void ksw_extd2_sse(void *km, int qlen, const uint8_t *query, int tlen, const uin
|
|||||||
#define __dp_code_block1 \
|
#define __dp_code_block1 \
|
||||||
z = simd_funcw(load)(&s[t]); \
|
z = simd_funcw(load)(&s[t]); \
|
||||||
xt1 = simd_funcw(load)(&x[t]); /* xt1 <- x[r-1][t..t+15] */ \
|
xt1 = simd_funcw(load)(&x[t]); /* xt1 <- x[r-1][t..t+15] */ \
|
||||||
tmp = simd_funcw(srli)(xt1, SIMD_WIDTH-1); /* tmp <- x[r-1][t+15] */ \
|
tmp = simd_srli_last(xt1); /* tmp <- x[r-1][t+15] */ \
|
||||||
xt1 = simd_funcw(or)(simd_funcw(slli)(xt1, 1), x1_); /* xt1 <- x[r-1][t-1..t+14] */ \
|
xt1 = simd_funcw(or)(simd_slli_1(xt1), x1_); /* xt1 <- x[r-1][t-1..t+14] */ \
|
||||||
x1_ = tmp; \
|
x1_ = tmp; \
|
||||||
vt1 = simd_funcw(load)(&v[t]); /* vt1 <- v[r-1][t..t+15] */ \
|
vt1 = simd_funcw(load)(&v[t]); /* vt1 <- v[r-1][t..t+15] */ \
|
||||||
tmp = simd_funcw(srli)(vt1, SIMD_WIDTH-1); /* tmp <- v[r-1][t+15] */ \
|
tmp = simd_srli_last(vt1); /* tmp <- v[r-1][t+15] */ \
|
||||||
vt1 = simd_funcw(or)(simd_funcw(slli)(vt1, 1), v1_); /* vt1 <- v[r-1][t-1..t+14] */ \
|
vt1 = simd_funcw(or)(simd_slli_1(vt1), v1_); /* vt1 <- v[r-1][t-1..t+14] */ \
|
||||||
v1_ = tmp; \
|
v1_ = tmp; \
|
||||||
a = simd_func(add_epi8)(xt1, vt1); /* a <- x[r-1][t-1..t+14] + v[r-1][t-1..t+14] */ \
|
a = simd_func(add_epi8)(xt1, vt1); /* a <- x[r-1][t-1..t+14] + v[r-1][t-1..t+14] */ \
|
||||||
ut = simd_funcw(load)(&u[t]); /* ut <- u[t..t+15] */ \
|
ut = simd_funcw(load)(&u[t]); /* ut <- u[t..t+15] */ \
|
||||||
b = simd_func(add_epi8)(simd_funcw(load)(&y[t]), ut); /* b <- y[r-1][t..t+15] + u[r-1][t..t+15] */ \
|
b = simd_func(add_epi8)(simd_funcw(load)(&y[t]), ut); /* b <- y[r-1][t..t+15] + u[r-1][t..t+15] */ \
|
||||||
x2t1= simd_funcw(load)(&x2[t]); \
|
x2t1= simd_funcw(load)(&x2[t]); \
|
||||||
tmp = simd_funcw(srli)(x2t1, SIMD_WIDTH-1); \
|
tmp = simd_srli_last(x2t1); \
|
||||||
x2t1= simd_funcw(or)(simd_funcw(slli)(x2t1, 1), x21_); \
|
x2t1= simd_funcw(or)(simd_slli_1(x2t1), x21_); \
|
||||||
x21_= tmp; \
|
x21_= tmp; \
|
||||||
a2= simd_func(add_epi8)(x2t1, vt1); \
|
a2= simd_func(add_epi8)(x2t1, vt1); \
|
||||||
b2= simd_func(add_epi8)(simd_funcw(load)(&y2[t]), ut);
|
b2= simd_func(add_epi8)(simd_funcw(load)(&y2[t]), ut);
|
||||||
|
|
||||||
#define __dp_code_block2 \
|
#define __dp_code_block2 \
|
||||||
simd_funcw(store)(&u[t], simd_func(sub_epi8)(z, vt1)); /* u[r][t..t+15] <- z - v[r-1][t-1..t+14] */ \
|
simd_funcw(store)(&u[t], simd_func(sub_epi8)(z, vt1));/* u[r][t..t+15] <- z - v[r-1][t-1..t+14] */ \
|
||||||
simd_funcw(store)(&v[t], simd_func(sub_epi8)(z, ut)); /* v[r][t..t+15] <- z - u[r-1][t..t+15] */ \
|
simd_funcw(store)(&v[t], simd_func(sub_epi8)(z, ut)); /* v[r][t..t+15] <- z - u[r-1][t..t+15] */ \
|
||||||
tmp = simd_func(sub_epi8)(z, q_); \
|
tmp = simd_func(sub_epi8)(z, q_); \
|
||||||
a = simd_func(sub_epi8)(a, tmp); \
|
a = simd_func(sub_epi8)(a, tmp); \
|
||||||
b = simd_func(sub_epi8)(b, tmp); \
|
b = simd_func(sub_epi8)(b, tmp); \
|
||||||
|
|||||||
Reference in New Issue
Block a user