Commit 2ad64c9f authored by jinboson's avatar jinboson Committed by GitHub

x86 avx2: add loongarch lasx optimized implementations (#1241)

parent 5cae2261
...@@ -553,7 +553,8 @@ ...@@ -553,7 +553,8 @@
defined(SIMDE_WASM_SIMD128_NATIVE) || \ defined(SIMDE_WASM_SIMD128_NATIVE) || \
defined(SIMDE_POWER_ALTIVEC_P5_NATIVE) || \ defined(SIMDE_POWER_ALTIVEC_P5_NATIVE) || \
defined(SIMDE_ZARCH_ZVECTOR_13_NATIVE) || \ defined(SIMDE_ZARCH_ZVECTOR_13_NATIVE) || \
defined(SIMDE_MIPS_MSA_NATIVE) defined(SIMDE_MIPS_MSA_NATIVE) || \
defined(SIMDE_LOONGARCH_LSX_NATIVE)
#define SIMDE_NATURAL_VECTOR_SIZE (128) #define SIMDE_NATURAL_VECTOR_SIZE (128)
#elif defined(SIMDE_X86_SSE_NATIVE) #elif defined(SIMDE_X86_SSE_NATIVE)
#define SIMDE_NATURAL_FLOAT_VECTOR_SIZE (128) #define SIMDE_NATURAL_FLOAT_VECTOR_SIZE (128)
......
...@@ -41,6 +41,8 @@ simde__m256i ...@@ -41,6 +41,8 @@ simde__m256i
simde_mm256_abs_epi8 (simde__m256i a) { simde_mm256_abs_epi8 (simde__m256i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_abs_epi8(a); return _mm256_abs_epi8(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvabsd_b(a, __lasx_xvreplgr2vr_b(0));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -69,6 +71,8 @@ simde__m256i ...@@ -69,6 +71,8 @@ simde__m256i
simde_mm256_abs_epi16 (simde__m256i a) { simde_mm256_abs_epi16 (simde__m256i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_abs_epi16(a); return _mm256_abs_epi16(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvabsd_h(a, __lasx_xvreplgr2vr_h(0));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -97,6 +101,8 @@ simde__m256i ...@@ -97,6 +101,8 @@ simde__m256i
simde_mm256_abs_epi32(simde__m256i a) { simde_mm256_abs_epi32(simde__m256i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_abs_epi32(a); return _mm256_abs_epi32(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvabsd_w(a, __lasx_xvreplgr2vr_w(0));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -125,6 +131,8 @@ simde__m256i ...@@ -125,6 +131,8 @@ simde__m256i
simde_mm256_add_epi8 (simde__m256i a, simde__m256i b) { simde_mm256_add_epi8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_add_epi8(a, b); return _mm256_add_epi8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvadd_b(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -156,6 +164,8 @@ simde__m256i ...@@ -156,6 +164,8 @@ simde__m256i
simde_mm256_add_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_add_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_add_epi16(a, b); return _mm256_add_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvadd_h(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -201,6 +211,8 @@ simde__m256i ...@@ -201,6 +211,8 @@ simde__m256i
simde_mm256_add_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_add_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_add_epi32(a, b); return _mm256_add_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvadd_w(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -246,6 +258,8 @@ simde__m256i ...@@ -246,6 +258,8 @@ simde__m256i
simde_mm256_add_epi64 (simde__m256i a, simde__m256i b) { simde_mm256_add_epi64 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_add_epi64(a, b); return _mm256_add_epi64(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvadd_d(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -318,6 +332,8 @@ simde__m256i ...@@ -318,6 +332,8 @@ simde__m256i
simde_mm256_and_si256 (simde__m256i a, simde__m256i b) { simde_mm256_and_si256 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_and_si256(a, b); return _mm256_and_si256(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvand_v(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -349,6 +365,8 @@ simde__m256i ...@@ -349,6 +365,8 @@ simde__m256i
simde_mm256_andnot_si256 (simde__m256i a, simde__m256i b) { simde_mm256_andnot_si256 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_andnot_si256(a, b); return _mm256_andnot_si256(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvandn_v(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -378,6 +396,8 @@ simde__m256i ...@@ -378,6 +396,8 @@ simde__m256i
simde_mm256_adds_epi8 (simde__m256i a, simde__m256i b) { simde_mm256_adds_epi8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_adds_epi8(a, b); return _mm256_adds_epi8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsadd_b(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -407,6 +427,8 @@ simde__m256i ...@@ -407,6 +427,8 @@ simde__m256i
simde_mm256_adds_epi16(simde__m256i a, simde__m256i b) { simde_mm256_adds_epi16(simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_adds_epi16(a, b); return _mm256_adds_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsadd_h(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -450,6 +472,8 @@ simde__m256i ...@@ -450,6 +472,8 @@ simde__m256i
simde_mm256_adds_epu8 (simde__m256i a, simde__m256i b) { simde_mm256_adds_epu8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_adds_epu8(a, b); return _mm256_adds_epu8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsadd_bu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -479,6 +503,8 @@ simde__m256i ...@@ -479,6 +503,8 @@ simde__m256i
simde_mm256_adds_epu16(simde__m256i a, simde__m256i b) { simde_mm256_adds_epu16(simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_adds_epu16(a, b); return _mm256_adds_epu16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsadd_hu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -508,6 +534,8 @@ simde__m256i ...@@ -508,6 +534,8 @@ simde__m256i
simde_mm256_avg_epu8 (simde__m256i a, simde__m256i b) { simde_mm256_avg_epu8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_avg_epu8(a, b); return _mm256_avg_epu8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvavgr_bu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -532,6 +560,8 @@ simde__m256i ...@@ -532,6 +560,8 @@ simde__m256i
simde_mm256_avg_epu16 (simde__m256i a, simde__m256i b) { simde_mm256_avg_epu16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_avg_epu16(a, b); return _mm256_avg_epu16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvavgr_hu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -569,6 +599,9 @@ simde_mm_blend_epi32(simde__m128i a, simde__m128i b, const int imm8) ...@@ -569,6 +599,9 @@ simde_mm_blend_epi32(simde__m128i a, simde__m128i b, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm_blend_epi32(a, b, imm8) _mm_blend_epi32(a, b, imm8) # define simde_mm_blend_epi32(a, b, imm8) _mm_blend_epi32(a, b, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm_blend_epi32(a, b, imm8) __lsx_vbitsel_v(a, b, \
simde_mm_set_epi32(-((imm8 >> 3) & 1), -((imm8 >> 2) & 1), -((imm8 >> 1)& 1), -(imm8 & 1)))
#elif SIMDE_NATURAL_FLOAT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_FLOAT_VECTOR_SIZE_LE(128)
# define simde_mm_blend_epi32(a, b, imm8) \ # define simde_mm_blend_epi32(a, b, imm8) \
simde_mm_castps_si128(simde_mm_blend_ps(simde_mm_castsi128_ps(a), simde_mm_castsi128_ps(b), (imm8))) simde_mm_castps_si128(simde_mm_blend_ps(simde_mm_castsi128_ps(a), simde_mm_castsi128_ps(b), (imm8)))
...@@ -596,8 +629,12 @@ simde_mm256_blend_epi16(simde__m256i a, simde__m256i b, const int imm8) ...@@ -596,8 +629,12 @@ simde_mm256_blend_epi16(simde__m256i a, simde__m256i b, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) && defined(SIMDE_BUG_CLANG_REV_234560) #if defined(SIMDE_X86_AVX2_NATIVE) && defined(SIMDE_BUG_CLANG_REV_234560)
# define simde_mm256_blend_epi16(a, b, imm8) _mm256_castpd_si256(_mm256_blend_epi16(a, b, imm8)) # define simde_mm256_blend_epi16(a, b, imm8) _mm256_castpd_si256(_mm256_blend_epi16(a, b, imm8))
#elif defined(SIMDE_X86_AVX2_NATIVE) #elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_blend_epi16(a, b, imm8) _mm256_blend_epi16(a, b, imm8) # undef sr
# define sr(i, j) -((i >> j) & 1)
# define simde_mm256_blend_epi16(a, b, imm8) __lasx_xvbitsel_v(a, b, \
simde_mm256_set_epi16(sr(imm8, 7), sr(imm8, 6), sr(imm8, 5), sr(imm8, 4), sr(imm8, 3), sr(imm8, 2), sr(imm8, 1), sr(imm8, 0), \
sr(imm8, 7), sr(imm8, 6), sr(imm8, 5), sr(imm8, 4), sr(imm8, 3), sr(imm8, 2), sr(imm8, 1), sr(imm8, 0)))
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_blend_epi16(a, b, imm8) \ # define simde_mm256_blend_epi16(a, b, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -628,6 +665,11 @@ simde_mm256_blend_epi32(simde__m256i a, simde__m256i b, const int imm8) ...@@ -628,6 +665,11 @@ simde_mm256_blend_epi32(simde__m256i a, simde__m256i b, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_blend_epi32(a, b, imm8) _mm256_blend_epi32(a, b, imm8) # define simde_mm256_blend_epi32(a, b, imm8) _mm256_blend_epi32(a, b, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# undef sr
# define sr(i, j) -((i >> j) & 1)
# define simde_mm256_blend_epi32(a, b, imm8) __lasx_xvbitsel_v(a, b, \
simde_mm256_set_epi32(sr(imm8, 7), sr(imm8, 6), sr(imm8, 5), sr(imm8, 4), sr(imm8, 3), sr(imm8, 2), sr(imm8, 1), sr(imm8, 0)))
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_blend_epi32(a, b, imm8) \ # define simde_mm256_blend_epi32(a, b, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -645,6 +687,8 @@ simde__m256i ...@@ -645,6 +687,8 @@ simde__m256i
simde_mm256_blendv_epi8(simde__m256i a, simde__m256i b, simde__m256i mask) { simde_mm256_blendv_epi8(simde__m256i a, simde__m256i b, simde__m256i mask) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_blendv_epi8(a, b, mask); return _mm256_blendv_epi8(a, b, mask);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvbitsel_v(a, b, __lasx_xvslti_b(mask, 0));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -682,6 +726,8 @@ simde__m128i ...@@ -682,6 +726,8 @@ simde__m128i
simde_mm_broadcastb_epi8 (simde__m128i a) { simde_mm_broadcastb_epi8 (simde__m128i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm_broadcastb_epi8(a); return _mm_broadcastb_epi8(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lsx_vreplvei_b(a, 0);
#else #else
simde__m128i_private r_; simde__m128i_private r_;
simde__m128i_private a_= simde__m128i_to_private(a); simde__m128i_private a_= simde__m128i_to_private(a);
...@@ -704,6 +750,8 @@ simde__m256i ...@@ -704,6 +750,8 @@ simde__m256i
simde_mm256_broadcastb_epi8 (simde__m128i a) { simde_mm256_broadcastb_epi8 (simde__m128i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_broadcastb_epi8(a); return _mm256_broadcastb_epi8(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvreplgr2vr_b(__lsx_vpickve2gr_b(a, 0));
#else #else
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_= simde__m128i_to_private(a); simde__m128i_private a_= simde__m128i_to_private(a);
...@@ -726,6 +774,8 @@ simde__m128i ...@@ -726,6 +774,8 @@ simde__m128i
simde_mm_broadcastw_epi16 (simde__m128i a) { simde_mm_broadcastw_epi16 (simde__m128i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm_broadcastw_epi16(a); return _mm_broadcastw_epi16(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lsx_vreplvei_h(a, 0);
#else #else
simde__m128i_private r_; simde__m128i_private r_;
simde__m128i_private a_= simde__m128i_to_private(a); simde__m128i_private a_= simde__m128i_to_private(a);
...@@ -748,6 +798,8 @@ simde__m256i ...@@ -748,6 +798,8 @@ simde__m256i
simde_mm256_broadcastw_epi16 (simde__m128i a) { simde_mm256_broadcastw_epi16 (simde__m128i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_broadcastw_epi16(a); return _mm256_broadcastw_epi16(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvreplgr2vr_h(__lsx_vpickve2gr_h(a, 0));
#else #else
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_= simde__m128i_to_private(a); simde__m128i_private a_= simde__m128i_to_private(a);
...@@ -770,6 +822,8 @@ simde__m128i ...@@ -770,6 +822,8 @@ simde__m128i
simde_mm_broadcastd_epi32 (simde__m128i a) { simde_mm_broadcastd_epi32 (simde__m128i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm_broadcastd_epi32(a); return _mm_broadcastd_epi32(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lsx_vreplvei_w(a, 0);
#else #else
simde__m128i_private r_; simde__m128i_private r_;
simde__m128i_private a_= simde__m128i_to_private(a); simde__m128i_private a_= simde__m128i_to_private(a);
...@@ -792,6 +846,8 @@ simde__m256i ...@@ -792,6 +846,8 @@ simde__m256i
simde_mm256_broadcastd_epi32 (simde__m128i a) { simde_mm256_broadcastd_epi32 (simde__m128i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_broadcastd_epi32(a); return _mm256_broadcastd_epi32(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvreplgr2vr_w(__lsx_vpickve2gr_w(a, 0));
#else #else
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_= simde__m128i_to_private(a); simde__m128i_private a_= simde__m128i_to_private(a);
...@@ -814,6 +870,8 @@ simde__m128i ...@@ -814,6 +870,8 @@ simde__m128i
simde_mm_broadcastq_epi64 (simde__m128i a) { simde_mm_broadcastq_epi64 (simde__m128i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm_broadcastq_epi64(a); return _mm_broadcastq_epi64(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lsx_vreplvei_d(a, 0);
#else #else
simde__m128i_private r_; simde__m128i_private r_;
simde__m128i_private a_= simde__m128i_to_private(a); simde__m128i_private a_= simde__m128i_to_private(a);
...@@ -836,6 +894,8 @@ simde__m256i ...@@ -836,6 +894,8 @@ simde__m256i
simde_mm256_broadcastq_epi64 (simde__m128i a) { simde_mm256_broadcastq_epi64 (simde__m128i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_broadcastq_epi64(a); return _mm256_broadcastq_epi64(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvreplgr2vr_d(__lsx_vpickve2gr_d(a, 0));
#else #else
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_= simde__m128i_to_private(a); simde__m128i_private a_= simde__m128i_to_private(a);
...@@ -864,7 +924,9 @@ simde_mm_broadcastss_ps (simde__m128 a) { ...@@ -864,7 +924,9 @@ simde_mm_broadcastss_ps (simde__m128 a) {
simde__m128_private r_; simde__m128_private r_;
simde__m128_private a_= simde__m128_to_private(a); simde__m128_private a_= simde__m128_to_private(a);
#if defined(SIMDE_SHUFFLE_VECTOR_) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.lsx_i64 = __lsx_vreplvei_w(a_.lsx_i64, 0);
#elif defined(SIMDE_SHUFFLE_VECTOR_)
r_.f32 = SIMDE_SHUFFLE_VECTOR_(32, 16, a_.f32, a_.f32, 0, 0, 0, 0); r_.f32 = SIMDE_SHUFFLE_VECTOR_(32, 16, a_.f32, a_.f32, 0, 0, 0, 0);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -893,6 +955,8 @@ simde_mm256_broadcastss_ps (simde__m128 a) { ...@@ -893,6 +955,8 @@ simde_mm256_broadcastss_ps (simde__m128 a) {
#if defined(SIMDE_X86_AVX_NATIVE) #if defined(SIMDE_X86_AVX_NATIVE)
__m128 tmp = _mm_permute_ps(a_.n, 0); __m128 tmp = _mm_permute_ps(a_.n, 0);
r_.n = _mm256_insertf128_ps(_mm256_castps128_ps256(tmp), tmp, 1); r_.n = _mm256_insertf128_ps(_mm256_castps128_ps256(tmp), tmp, 1);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.i256 = __lasx_xvreplgr2vr_w(__lsx_vpickve2gr_w(a_.lsx_i64, 0));
#elif HEDLEY_HAS_BUILTIN(__builtin_shufflevector) #elif HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
r_.f32 = __builtin_shufflevector(a_.f32, a_.f32, 0, 0, 0, 0, 0, 0, 0, 0); r_.f32 = __builtin_shufflevector(a_.f32, a_.f32, 0, 0, 0, 0, 0, 0, 0, 0);
#elif SIMDE_NATURAL_FLOAT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_FLOAT_VECTOR_SIZE_LE(128)
...@@ -931,10 +995,14 @@ simde_mm256_broadcastsd_pd (simde__m128d a) { ...@@ -931,10 +995,14 @@ simde_mm256_broadcastsd_pd (simde__m128d a) {
simde__m256d_private r_; simde__m256d_private r_;
simde__m128d_private a_= simde__m128d_to_private(a); simde__m128d_private a_= simde__m128d_to_private(a);
SIMDE_VECTORIZE #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) { r_.i256 = __lasx_xvreplgr2vr_d(__lsx_vpickve2gr_d(a_.lsx_i64, 0));
r_.f64[i] = a_.f64[0]; #else
} SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.f64) / sizeof(r_.f64[0])) ; i++) {
r_.f64[i] = a_.f64[0];
}
#endif
return simde__m256d_from_private(r_); return simde__m256d_from_private(r_);
#endif #endif
...@@ -954,7 +1022,10 @@ simde_mm256_broadcastsi128_si256 (simde__m128i a) { ...@@ -954,7 +1022,10 @@ simde_mm256_broadcastsi128_si256 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
#if SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.m128i_private[0] = a_;
r_.i256 = __lasx_xvpermi_q(r_.i256, r_.i256, 0x00);
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
r_.m128i_private[0] = a_; r_.m128i_private[0] = a_;
r_.m128i_private[1] = a_; r_.m128i_private[1] = a_;
#else #else
...@@ -1007,6 +1078,8 @@ simde_mm256_bslli_epi128 (simde__m256i a, const int imm8) ...@@ -1007,6 +1078,8 @@ simde_mm256_bslli_epi128 (simde__m256i a, const int imm8)
(!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(4,8,0)) && \ (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(4,8,0)) && \
SIMDE_DETECT_CLANG_VERSION_CHECK(3,7,0) SIMDE_DETECT_CLANG_VERSION_CHECK(3,7,0)
#define simde_mm256_bslli_epi128(a, imm8) _mm256_bslli_epi128(a, imm8) #define simde_mm256_bslli_epi128(a, imm8) _mm256_bslli_epi128(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
#define simde_mm256_bslli_epi128(a, imm8) (imm8 > 15 ? __lasx_xvreplgr2vr_d(0) : __lasx_xvbsll_v(a, imm8))
#endif #endif
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
#undef _mm256_bslli_epi128 #undef _mm256_bslli_epi128
...@@ -1045,6 +1118,8 @@ simde_mm256_bsrli_epi128 (simde__m256i a, const int imm8) ...@@ -1045,6 +1118,8 @@ simde_mm256_bsrli_epi128 (simde__m256i a, const int imm8)
(!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(4,8,0)) && \ (!defined(HEDLEY_GCC_VERSION) || HEDLEY_GCC_VERSION_CHECK(4,8,0)) && \
SIMDE_DETECT_CLANG_VERSION_CHECK(3,7,0) SIMDE_DETECT_CLANG_VERSION_CHECK(3,7,0)
#define simde_mm256_bsrli_epi128(a, imm8) _mm256_bsrli_epi128(a, imm8) #define simde_mm256_bsrli_epi128(a, imm8) _mm256_bsrli_epi128(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
#define simde_mm256_bslli_epi128(a, imm8) (imm8 > 15 ? __lasx_xvreplgr2vr_d(0) : __lasx_xvbsll_v(a, imm8))
#endif #endif
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
#undef _mm256_bsrli_epi128 #undef _mm256_bsrli_epi128
...@@ -1056,6 +1131,8 @@ simde__m256i ...@@ -1056,6 +1131,8 @@ simde__m256i
simde_mm256_cmpeq_epi8 (simde__m256i a, simde__m256i b) { simde_mm256_cmpeq_epi8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_cmpeq_epi8(a, b); return _mm256_cmpeq_epi8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvseq_b(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -1085,6 +1162,8 @@ simde__m256i ...@@ -1085,6 +1162,8 @@ simde__m256i
simde_mm256_cmpeq_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_cmpeq_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_cmpeq_epi16(a, b); return _mm256_cmpeq_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvseq_h(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -1114,6 +1193,8 @@ simde__m256i ...@@ -1114,6 +1193,8 @@ simde__m256i
simde_mm256_cmpeq_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_cmpeq_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_cmpeq_epi32(a, b); return _mm256_cmpeq_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvseq_w(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -1143,6 +1224,8 @@ simde__m256i ...@@ -1143,6 +1224,8 @@ simde__m256i
simde_mm256_cmpeq_epi64 (simde__m256i a, simde__m256i b) { simde_mm256_cmpeq_epi64 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_cmpeq_epi64(a, b); return _mm256_cmpeq_epi64(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvseq_d(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -1172,6 +1255,8 @@ simde__m256i ...@@ -1172,6 +1255,8 @@ simde__m256i
simde_mm256_cmpgt_epi8 (simde__m256i a, simde__m256i b) { simde_mm256_cmpgt_epi8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_cmpgt_epi8(a, b); return _mm256_cmpgt_epi8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvslt_b(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -1203,6 +1288,8 @@ simde__m256i ...@@ -1203,6 +1288,8 @@ simde__m256i
simde_mm256_cmpgt_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_cmpgt_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_cmpgt_epi16(a, b); return _mm256_cmpgt_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvslt_h(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -1234,6 +1321,8 @@ simde__m256i ...@@ -1234,6 +1321,8 @@ simde__m256i
simde_mm256_cmpgt_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_cmpgt_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_cmpgt_epi32(a, b); return _mm256_cmpgt_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvslt_w(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -1265,6 +1354,8 @@ simde__m256i ...@@ -1265,6 +1354,8 @@ simde__m256i
simde_mm256_cmpgt_epi64 (simde__m256i a, simde__m256i b) { simde_mm256_cmpgt_epi64 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_cmpgt_epi64(a, b); return _mm256_cmpgt_epi64(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvslt_d(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -1300,7 +1391,11 @@ simde_mm256_cvtepi8_epi16 (simde__m128i a) { ...@@ -1300,7 +1391,11 @@ simde_mm256_cvtepi8_epi16 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.m128i_private[0] = a_;
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_h_b(r_.i256, 0);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.i16, a_.i8); SIMDE_CONVERT_VECTOR_(r_.i16, a_.i8);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -1326,7 +1421,12 @@ simde_mm256_cvtepi8_epi32 (simde__m128i a) { ...@@ -1326,7 +1421,12 @@ simde_mm256_cvtepi8_epi32 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.m128i_private[0] = a_;
r_.i256 = __lasx_xvsllwil_h_b(r_.i256, 0);
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_w_h(r_.i256, 0);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.i32, a_.m64_private[0].i8); SIMDE_CONVERT_VECTOR_(r_.i32, a_.m64_private[0].i8);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -1352,10 +1452,18 @@ simde_mm256_cvtepi8_epi64 (simde__m128i a) { ...@@ -1352,10 +1452,18 @@ simde_mm256_cvtepi8_epi64 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
SIMDE_VECTORIZE #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) { r_.m128i_private[0] = a_;
r_.i64[i] = a_.i8[i]; r_.i256 = __lasx_xvsllwil_h_b(r_.i256, 0);
} r_.i256 = __lasx_xvsllwil_w_h(r_.i256, 0);
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_d_w(r_.i256, 0);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
r_.i64[i] = a_.i8[i];
}
#endif
return simde__m256i_from_private(r_); return simde__m256i_from_private(r_);
#endif #endif
...@@ -1374,7 +1482,11 @@ simde_mm256_cvtepi16_epi32 (simde__m128i a) { ...@@ -1374,7 +1482,11 @@ simde_mm256_cvtepi16_epi32 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.m128i_private[0] = a_;
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_w_h(r_.i256, 0);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.i32, a_.i16); SIMDE_CONVERT_VECTOR_(r_.i32, a_.i16);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -1400,7 +1512,12 @@ simde_mm256_cvtepi16_epi64 (simde__m128i a) { ...@@ -1400,7 +1512,12 @@ simde_mm256_cvtepi16_epi64 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.m128i_private[0] = a_;
r_.i256 = __lasx_xvsllwil_w_h(r_.i256, 0);
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_d_w(r_.i256, 0);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.i64, a_.m64_private[0].i16); SIMDE_CONVERT_VECTOR_(r_.i64, a_.m64_private[0].i16);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -1426,7 +1543,11 @@ simde_mm256_cvtepi32_epi64 (simde__m128i a) { ...@@ -1426,7 +1543,11 @@ simde_mm256_cvtepi32_epi64 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.m128i_private[0] = a_;
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_d_w(r_.i256, 0);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.i64, a_.i32); SIMDE_CONVERT_VECTOR_(r_.i64, a_.i32);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -1452,7 +1573,11 @@ simde_mm256_cvtepu8_epi16 (simde__m128i a) { ...@@ -1452,7 +1573,11 @@ simde_mm256_cvtepu8_epi16 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.m128i_private[0] = a_;
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_hu_bu(r_.i256, 0);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.i16, a_.u8); SIMDE_CONVERT_VECTOR_(r_.i16, a_.u8);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -1478,7 +1603,12 @@ simde_mm256_cvtepu8_epi32 (simde__m128i a) { ...@@ -1478,7 +1603,12 @@ simde_mm256_cvtepu8_epi32 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.m128i_private[0] = a_;
r_.i256 = __lasx_xvsllwil_hu_bu(r_.i256, 0);
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_wu_hu(r_.i256, 0);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.i32, a_.m64_private[0].u8); SIMDE_CONVERT_VECTOR_(r_.i32, a_.m64_private[0].u8);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -1504,10 +1634,18 @@ simde_mm256_cvtepu8_epi64 (simde__m128i a) { ...@@ -1504,10 +1634,18 @@ simde_mm256_cvtepu8_epi64 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
SIMDE_VECTORIZE #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) { r_.m128i_private[0] = a_;
r_.i64[i] = a_.u8[i]; r_.i256 = __lasx_xvsllwil_hu_bu(r_.i256, 0);
} r_.i256 = __lasx_xvsllwil_wu_hu(r_.i256, 0);
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_du_wu(r_.i256, 0);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
r_.i64[i] = a_.u8[i];
}
#endif
return simde__m256i_from_private(r_); return simde__m256i_from_private(r_);
#endif #endif
...@@ -1526,7 +1664,11 @@ simde_mm256_cvtepu16_epi32 (simde__m128i a) { ...@@ -1526,7 +1664,11 @@ simde_mm256_cvtepu16_epi32 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.m128i_private[0] = a_;
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_wu_hu(r_.i256, 0);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.i32, a_.u16); SIMDE_CONVERT_VECTOR_(r_.i32, a_.u16);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -1552,7 +1694,12 @@ simde_mm256_cvtepu16_epi64 (simde__m128i a) { ...@@ -1552,7 +1694,12 @@ simde_mm256_cvtepu16_epi64 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.m128i_private[0] = a_;
r_.i256 = __lasx_xvsllwil_wu_hu(r_.i256, 0);
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_du_wu(r_.i256, 0);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.i64, a_.m64_private[0].u16); SIMDE_CONVERT_VECTOR_(r_.i64, a_.m64_private[0].u16);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -1578,7 +1725,11 @@ simde_mm256_cvtepu32_epi64 (simde__m128i a) { ...@@ -1578,7 +1725,11 @@ simde_mm256_cvtepu32_epi64 (simde__m128i a) {
simde__m256i_private r_; simde__m256i_private r_;
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.m128i_private[0] = a_;
r_.i256 = __lasx_xvpermi_d(r_.i256, 0xd8);
r_.i256 = __lasx_xvsllwil_du_wu(r_.i256, 0);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.i64, a_.u32); SIMDE_CONVERT_VECTOR_(r_.i64, a_.u32);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -2726,6 +2877,8 @@ simde__m256i ...@@ -2726,6 +2877,8 @@ simde__m256i
simde_mm256_madd_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_madd_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_madd_epi16(a, b); return _mm256_madd_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmaddwod_w_h(__lasx_xvmulwev_w_h(a, b), a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -2770,6 +2923,8 @@ simde__m256i ...@@ -2770,6 +2923,8 @@ simde__m256i
simde_mm256_maddubs_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_maddubs_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_maddubs_epi16(a, b); return _mm256_maddubs_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsadd_h(__lasx_xvmulwod_h_bu_b(a, b), __lasx_xvmulwev_h_bu_b(a, b));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -2811,6 +2966,8 @@ simde_mm_maskload_epi32 (const int32_t mem_addr[HEDLEY_ARRAY_PARAM(4)], simde__m ...@@ -2811,6 +2966,8 @@ simde_mm_maskload_epi32 (const int32_t mem_addr[HEDLEY_ARRAY_PARAM(4)], simde__m
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
mask_shr_.neon_i32 = vshrq_n_s32(mask_.neon_i32, 31); mask_shr_.neon_i32 = vshrq_n_s32(mask_.neon_i32, 31);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
mask_shr_.lsx_i64 = __lsx_vsrli_w(mask_.lsx_i64, 31);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) { for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
...@@ -2833,17 +2990,27 @@ simde_mm_maskload_epi32 (const int32_t mem_addr[HEDLEY_ARRAY_PARAM(4)], simde__m ...@@ -2833,17 +2990,27 @@ simde_mm_maskload_epi32 (const int32_t mem_addr[HEDLEY_ARRAY_PARAM(4)], simde__m
SIMDE_FUNCTION_ATTRIBUTES SIMDE_FUNCTION_ATTRIBUTES
simde__m256i simde__m256i
simde_mm256_maskload_epi32 (const int32_t mem_addr[HEDLEY_ARRAY_PARAM(4)], simde__m256i mask) { simde_mm256_maskload_epi32 (const int32_t mem_addr[HEDLEY_ARRAY_PARAM(8)], simde__m256i mask) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_maskload_epi32(mem_addr, mask); return _mm256_maskload_epi32(mem_addr, mask);
#else #else
simde__m256i_private simde__m256i_private
mask_ = simde__m256i_to_private(mask), mask_ = simde__m256i_to_private(mask),
r_; r_,
mask_shr_;
#if defined(SIMDE_LOONGARCH_LASX_NATIVE)
mask_shr_.i256 = __lasx_xvsrli_w(mask_.i256, 31);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
mask_shr_.i32[i] = mask_.i32[i] >> 31;
}
#endif
SIMDE_VECTORIZE SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) { for (size_t i = 0 ; i < (sizeof(r_.i32) / sizeof(r_.i32[0])) ; i++) {
r_.i32[i] = (mask_.i32[i] >> 31) ? mem_addr[i] : INT32_C(0); r_.i32[i] = mask_shr_.i32[i] ? mem_addr[i] : INT32_C(0);
} }
return simde__m256i_from_private(r_); return simde__m256i_from_private(r_);
...@@ -2867,6 +3034,8 @@ simde_mm_maskload_epi64 (const int64_t mem_addr[HEDLEY_ARRAY_PARAM(2)], simde__m ...@@ -2867,6 +3034,8 @@ simde_mm_maskload_epi64 (const int64_t mem_addr[HEDLEY_ARRAY_PARAM(2)], simde__m
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
mask_shr_.neon_i64 = vshrq_n_s64(mask_.neon_i64, 63); mask_shr_.neon_i64 = vshrq_n_s64(mask_.neon_i64, 63);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
mask_shr_.lsx_i64 = __lsx_vsrli_d(mask_.lsx_i64, 63);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(mask_.i64) / sizeof(mask_.i64[0])) ; i++) { for (size_t i = 0 ; i < (sizeof(mask_.i64) / sizeof(mask_.i64[0])) ; i++) {
...@@ -2895,11 +3064,21 @@ simde_mm256_maskload_epi64 (const int64_t mem_addr[HEDLEY_ARRAY_PARAM(4)], simde ...@@ -2895,11 +3064,21 @@ simde_mm256_maskload_epi64 (const int64_t mem_addr[HEDLEY_ARRAY_PARAM(4)], simde
#else #else
simde__m256i_private simde__m256i_private
mask_ = simde__m256i_to_private(mask), mask_ = simde__m256i_to_private(mask),
r_; r_,
mask_shr_;
#if defined(SIMDE_LOONGARCH_LASX_NATIVE)
mask_shr_.i256 = __lasx_xvsrli_d(mask_.i256, 63);
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
mask_shr_.i64[i] = mask_.i64[i] >> 63;
}
#endif
SIMDE_VECTORIZE SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) { for (size_t i = 0 ; i < (sizeof(r_.i64) / sizeof(r_.i64[0])) ; i++) {
r_.i64[i] = (mask_.i64[i] >> 63) ? mem_addr[i] : INT64_C(0); r_.i64[i] = mask_shr_.i64[i] ? mem_addr[i] : INT64_C(0);
} }
return simde__m256i_from_private(r_); return simde__m256i_from_private(r_);
...@@ -2919,11 +3098,17 @@ simde_mm_maskstore_epi32 (int32_t mem_addr[HEDLEY_ARRAY_PARAM(4)], simde__m128i ...@@ -2919,11 +3098,17 @@ simde_mm_maskstore_epi32 (int32_t mem_addr[HEDLEY_ARRAY_PARAM(4)], simde__m128i
simde__m128i_private mask_ = simde__m128i_to_private(mask); simde__m128i_private mask_ = simde__m128i_to_private(mask);
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
SIMDE_VECTORIZE #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) { mask_.lsx_i64 = __lsx_vslti_w(mask_.lsx_i64, 0);
if (mask_.u32[i] & (UINT32_C(1) << 31)) a_.lsx_i64 = __lsx_vbitsel_v(__lsx_vld(mem_addr, 0), a_.lsx_i64, mask_.lsx_i64);
mem_addr[i] = a_.i32[i]; __lsx_vst(a_.lsx_i64, mem_addr, 0);
} #else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
if (mask_.u32[i] & (UINT32_C(1) << 31))
mem_addr[i] = a_.i32[i];
}
#endif
#endif #endif
} }
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
...@@ -2940,11 +3125,17 @@ simde_mm256_maskstore_epi32 (int32_t mem_addr[HEDLEY_ARRAY_PARAM(8)], simde__m25 ...@@ -2940,11 +3125,17 @@ simde_mm256_maskstore_epi32 (int32_t mem_addr[HEDLEY_ARRAY_PARAM(8)], simde__m25
simde__m256i_private mask_ = simde__m256i_to_private(mask); simde__m256i_private mask_ = simde__m256i_to_private(mask);
simde__m256i_private a_ = simde__m256i_to_private(a); simde__m256i_private a_ = simde__m256i_to_private(a);
SIMDE_VECTORIZE #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) { mask_.i256 = __lasx_xvslti_w(mask_.i256, 0);
if (mask_.u32[i] & (UINT32_C(1) << 31)) a_.i256 = __lasx_xvbitsel_v(__lasx_xvld(mem_addr, 0), a_.i256, mask_.i256);
mem_addr[i] = a_.i32[i]; __lasx_xvst(a_.i256, mem_addr, 0);
} #else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(a_.i32) / sizeof(a_.i32[0])) ; i++) {
if (mask_.u32[i] & (UINT32_C(1) << 31))
mem_addr[i] = a_.i32[i];
}
#endif
#endif #endif
} }
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
...@@ -2961,11 +3152,16 @@ simde_mm_maskstore_epi64 (int64_t mem_addr[HEDLEY_ARRAY_PARAM(2)], simde__m128i ...@@ -2961,11 +3152,16 @@ simde_mm_maskstore_epi64 (int64_t mem_addr[HEDLEY_ARRAY_PARAM(2)], simde__m128i
simde__m128i_private mask_ = simde__m128i_to_private(mask); simde__m128i_private mask_ = simde__m128i_to_private(mask);
simde__m128i_private a_ = simde__m128i_to_private(a); simde__m128i_private a_ = simde__m128i_to_private(a);
SIMDE_VECTORIZE #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) { if (__lsx_vpickve2gr_d(mask_.lsx_i64, 0) < 0) __lsx_vstelm_d(a_.lsx_i64, mem_addr, 0, 0);
if (mask_.u64[i] >> 63) if (__lsx_vpickve2gr_d(mask_.lsx_i64, 1) < 0) __lsx_vstelm_d(a_.lsx_i64, mem_addr, 8, 1);
mem_addr[i] = a_.i64[i]; #else
} SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
if (mask_.u64[i] >> 63)
mem_addr[i] = a_.i64[i];
}
#endif
#endif #endif
} }
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
...@@ -2982,11 +3178,17 @@ simde_mm256_maskstore_epi64 (int64_t mem_addr[HEDLEY_ARRAY_PARAM(4)], simde__m25 ...@@ -2982,11 +3178,17 @@ simde_mm256_maskstore_epi64 (int64_t mem_addr[HEDLEY_ARRAY_PARAM(4)], simde__m25
simde__m256i_private mask_ = simde__m256i_to_private(mask); simde__m256i_private mask_ = simde__m256i_to_private(mask);
simde__m256i_private a_ = simde__m256i_to_private(a); simde__m256i_private a_ = simde__m256i_to_private(a);
SIMDE_VECTORIZE #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) { mask_.i256 = __lasx_xvslti_d(mask_.i256, 0);
if (mask_.u64[i] & (UINT64_C(1) << 63)) a_.i256 = __lasx_xvbitsel_v(__lasx_xvld(mem_addr, 0), a_.i256, mask_.i256);
mem_addr[i] = a_.i64[i]; __lasx_xvst(a_.i256, mem_addr, 0);
} #else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(a_.i64) / sizeof(a_.i64[0])) ; i++) {
if (mask_.u64[i] & (UINT64_C(1) << 63))
mem_addr[i] = a_.i64[i];
}
#endif
#endif #endif
} }
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
...@@ -2999,6 +3201,8 @@ simde__m256i ...@@ -2999,6 +3201,8 @@ simde__m256i
simde_mm256_max_epi8 (simde__m256i a, simde__m256i b) { simde_mm256_max_epi8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) && !defined(__PGI) #if defined(SIMDE_X86_AVX2_NATIVE) && !defined(__PGI)
return _mm256_max_epi8(a, b); return _mm256_max_epi8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmax_b(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3028,6 +3232,8 @@ simde__m256i ...@@ -3028,6 +3232,8 @@ simde__m256i
simde_mm256_max_epu8 (simde__m256i a, simde__m256i b) { simde_mm256_max_epu8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_max_epu8(a, b); return _mm256_max_epu8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmax_bu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3057,6 +3263,8 @@ simde__m256i ...@@ -3057,6 +3263,8 @@ simde__m256i
simde_mm256_max_epu16 (simde__m256i a, simde__m256i b) { simde_mm256_max_epu16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_max_epu16(a, b); return _mm256_max_epu16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmax_hu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3086,6 +3294,8 @@ simde__m256i ...@@ -3086,6 +3294,8 @@ simde__m256i
simde_mm256_max_epu32 (simde__m256i a, simde__m256i b) { simde_mm256_max_epu32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_max_epu32(a, b); return _mm256_max_epu32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmax_wu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3115,6 +3325,8 @@ simde__m256i ...@@ -3115,6 +3325,8 @@ simde__m256i
simde_mm256_max_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_max_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_max_epi16(a, b); return _mm256_max_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmax_h(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3144,6 +3356,8 @@ simde__m256i ...@@ -3144,6 +3356,8 @@ simde__m256i
simde_mm256_max_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_max_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_max_epi32(a, b); return _mm256_max_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmax_w(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3173,6 +3387,8 @@ simde__m256i ...@@ -3173,6 +3387,8 @@ simde__m256i
simde_mm256_min_epi8 (simde__m256i a, simde__m256i b) { simde_mm256_min_epi8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) && !defined(__PGI) #if defined(SIMDE_X86_AVX2_NATIVE) && !defined(__PGI)
return _mm256_min_epi8(a, b); return _mm256_min_epi8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmin_b(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3202,6 +3418,8 @@ simde__m256i ...@@ -3202,6 +3418,8 @@ simde__m256i
simde_mm256_min_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_min_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_min_epi16(a, b); return _mm256_min_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmin_h(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3231,6 +3449,8 @@ simde__m256i ...@@ -3231,6 +3449,8 @@ simde__m256i
simde_mm256_min_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_min_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_min_epi32(a, b); return _mm256_min_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmin_w(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3260,6 +3480,8 @@ simde__m256i ...@@ -3260,6 +3480,8 @@ simde__m256i
simde_mm256_min_epu8 (simde__m256i a, simde__m256i b) { simde_mm256_min_epu8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_min_epu8(a, b); return _mm256_min_epu8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmin_bu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3289,6 +3511,8 @@ simde__m256i ...@@ -3289,6 +3511,8 @@ simde__m256i
simde_mm256_min_epu16 (simde__m256i a, simde__m256i b) { simde_mm256_min_epu16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_min_epu16(a, b); return _mm256_min_epu16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmin_hu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3318,6 +3542,8 @@ simde__m256i ...@@ -3318,6 +3542,8 @@ simde__m256i
simde_mm256_min_epu32 (simde__m256i a, simde__m256i b) { simde_mm256_min_epu32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_min_epu32(a, b); return _mm256_min_epu32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmin_wu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3347,6 +3573,9 @@ int32_t ...@@ -3347,6 +3573,9 @@ int32_t
simde_mm256_movemask_epi8 (simde__m256i a) { simde_mm256_movemask_epi8 (simde__m256i a) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_movemask_epi8(a); return _mm256_movemask_epi8(a);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
a = __lasx_xvmskltz_b(a);
return (__lasx_xvpickve2gr_w(a, 0) | (__lasx_xvpickve2gr_w(a, 4) << 16));
#else #else
simde__m256i_private a_ = simde__m256i_to_private(a); simde__m256i_private a_ = simde__m256i_to_private(a);
uint32_t r = 0; uint32_t r = 0;
...@@ -3423,6 +3652,8 @@ simde__m256i ...@@ -3423,6 +3652,8 @@ simde__m256i
simde_mm256_mul_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_mul_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_mul_epi32(a, b); return _mm256_mul_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmulwev_d_w(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3453,6 +3684,8 @@ simde__m256i ...@@ -3453,6 +3684,8 @@ simde__m256i
simde_mm256_mul_epu32 (simde__m256i a, simde__m256i b) { simde_mm256_mul_epu32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_mul_epu32(a, b); return _mm256_mul_epu32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmulwev_d_wu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3481,6 +3714,8 @@ simde__m256i ...@@ -3481,6 +3714,8 @@ simde__m256i
simde_mm256_mulhi_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_mulhi_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_mulhi_epi16(a, b); return _mm256_mulhi_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmuh_h(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3504,6 +3739,8 @@ simde__m256i ...@@ -3504,6 +3739,8 @@ simde__m256i
simde_mm256_mulhi_epu16 (simde__m256i a, simde__m256i b) { simde_mm256_mulhi_epu16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_mulhi_epu16(a, b); return _mm256_mulhi_epu16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmuh_hu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3527,6 +3764,12 @@ simde__m256i ...@@ -3527,6 +3764,12 @@ simde__m256i
simde_mm256_mulhrs_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_mulhrs_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_mulhrs_epi16(a, b); return _mm256_mulhrs_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
__m256i t1_ = __lasx_xvmulwev_w_h(a, b),
t2_ = __lasx_xvmulwod_w_h(a, b);
t1_ = __lasx_xvssrarni_h_w(t1_, t1_, 15);
t2_ = __lasx_xvssrarni_h_w(t2_, t2_, 15);
return __lasx_xvilvl_h(t2_, t1_);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3550,6 +3793,8 @@ simde__m256i ...@@ -3550,6 +3793,8 @@ simde__m256i
simde_mm256_mullo_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_mullo_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_mullo_epi16(a, b); return _mm256_mullo_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmul_h(a, b);
#else #else
simde__m256i_private simde__m256i_private
a_ = simde__m256i_to_private(a), a_ = simde__m256i_to_private(a),
...@@ -3574,6 +3819,8 @@ simde__m256i ...@@ -3574,6 +3819,8 @@ simde__m256i
simde_mm256_mullo_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_mullo_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_mullo_epi32(a, b); return _mm256_mullo_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvmul_w(a, b);
#else #else
simde__m256i_private simde__m256i_private
a_ = simde__m256i_to_private(a), a_ = simde__m256i_to_private(a),
...@@ -3618,6 +3865,8 @@ simde__m256i ...@@ -3618,6 +3865,8 @@ simde__m256i
simde_mm256_or_si256 (simde__m256i a, simde__m256i b) { simde_mm256_or_si256 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_or_si256(a, b); return _mm256_or_si256(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvor_v(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3649,6 +3898,8 @@ simde__m256i ...@@ -3649,6 +3898,8 @@ simde__m256i
simde_mm256_packs_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_packs_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_packs_epi16(a, b); return _mm256_packs_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvssrarni_b_h(b, a, 0);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3683,6 +3934,8 @@ simde__m256i ...@@ -3683,6 +3934,8 @@ simde__m256i
simde_mm256_packs_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_packs_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_packs_epi32(a, b); return _mm256_packs_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvssrarni_h_w(b, a, 0);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3715,6 +3968,8 @@ simde__m256i ...@@ -3715,6 +3968,8 @@ simde__m256i
simde_mm256_packus_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_packus_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_packus_epi16(a, b); return _mm256_packus_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvssrarni_bu_h(b, a, 0);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3749,6 +4004,8 @@ simde__m256i ...@@ -3749,6 +4004,8 @@ simde__m256i
simde_mm256_packus_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_packus_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_packus_epi32(a, b); return _mm256_packus_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvssrarni_hu_w(b, a, 0);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3817,6 +4074,8 @@ simde_mm256_permute4x64_epi64 (simde__m256i a, const int imm8) ...@@ -3817,6 +4074,8 @@ simde_mm256_permute4x64_epi64 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_permute4x64_epi64(a, imm8) _mm256_permute4x64_epi64(a, imm8) # define simde_mm256_permute4x64_epi64(a, imm8) _mm256_permute4x64_epi64(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_permute4x64_epi64(a, imm8) __lasx_xvpermi_d(a, imm8)
#endif #endif
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
#undef _mm256_permute4x64_epi64 #undef _mm256_permute4x64_epi64
...@@ -3840,6 +4099,8 @@ simde_mm256_permute4x64_pd (simde__m256d a, const int imm8) ...@@ -3840,6 +4099,8 @@ simde_mm256_permute4x64_pd (simde__m256d a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_permute4x64_pd(a, imm8) _mm256_permute4x64_pd(a, imm8) # define simde_mm256_permute4x64_pd(a, imm8) _mm256_permute4x64_pd(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_permute4x64_pd(a, imm8) HEDLEY_REINTERPRET_CAST(simde__m256d, __lasx_xvpermi_d(a, imm8))
#endif #endif
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
#undef _mm256_permute4x64_pd #undef _mm256_permute4x64_pd
...@@ -3851,6 +4112,8 @@ simde__m256i ...@@ -3851,6 +4112,8 @@ simde__m256i
simde_mm256_permutevar8x32_epi32 (simde__m256i a, simde__m256i idx) { simde_mm256_permutevar8x32_epi32 (simde__m256i a, simde__m256i idx) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_permutevar8x32_epi32(a, idx); return _mm256_permutevar8x32_epi32(a, idx);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvperm_w(a, idx);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -3879,6 +4142,8 @@ simde_mm256_permutevar8x32_ps (simde__m256 a, simde__m256i idx) { ...@@ -3879,6 +4142,8 @@ simde_mm256_permutevar8x32_ps (simde__m256 a, simde__m256i idx) {
#else #else
return _mm256_permutevar8x32_ps(a, idx); return _mm256_permutevar8x32_ps(a, idx);
#endif #endif
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return HEDLEY_REINTERPRET_CAST(simde__m256, __lasx_xvperm_w(HEDLEY_REINTERPRET_CAST(simde__m256i, a), idx));
#else #else
simde__m256_private simde__m256_private
r_, r_,
...@@ -3944,7 +4209,12 @@ simde_mm256_shuffle_epi8 (simde__m256i a, simde__m256i b) { ...@@ -3944,7 +4209,12 @@ simde_mm256_shuffle_epi8 (simde__m256i a, simde__m256i b) {
a_ = simde__m256i_to_private(a), a_ = simde__m256i_to_private(a),
b_ = simde__m256i_to_private(b); b_ = simde__m256i_to_private(b);
#if SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.i256 = __lasx_xvslti_b(b, 0);
r_.i256 = __lasx_xvnor_v(r_.i256, r_.i256);
a_.i256 = __lasx_xvshuf_b(a_.i256, a_.i256, __lasx_xvand_v(b_.i256, __lasx_xvreplgr2vr_b(15)));
r_.i256 = __lasx_xvand_v(r_.i256, a_.i256);
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
r_.m128i[0] = simde_mm_shuffle_epi8(a_.m128i[0], b_.m128i[0]); r_.m128i[0] = simde_mm_shuffle_epi8(a_.m128i[0], b_.m128i[0]);
r_.m128i[1] = simde_mm_shuffle_epi8(a_.m128i[1], b_.m128i[1]); r_.m128i[1] = simde_mm_shuffle_epi8(a_.m128i[1], b_.m128i[1]);
#else #else
...@@ -3982,6 +4252,8 @@ simde_mm256_shuffle_epi32 (simde__m256i a, const int imm8) ...@@ -3982,6 +4252,8 @@ simde_mm256_shuffle_epi32 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_shuffle_epi32(a, imm8) _mm256_shuffle_epi32(a, imm8) # define simde_mm256_shuffle_epi32(a, imm8) _mm256_shuffle_epi32(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_shuffle_epi32(a, imm8) __lasx_xvshuf4i_w(a, imm8)
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) && !defined(__PGI) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) && !defined(__PGI)
# define simde_mm256_shuffle_epi32(a, imm8) \ # define simde_mm256_shuffle_epi32(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4010,6 +4282,8 @@ simde_mm256_shuffle_epi32 (simde__m256i a, const int imm8) ...@@ -4010,6 +4282,8 @@ simde_mm256_shuffle_epi32 (simde__m256i a, const int imm8)
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_shufflehi_epi16(a, imm8) _mm256_shufflehi_epi16(a, imm8) # define simde_mm256_shufflehi_epi16(a, imm8) _mm256_shufflehi_epi16(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_shufflehi_epi16(a, imm8) __lasx_xvextrins_d(__lasx_xvshuf4i_h(a, imm8), a, 0)
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_shufflehi_epi16(a, imm8) \ # define simde_mm256_shufflehi_epi16(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4046,6 +4320,8 @@ simde_mm256_shuffle_epi32 (simde__m256i a, const int imm8) ...@@ -4046,6 +4320,8 @@ simde_mm256_shuffle_epi32 (simde__m256i a, const int imm8)
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_shufflelo_epi16(a, imm8) _mm256_shufflelo_epi16(a, imm8) # define simde_mm256_shufflelo_epi16(a, imm8) _mm256_shufflelo_epi16(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_shufflelo_epi16(a, imm8) __lasx_xvextrins_d(__lasx_xvshuf4i_h(a, imm8), a, 0x11)
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_shufflelo_epi16(a, imm8) \ # define simde_mm256_shufflelo_epi16(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4084,6 +4360,8 @@ simde__m256i ...@@ -4084,6 +4360,8 @@ simde__m256i
simde_mm256_sign_epi8 (simde__m256i a, simde__m256i b) { simde_mm256_sign_epi8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sign_epi8(a, b); return _mm256_sign_epi8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsigncov_b(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4108,6 +4386,8 @@ simde__m256i ...@@ -4108,6 +4386,8 @@ simde__m256i
simde_mm256_sign_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_sign_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sign_epi16(a, b); return _mm256_sign_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsigncov_h(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4132,6 +4412,8 @@ simde__m256i ...@@ -4132,6 +4412,8 @@ simde__m256i
simde_mm256_sign_epi32(simde__m256i a, simde__m256i b) { simde_mm256_sign_epi32(simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sign_epi32(a, b); return _mm256_sign_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsigncov_w(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4156,6 +4438,8 @@ simde__m256i ...@@ -4156,6 +4438,8 @@ simde__m256i
simde_mm256_sll_epi16 (simde__m256i a, simde__m128i count) { simde_mm256_sll_epi16 (simde__m256i a, simde__m128i count) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sll_epi16(a, count); return _mm256_sll_epi16(a, count);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsll_h(a, __lasx_xvreplgr2vr_h(count[0]));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4195,6 +4479,8 @@ simde__m256i ...@@ -4195,6 +4479,8 @@ simde__m256i
simde_mm256_sll_epi32 (simde__m256i a, simde__m128i count) { simde_mm256_sll_epi32 (simde__m256i a, simde__m128i count) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sll_epi32(a, count); return _mm256_sll_epi32(a, count);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsll_w(a, __lasx_xvreplgr2vr_w(count[0]));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4234,6 +4520,8 @@ simde__m256i ...@@ -4234,6 +4520,8 @@ simde__m256i
simde_mm256_sll_epi64 (simde__m256i a, simde__m128i count) { simde_mm256_sll_epi64 (simde__m256i a, simde__m128i count) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sll_epi64(a, count); return _mm256_sll_epi64(a, count);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsll_d(a, __lasx_xvreplgr2vr_d(count[0]));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4298,6 +4586,8 @@ simde_mm256_slli_epi16 (simde__m256i a, const int imm8) ...@@ -4298,6 +4586,8 @@ simde_mm256_slli_epi16 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_slli_epi16(a, imm8) _mm256_slli_epi16(a, imm8) # define simde_mm256_slli_epi16(a, imm8) _mm256_slli_epi16(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_slli_epi16(a, imm8) (imm8 > 15 ? __lasx_xvreplgr2vr_h(0) : __lasx_xvslli_h(a, imm8 & 15))
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_slli_epi16(a, imm8) \ # define simde_mm256_slli_epi16(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4335,6 +4625,8 @@ simde_mm256_slli_epi32 (simde__m256i a, const int imm8) ...@@ -4335,6 +4625,8 @@ simde_mm256_slli_epi32 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_slli_epi32(a, imm8) _mm256_slli_epi32(a, imm8) # define simde_mm256_slli_epi32(a, imm8) _mm256_slli_epi32(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_slli_epi32(a, imm8) (imm8 > 31 ? __lasx_xvreplgr2vr_w(0) : __lasx_xvslli_w(a, imm8 & 31))
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_slli_epi32(a, imm8) \ # define simde_mm256_slli_epi32(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4367,6 +4659,8 @@ simde_mm256_slli_epi64 (simde__m256i a, const int imm8) ...@@ -4367,6 +4659,8 @@ simde_mm256_slli_epi64 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_slli_epi64(a, imm8) _mm256_slli_epi64(a, imm8) # define simde_mm256_slli_epi64(a, imm8) _mm256_slli_epi64(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_slli_epi64(a, imm8) (imm8 > 63 ? __lasx_xvreplgr2vr_d(0) : __lasx_xvslli_d(a, imm8))
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_slli_epi64(a, imm8) \ # define simde_mm256_slli_epi64(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4398,6 +4692,8 @@ simde_mm256_slli_si256 (simde__m256i a, const int imm8) ...@@ -4398,6 +4692,8 @@ simde_mm256_slli_si256 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_slli_si256(a, imm8) _mm256_slli_si256(a, imm8) # define simde_mm256_slli_si256(a, imm8) _mm256_slli_si256(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_slli_si256(a, imm8) __lasx_xvbsll_v(a, imm8)
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) && !defined(__PGI) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) && !defined(__PGI)
# define simde_mm256_slli_si256(a, imm8) \ # define simde_mm256_slli_si256(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4425,6 +4721,9 @@ simde_mm_sllv_epi32 (simde__m128i a, simde__m128i b) { ...@@ -4425,6 +4721,9 @@ simde_mm_sllv_epi32 (simde__m128i a, simde__m128i b) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
r_.neon_u32 = vshlq_u32(a_.neon_u32, vreinterpretq_s32_u32(b_.neon_u32)); r_.neon_u32 = vshlq_u32(a_.neon_u32, vreinterpretq_s32_u32(b_.neon_u32));
r_.neon_u32 = vandq_u32(r_.neon_u32, vcltq_u32(b_.neon_u32, vdupq_n_u32(32))); r_.neon_u32 = vandq_u32(r_.neon_u32, vcltq_u32(b_.neon_u32, vdupq_n_u32(32)));
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.lsx_i64 = __lsx_vsll_w(a_.lsx_i64, b_.lsx_i64);
r_.lsx_i64 = __lsx_vand_v(r_.lsx_i64, __lsx_vslei_wu(b_.lsx_i64, 31));
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) #elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
r_.u32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.u32), (b_.u32 < UINT32_C(32))) & (a_.u32 << b_.u32); r_.u32 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.u32), (b_.u32 < UINT32_C(32))) & (a_.u32 << b_.u32);
#else #else
...@@ -4452,7 +4751,10 @@ simde_mm256_sllv_epi32 (simde__m256i a, simde__m256i b) { ...@@ -4452,7 +4751,10 @@ simde_mm256_sllv_epi32 (simde__m256i a, simde__m256i b) {
b_ = simde__m256i_to_private(b), b_ = simde__m256i_to_private(b),
r_; r_;
#if SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.i256 = __lasx_xvsll_w(a_.i256, b_.i256);
r_.i256 = __lasx_xvand_v(r_.i256, __lasx_xvslei_wu(b_.i256, 31));
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
r_.m128i[0] = simde_mm_sllv_epi32(a_.m128i[0], b_.m128i[0]); r_.m128i[0] = simde_mm_sllv_epi32(a_.m128i[0], b_.m128i[0]);
r_.m128i[1] = simde_mm_sllv_epi32(a_.m128i[1], b_.m128i[1]); r_.m128i[1] = simde_mm_sllv_epi32(a_.m128i[1], b_.m128i[1]);
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) #elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
...@@ -4485,6 +4787,9 @@ simde_mm_sllv_epi64 (simde__m128i a, simde__m128i b) { ...@@ -4485,6 +4787,9 @@ simde_mm_sllv_epi64 (simde__m128i a, simde__m128i b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
r_.neon_u64 = vshlq_u64(a_.neon_u64, vreinterpretq_s64_u64(b_.neon_u64)); r_.neon_u64 = vshlq_u64(a_.neon_u64, vreinterpretq_s64_u64(b_.neon_u64));
r_.neon_u64 = vandq_u64(r_.neon_u64, vcltq_u64(b_.neon_u64, vdupq_n_u64(64))); r_.neon_u64 = vandq_u64(r_.neon_u64, vcltq_u64(b_.neon_u64, vdupq_n_u64(64)));
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.lsx_i64 = __lsx_vsll_d(a_.lsx_i64, b_.lsx_i64);
r_.lsx_i64 = __lsx_vand_v(r_.lsx_i64, __lsx_vsle_du(b_.lsx_i64, __lsx_vreplgr2vr_d(63)));
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) #elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
r_.u64 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.u64), (b_.u64 < 64)) & (a_.u64 << b_.u64); r_.u64 = HEDLEY_REINTERPRET_CAST(__typeof__(r_.u64), (b_.u64 < 64)) & (a_.u64 << b_.u64);
#else #else
...@@ -4512,7 +4817,10 @@ simde_mm256_sllv_epi64 (simde__m256i a, simde__m256i b) { ...@@ -4512,7 +4817,10 @@ simde_mm256_sllv_epi64 (simde__m256i a, simde__m256i b) {
b_ = simde__m256i_to_private(b), b_ = simde__m256i_to_private(b),
r_; r_;
#if SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #if defined(SIMDE_LOONGARCH_LASX_NATIVE)
r_.i256 = __lasx_xvsll_d(a_.i256, b_.i256);
r_.i256 = __lasx_xvand_v(r_.i256, __lasx_xvsle_du(b_.i256, __lasx_xvreplgr2vr_d(63)));
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
r_.m128i[0] = simde_mm_sllv_epi64(a_.m128i[0], b_.m128i[0]); r_.m128i[0] = simde_mm_sllv_epi64(a_.m128i[0], b_.m128i[0]);
r_.m128i[1] = simde_mm_sllv_epi64(a_.m128i[1], b_.m128i[1]); r_.m128i[1] = simde_mm_sllv_epi64(a_.m128i[1], b_.m128i[1]);
#elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR) #elif defined(SIMDE_VECTOR_SUBSCRIPT_SCALAR)
...@@ -4539,6 +4847,8 @@ simde__m256i ...@@ -4539,6 +4847,8 @@ simde__m256i
simde_mm256_sra_epi16 (simde__m256i a, simde__m128i count) { simde_mm256_sra_epi16 (simde__m256i a, simde__m128i count) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sra_epi16(a, count); return _mm256_sra_epi16(a, count);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsra_h(a, __lasx_xvreplgr2vr_h(count[0] > 15 ? 15 : count[0]));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4578,6 +4888,8 @@ simde__m256i ...@@ -4578,6 +4888,8 @@ simde__m256i
simde_mm256_sra_epi32 (simde__m256i a, simde__m128i count) { simde_mm256_sra_epi32 (simde__m256i a, simde__m128i count) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sra_epi32(a, count); return _mm256_sra_epi32(a, count);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsra_w(a, __lasx_xvreplgr2vr_w(count[0] > 31 ? 31 : count[0]));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4635,6 +4947,8 @@ simde_mm256_srai_epi16 (simde__m256i a, const int imm8) ...@@ -4635,6 +4947,8 @@ simde_mm256_srai_epi16 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_srai_epi16(a, imm8) _mm256_srai_epi16(a, imm8) # define simde_mm256_srai_epi16(a, imm8) _mm256_srai_epi16(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_srai_epi16(a, imm8) __lasx_xvsrai_h(a, (imm8 > 15 ? 15 : imm8))
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_srai_epi16(a, imm8) \ # define simde_mm256_srai_epi16(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4670,6 +4984,8 @@ simde_mm256_srai_epi32 (simde__m256i a, const int imm8) ...@@ -4670,6 +4984,8 @@ simde_mm256_srai_epi32 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_srai_epi32(a, imm8) _mm256_srai_epi32(a, imm8) # define simde_mm256_srai_epi32(a, imm8) _mm256_srai_epi32(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_srai_epi32(a, imm8) __lasx_xvsrai_w(a, (imm8 > 31 ? 31 : imm8))
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_srai_epi32(a, imm8) \ # define simde_mm256_srai_epi32(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4686,6 +5002,8 @@ simde__m128i ...@@ -4686,6 +5002,8 @@ simde__m128i
simde_mm_srav_epi32 (simde__m128i a, simde__m128i count) { simde_mm_srav_epi32 (simde__m128i a, simde__m128i count) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm_srav_epi32(a, count); return _mm_srav_epi32(a, count);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lsx_vsra_w(a, __lsx_vmini_wu(count, 31));
#else #else
simde__m128i_private simde__m128i_private
r_, r_,
...@@ -4716,6 +5034,8 @@ simde__m256i ...@@ -4716,6 +5034,8 @@ simde__m256i
simde_mm256_srav_epi32 (simde__m256i a, simde__m256i count) { simde_mm256_srav_epi32 (simde__m256i a, simde__m256i count) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_srav_epi32(a, count); return _mm256_srav_epi32(a, count);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsra_w(a, __lasx_xvmini_wu(count, 31));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4747,6 +5067,8 @@ simde__m256i ...@@ -4747,6 +5067,8 @@ simde__m256i
simde_mm256_srl_epi16 (simde__m256i a, simde__m128i count) { simde_mm256_srl_epi16 (simde__m256i a, simde__m128i count) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_srl_epi16(a, count); return _mm256_srl_epi16(a, count);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsrl_h(a, __lasx_xvreplgr2vr_h(count[0] > 16 ? 16 : count[0]));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4784,6 +5106,8 @@ simde__m256i ...@@ -4784,6 +5106,8 @@ simde__m256i
simde_mm256_srl_epi32 (simde__m256i a, simde__m128i count) { simde_mm256_srl_epi32 (simde__m256i a, simde__m128i count) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_srl_epi32(a, count); return _mm256_srl_epi32(a, count);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsrl_w(a, __lasx_xvreplgr2vr_w(count[0] > 32 ? 32 : count[0]));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4821,6 +5145,8 @@ simde__m256i ...@@ -4821,6 +5145,8 @@ simde__m256i
simde_mm256_srl_epi64 (simde__m256i a, simde__m128i count) { simde_mm256_srl_epi64 (simde__m256i a, simde__m128i count) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_srl_epi64(a, count); return _mm256_srl_epi64(a, count);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsrl_d(a, __lasx_xvreplgr2vr_d(count[0] > 64 ? 64 : count[0]));
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -4888,6 +5214,8 @@ simde_mm256_srli_epi16 (simde__m256i a, const int imm8) ...@@ -4888,6 +5214,8 @@ simde_mm256_srli_epi16 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_srli_epi16(a, imm8) _mm256_srli_epi16(a, imm8) # define simde_mm256_srli_epi16(a, imm8) _mm256_srli_epi16(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_srli_epi16(a, imm8) (imm8 > 15 ? __lasx_xvreplgr2vr_h(0) : __lasx_xvsrli_h(a, imm8 & 15))
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_srli_epi16(a, imm8) \ # define simde_mm256_srli_epi16(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4925,6 +5253,8 @@ simde_mm256_srli_epi32 (simde__m256i a, const int imm8) ...@@ -4925,6 +5253,8 @@ simde_mm256_srli_epi32 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_srli_epi32(a, imm8) _mm256_srli_epi32(a, imm8) # define simde_mm256_srli_epi32(a, imm8) _mm256_srli_epi32(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_srli_epi32(a, imm8) __lasx_xvsrli_w(a, imm8)
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_srli_epi32(a, imm8) \ # define simde_mm256_srli_epi32(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4957,6 +5287,8 @@ simde_mm256_srli_epi64 (simde__m256i a, const int imm8) ...@@ -4957,6 +5287,8 @@ simde_mm256_srli_epi64 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_srli_epi64(a, imm8) _mm256_srli_epi64(a, imm8) # define simde_mm256_srli_epi64(a, imm8) _mm256_srli_epi64(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_srli_epi64(a, imm8) __lasx_xvsrli_d(a, imm8)
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128)
# define simde_mm256_srli_epi64(a, imm8) \ # define simde_mm256_srli_epi64(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -4988,6 +5320,8 @@ simde_mm256_srli_si256 (simde__m256i a, const int imm8) ...@@ -4988,6 +5320,8 @@ simde_mm256_srli_si256 (simde__m256i a, const int imm8)
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
# define simde_mm256_srli_si256(a, imm8) _mm256_srli_si256(a, imm8) # define simde_mm256_srli_si256(a, imm8) _mm256_srli_si256(a, imm8)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
# define simde_mm256_srli_si256(a, imm8) __lasx_xvbsrl_v(a, imm8)
#elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) && !defined(__PGI) #elif SIMDE_NATURAL_INT_VECTOR_SIZE_LE(128) && !defined(__PGI)
# define simde_mm256_srli_si256(a, imm8) \ # define simde_mm256_srli_si256(a, imm8) \
simde_mm256_set_m128i( \ simde_mm256_set_m128i( \
...@@ -5025,6 +5359,8 @@ simde_mm_srlv_epi32 (simde__m128i a, simde__m128i b) { ...@@ -5025,6 +5359,8 @@ simde_mm_srlv_epi32 (simde__m128i a, simde__m128i b) {
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
#define simde_mm_srlv_epi32(a, b) _mm_srlv_epi32(a, b) #define simde_mm_srlv_epi32(a, b) _mm_srlv_epi32(a, b)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
#define simde_mm_srlv_epi32(a, b) __lsx_vand_v(__lsx_vsrl_w(a, b), __lsx_vslei_wu(b, 31))
#endif #endif
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
#undef _mm_srlv_epi32 #undef _mm_srlv_epi32
...@@ -5052,6 +5388,8 @@ simde_mm256_srlv_epi32 (simde__m256i a, simde__m256i b) { ...@@ -5052,6 +5388,8 @@ simde_mm256_srlv_epi32 (simde__m256i a, simde__m256i b) {
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
#define simde_mm256_srlv_epi32(a, b) _mm256_srlv_epi32(a, b) #define simde_mm256_srlv_epi32(a, b) _mm256_srlv_epi32(a, b)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
#define simde_mm256_srlv_epi32(a, b) __lasx_xvand_v(__lasx_xvsrl_w(a, b), __lasx_xvslei_wu(b, 31))
#endif #endif
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
#undef _mm256_srlv_epi32 #undef _mm256_srlv_epi32
...@@ -5079,6 +5417,8 @@ simde_mm_srlv_epi64 (simde__m128i a, simde__m128i b) { ...@@ -5079,6 +5417,8 @@ simde_mm_srlv_epi64 (simde__m128i a, simde__m128i b) {
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
#define simde_mm_srlv_epi64(a, b) _mm_srlv_epi64(a, b) #define simde_mm_srlv_epi64(a, b) _mm_srlv_epi64(a, b)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
#define simde_mm_srlv_epi64(a, b) __lsx_vand_v(__lsx_vsrl_d(a, b), __lsx_vsle_du(b, __lsx_vreplgr2vr_d(63)))
#endif #endif
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
#undef _mm_srlv_epi64 #undef _mm_srlv_epi64
...@@ -5106,6 +5446,8 @@ simde_mm256_srlv_epi64 (simde__m256i a, simde__m256i b) { ...@@ -5106,6 +5446,8 @@ simde_mm256_srlv_epi64 (simde__m256i a, simde__m256i b) {
} }
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
#define simde_mm256_srlv_epi64(a, b) _mm256_srlv_epi64(a, b) #define simde_mm256_srlv_epi64(a, b) _mm256_srlv_epi64(a, b)
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
#define simde_mm256_srlv_epi64(a, b) __lasx_xvand_v(__lasx_xvsrl_d(a, b), __lasx_xvsle_du(b, __lasx_xvreplgr2vr_d(63)))
#endif #endif
#if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_X86_AVX2_ENABLE_NATIVE_ALIASES)
#undef _mm256_srlv_epi64 #undef _mm256_srlv_epi64
...@@ -5117,6 +5459,8 @@ simde__m256i ...@@ -5117,6 +5459,8 @@ simde__m256i
simde_mm256_stream_load_si256 (const simde__m256i* mem_addr) { simde_mm256_stream_load_si256 (const simde__m256i* mem_addr) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_stream_load_si256(HEDLEY_CONST_CAST(simde__m256i*, mem_addr)); return _mm256_stream_load_si256(HEDLEY_CONST_CAST(simde__m256i*, mem_addr));
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvld(mem_addr, 0);
#elif HEDLEY_HAS_BUILTIN(__builtin_nontemporal_store) && defined(SIMDE_VECTOR_SUBSCRIPT) #elif HEDLEY_HAS_BUILTIN(__builtin_nontemporal_store) && defined(SIMDE_VECTOR_SUBSCRIPT)
return __builtin_nontemporal_load(mem_addr); return __builtin_nontemporal_load(mem_addr);
#else #else
...@@ -5134,6 +5478,8 @@ simde__m256i ...@@ -5134,6 +5478,8 @@ simde__m256i
simde_mm256_sub_epi8 (simde__m256i a, simde__m256i b) { simde_mm256_sub_epi8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sub_epi8(a, b); return _mm256_sub_epi8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsub_b(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5165,6 +5511,8 @@ simde__m256i ...@@ -5165,6 +5511,8 @@ simde__m256i
simde_mm256_sub_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_sub_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sub_epi16(a, b); return _mm256_sub_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsub_h(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5210,6 +5558,8 @@ simde__m256i ...@@ -5210,6 +5558,8 @@ simde__m256i
simde_mm256_sub_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_sub_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sub_epi32(a, b); return _mm256_sub_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsub_w(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5255,6 +5605,8 @@ simde__m256i ...@@ -5255,6 +5605,8 @@ simde__m256i
simde_mm256_sub_epi64 (simde__m256i a, simde__m256i b) { simde_mm256_sub_epi64 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_sub_epi64(a, b); return _mm256_sub_epi64(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvsub_d(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5309,6 +5661,8 @@ simde__m256i ...@@ -5309,6 +5661,8 @@ simde__m256i
simde_mm256_subs_epi8 (simde__m256i a, simde__m256i b) { simde_mm256_subs_epi8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_subs_epi8(a, b); return _mm256_subs_epi8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvssub_b(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5338,6 +5692,8 @@ simde__m256i ...@@ -5338,6 +5692,8 @@ simde__m256i
simde_mm256_subs_epi16(simde__m256i a, simde__m256i b) { simde_mm256_subs_epi16(simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_subs_epi16(a, b); return _mm256_subs_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvssub_h(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5381,6 +5737,8 @@ simde__m256i ...@@ -5381,6 +5737,8 @@ simde__m256i
simde_mm256_subs_epu8 (simde__m256i a, simde__m256i b) { simde_mm256_subs_epu8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_subs_epu8(a, b); return _mm256_subs_epu8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvssub_bu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5410,6 +5768,8 @@ simde__m256i ...@@ -5410,6 +5768,8 @@ simde__m256i
simde_mm256_subs_epu16(simde__m256i a, simde__m256i b) { simde_mm256_subs_epu16(simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_subs_epu16(a, b); return _mm256_subs_epu16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvssub_hu(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5456,6 +5816,8 @@ simde__m256i ...@@ -5456,6 +5816,8 @@ simde__m256i
simde_mm256_unpacklo_epi8 (simde__m256i a, simde__m256i b) { simde_mm256_unpacklo_epi8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_unpacklo_epi8(a, b); return _mm256_unpacklo_epi8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvilvl_b(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5492,6 +5854,8 @@ simde__m256i ...@@ -5492,6 +5854,8 @@ simde__m256i
simde_mm256_unpacklo_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_unpacklo_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_unpacklo_epi16(a, b); return _mm256_unpacklo_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvilvl_h(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5525,6 +5889,8 @@ simde__m256i ...@@ -5525,6 +5889,8 @@ simde__m256i
simde_mm256_unpacklo_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_unpacklo_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_unpacklo_epi32(a, b); return _mm256_unpacklo_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvilvl_w(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5558,6 +5924,8 @@ simde__m256i ...@@ -5558,6 +5924,8 @@ simde__m256i
simde_mm256_unpacklo_epi64 (simde__m256i a, simde__m256i b) { simde_mm256_unpacklo_epi64 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_unpacklo_epi64(a, b); return _mm256_unpacklo_epi64(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvilvl_d(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5590,6 +5958,8 @@ simde__m256i ...@@ -5590,6 +5958,8 @@ simde__m256i
simde_mm256_unpackhi_epi8 (simde__m256i a, simde__m256i b) { simde_mm256_unpackhi_epi8 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_unpackhi_epi8(a, b); return _mm256_unpackhi_epi8(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvilvh_b(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5626,6 +5996,8 @@ simde__m256i ...@@ -5626,6 +5996,8 @@ simde__m256i
simde_mm256_unpackhi_epi16 (simde__m256i a, simde__m256i b) { simde_mm256_unpackhi_epi16 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_unpackhi_epi16(a, b); return _mm256_unpackhi_epi16(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvilvh_h(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5660,6 +6032,8 @@ simde__m256i ...@@ -5660,6 +6032,8 @@ simde__m256i
simde_mm256_unpackhi_epi32 (simde__m256i a, simde__m256i b) { simde_mm256_unpackhi_epi32 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_unpackhi_epi32(a, b); return _mm256_unpackhi_epi32(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvilvh_w(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5693,6 +6067,8 @@ simde__m256i ...@@ -5693,6 +6067,8 @@ simde__m256i
simde_mm256_unpackhi_epi64 (simde__m256i a, simde__m256i b) { simde_mm256_unpackhi_epi64 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_unpackhi_epi64(a, b); return _mm256_unpackhi_epi64(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvilvh_d(b, a);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
...@@ -5725,6 +6101,8 @@ simde__m256i ...@@ -5725,6 +6101,8 @@ simde__m256i
simde_mm256_xor_si256 (simde__m256i a, simde__m256i b) { simde_mm256_xor_si256 (simde__m256i a, simde__m256i b) {
#if defined(SIMDE_X86_AVX2_NATIVE) #if defined(SIMDE_X86_AVX2_NATIVE)
return _mm256_xor_si256(a, b); return _mm256_xor_si256(a, b);
#elif defined(SIMDE_LOONGARCH_LASX_NATIVE)
return __lasx_xvxor_v(a, b);
#else #else
simde__m256i_private simde__m256i_private
r_, r_,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment