Commit 249b9dc0 authored by Chi-Wei Chu's avatar Chi-Wei Chu Committed by GitHub

arm/neon riscv64: additional RVV implementations - part 2. (#1189)

Contains RVV implementations for the following Neon instructions: 

`abal`, `abdl_high`, `addw`, `addw_high`, `bcax`, `bic`, `cadd_rot270`, `cadd_rot90`, `cmla_lane`, `cmla_rot180_lane` , `cmla_rot270_lane`, `cmla_rot90_lane`, `combine`, `cvt`, `dot`, `dot_lane`, `dup_n`, `eor`, `ext`, `maxnmv`, `minnmv` , `movl` , `movn` , `qdmull` , `qshlu_n`,  `rnda`,  `rsubhn` , `shl`, `shl_n`, `shll_n`, `shr_n`, `shrn_n`, `sqadd`, `sqrt` 
parent 408d06a3
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* *
* Copyright: * Copyright:
* 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology) * 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology)
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_ABAL_H) #if !defined(SIMDE_ARM_NEON_ABAL_H)
...@@ -39,6 +40,14 @@ simde_int16x8_t ...@@ -39,6 +40,14 @@ simde_int16x8_t
simde_vabal_s8(simde_int16x8_t a, simde_int8x8_t b, simde_int8x8_t c) { simde_vabal_s8(simde_int16x8_t a, simde_int8x8_t b, simde_int8x8_t c) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vabal_s8(a, b, c); return vabal_s8(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_int16x8_private r_, a_ = simde_int16x8_to_private(a);
simde_int8x8_private b_ = simde_int8x8_to_private(b);
simde_int8x8_private c_ = simde_int8x8_to_private(c);
vint16m1_t rst = __riscv_vwsub_vv_i16m1(__riscv_vlmul_trunc_v_i8m1_i8mf2(b_.sv64) , \
__riscv_vlmul_trunc_v_i8m1_i8mf2(c_.sv64) , 8);
r_.sv128 = __riscv_vadd_vv_i16m1(__riscv_vmax_vv_i16m1(rst , __riscv_vneg_v_i16m1(rst , 8) , 8), a_.sv128, 8);
return simde_int16x8_from_private(r_);
#else #else
return simde_vaddq_s16(simde_vabdl_s8(b, c), a); return simde_vaddq_s16(simde_vabdl_s8(b, c), a);
#endif #endif
...@@ -53,6 +62,13 @@ simde_int32x4_t ...@@ -53,6 +62,13 @@ simde_int32x4_t
simde_vabal_s16(simde_int32x4_t a, simde_int16x4_t b, simde_int16x4_t c) { simde_vabal_s16(simde_int32x4_t a, simde_int16x4_t b, simde_int16x4_t c) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vabal_s16(a, b, c); return vabal_s16(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_int32x4_private r_, a_ = simde_int32x4_to_private(a);
simde_int16x4_private b_ = simde_int16x4_to_private(b);
simde_int16x4_private c_ = simde_int16x4_to_private(c);
vint32m1_t rst = __riscv_vwsub_vv_i32m1(__riscv_vlmul_trunc_v_i16m1_i16mf2(b_.sv64) , __riscv_vlmul_trunc_v_i16m1_i16mf2(c_.sv64) , 4);
r_.sv128 = __riscv_vadd_vv_i32m1(__riscv_vmax_vv_i32m1(rst , __riscv_vneg_v_i32m1(rst , 4) , 4), a_.sv128, 4);
return simde_int32x4_from_private(r_);
#else #else
return simde_vaddq_s32(simde_vabdl_s16(b, c), a); return simde_vaddq_s32(simde_vabdl_s16(b, c), a);
#endif #endif
...@@ -67,6 +83,13 @@ simde_int64x2_t ...@@ -67,6 +83,13 @@ simde_int64x2_t
simde_vabal_s32(simde_int64x2_t a, simde_int32x2_t b, simde_int32x2_t c) { simde_vabal_s32(simde_int64x2_t a, simde_int32x2_t b, simde_int32x2_t c) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vabal_s32(a, b, c); return vabal_s32(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_int64x2_private r_, a_ = simde_int64x2_to_private(a);
simde_int32x2_private b_ = simde_int32x2_to_private(b);
simde_int32x2_private c_ = simde_int32x2_to_private(c);
vint64m1_t rst = __riscv_vwsub_vv_i64m1(__riscv_vlmul_trunc_v_i32m1_i32mf2(b_.sv64) , __riscv_vlmul_trunc_v_i32m1_i32mf2(c_.sv64) , 2);
r_.sv128 = __riscv_vadd_vv_i64m1(__riscv_vmax_vv_i64m1(rst , __riscv_vneg_v_i64m1(rst , 2) , 2), a_.sv128, 2);
return simde_int64x2_from_private(r_);
#else #else
return simde_vaddq_s64(simde_vabdl_s32(b, c), a); return simde_vaddq_s64(simde_vabdl_s32(b, c), a);
#endif #endif
...@@ -81,6 +104,16 @@ simde_uint16x8_t ...@@ -81,6 +104,16 @@ simde_uint16x8_t
simde_vabal_u8(simde_uint16x8_t a, simde_uint8x8_t b, simde_uint8x8_t c) { simde_vabal_u8(simde_uint16x8_t a, simde_uint8x8_t b, simde_uint8x8_t c) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vabal_u8(a, b, c); return vabal_u8(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_uint16x8_private r_, a_ = simde_uint16x8_to_private(a);
simde_uint8x8_private b_ = simde_uint8x8_to_private(b);
simde_uint8x8_private c_ = simde_uint8x8_to_private(c);
vint16m1_t a_tmp = __riscv_vreinterpret_v_u16m1_i16m1(__riscv_vwcvtu_x_x_v_u16m1(__riscv_vlmul_trunc_v_u8m1_u8mf2(b_.sv64), 8));
vint16m1_t b_tmp = __riscv_vreinterpret_v_u16m1_i16m1(__riscv_vwcvtu_x_x_v_u16m1(__riscv_vlmul_trunc_v_u8m1_u8mf2(c_.sv64), 8));
vint16m1_t rst = __riscv_vsub_vv_i16m1(a_tmp, b_tmp, 8);
r_.sv128 = __riscv_vadd_vv_u16m1(__riscv_vreinterpret_v_i16m1_u16m1(__riscv_vmax_vv_i16m1(rst , __riscv_vneg_v_i16m1(rst , 8) , 8)), \
a_.sv128, 8);
return simde_uint16x8_from_private(r_);
#else #else
return simde_vaddq_u16(simde_vabdl_u8(b, c), a); return simde_vaddq_u16(simde_vabdl_u8(b, c), a);
#endif #endif
...@@ -95,6 +128,16 @@ simde_uint32x4_t ...@@ -95,6 +128,16 @@ simde_uint32x4_t
simde_vabal_u16(simde_uint32x4_t a, simde_uint16x4_t b, simde_uint16x4_t c) { simde_vabal_u16(simde_uint32x4_t a, simde_uint16x4_t b, simde_uint16x4_t c) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vabal_u16(a, b, c); return vabal_u16(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_uint32x4_private r_, a_ = simde_uint32x4_to_private(a);
simde_uint16x4_private b_ = simde_uint16x4_to_private(b);
simde_uint16x4_private c_ = simde_uint16x4_to_private(c);
vint32m1_t a_tmp = __riscv_vreinterpret_v_u32m1_i32m1(__riscv_vwcvtu_x_x_v_u32m1(__riscv_vlmul_trunc_v_u16m1_u16mf2(b_.sv64), 4));
vint32m1_t b_tmp = __riscv_vreinterpret_v_u32m1_i32m1(__riscv_vwcvtu_x_x_v_u32m1(__riscv_vlmul_trunc_v_u16m1_u16mf2(c_.sv64), 4));
vint32m1_t rst = __riscv_vsub_vv_i32m1(a_tmp, b_tmp, 4);
r_.sv128 = __riscv_vadd_vv_u32m1(__riscv_vreinterpret_v_i32m1_u32m1(__riscv_vmax_vv_i32m1(rst , __riscv_vneg_v_i32m1(rst , 4) , 4)), \
a_.sv128, 4);
return simde_uint32x4_from_private(r_);
#else #else
return simde_vaddq_u32(simde_vabdl_u16(b, c), a); return simde_vaddq_u32(simde_vabdl_u16(b, c), a);
#endif #endif
...@@ -109,6 +152,16 @@ simde_uint64x2_t ...@@ -109,6 +152,16 @@ simde_uint64x2_t
simde_vabal_u32(simde_uint64x2_t a, simde_uint32x2_t b, simde_uint32x2_t c) { simde_vabal_u32(simde_uint64x2_t a, simde_uint32x2_t b, simde_uint32x2_t c) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vabal_u32(a, b, c); return vabal_u32(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_uint64x2_private r_, a_ = simde_uint64x2_to_private(a);
simde_uint32x2_private b_ = simde_uint32x2_to_private(b);
simde_uint32x2_private c_ = simde_uint32x2_to_private(c);
vint64m1_t a_tmp = __riscv_vreinterpret_v_u64m1_i64m1(__riscv_vwcvtu_x_x_v_u64m1(__riscv_vlmul_trunc_v_u32m1_u32mf2(b_.sv64), 2));
vint64m1_t b_tmp = __riscv_vreinterpret_v_u64m1_i64m1(__riscv_vwcvtu_x_x_v_u64m1(__riscv_vlmul_trunc_v_u32m1_u32mf2(c_.sv64), 2));
vint64m1_t rst = __riscv_vsub_vv_i64m1(a_tmp, b_tmp, 4);
r_.sv128 = __riscv_vadd_vv_u64m1(__riscv_vreinterpret_v_i64m1_u64m1(__riscv_vmax_vv_i64m1(rst , __riscv_vneg_v_i64m1(rst , 2) , 2)), \
a_.sv128, 2);
return simde_uint64x2_from_private(r_);
#else #else
return simde_vaddq_u64(simde_vabdl_u32(b, c), a); return simde_vaddq_u64(simde_vabdl_u32(b, c), a);
#endif #endif
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* *
* Copyright: * Copyright:
* 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology) * 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology)
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_ABDL_HIGH_H) #if !defined(SIMDE_ARM_NEON_ABDL_HIGH_H)
...@@ -38,6 +39,14 @@ simde_int16x8_t ...@@ -38,6 +39,14 @@ simde_int16x8_t
simde_vabdl_high_s8(simde_int8x16_t a, simde_int8x16_t b) { simde_vabdl_high_s8(simde_int8x16_t a, simde_int8x16_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vabdl_high_s8(a, b); return vabdl_high_s8(a, b);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_int16x8_private r_;
simde_int8x16_private a_ = simde_int8x16_to_private(a);
simde_int8x16_private b_ = simde_int8x16_to_private(b);
vint16m1_t rst = __riscv_vwsub_vv_i16m1(__riscv_vlmul_trunc_v_i8m1_i8mf2(__riscv_vslidedown_vx_i8m1(a_.sv128 , 8 , 16)),
__riscv_vlmul_trunc_v_i8m1_i8mf2(__riscv_vslidedown_vx_i8m1(b_.sv128 , 8 , 16)) , 8);
r_.sv128 = __riscv_vmax_vv_i16m1(rst , __riscv_vneg_v_i16m1(rst , 8) , 8);
return simde_int16x8_from_private(r_);
#else #else
return simde_vabdl_s8(simde_vget_high_s8(a), simde_vget_high_s8(b)); return simde_vabdl_s8(simde_vget_high_s8(a), simde_vget_high_s8(b));
#endif #endif
...@@ -52,6 +61,14 @@ simde_int32x4_t ...@@ -52,6 +61,14 @@ simde_int32x4_t
simde_vabdl_high_s16(simde_int16x8_t a, simde_int16x8_t b) { simde_vabdl_high_s16(simde_int16x8_t a, simde_int16x8_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vabdl_high_s16(a, b); return vabdl_high_s16(a, b);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_int32x4_private r_;
simde_int16x8_private a_ = simde_int16x8_to_private(a);
simde_int16x8_private b_ = simde_int16x8_to_private(b);
vint32m1_t rst = __riscv_vwsub_vv_i32m1(__riscv_vlmul_trunc_v_i16m1_i16mf2(__riscv_vslidedown_vx_i16m1(a_.sv128 , 4 , 8)) , \
__riscv_vlmul_trunc_v_i16m1_i16mf2(__riscv_vslidedown_vx_i16m1(b_.sv128 , 4 , 8)) , 4);
r_.sv128 = __riscv_vmax_vv_i32m1(rst , __riscv_vneg_v_i32m1(rst , 4) , 4);
return simde_int32x4_from_private(r_);
#else #else
return simde_vabdl_s16(simde_vget_high_s16(a), simde_vget_high_s16(b)); return simde_vabdl_s16(simde_vget_high_s16(a), simde_vget_high_s16(b));
#endif #endif
...@@ -66,6 +83,14 @@ simde_int64x2_t ...@@ -66,6 +83,14 @@ simde_int64x2_t
simde_vabdl_high_s32(simde_int32x4_t a, simde_int32x4_t b) { simde_vabdl_high_s32(simde_int32x4_t a, simde_int32x4_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vabdl_high_s32(a, b); return vabdl_high_s32(a, b);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_int64x2_private r_;
simde_int32x4_private a_ = simde_int32x4_to_private(a);
simde_int32x4_private b_ = simde_int32x4_to_private(b);
vint64m1_t rst = __riscv_vwsub_vv_i64m1(__riscv_vlmul_trunc_v_i32m1_i32mf2(__riscv_vslidedown_vx_i32m1(a_.sv128 , 2 , 4)) , \
__riscv_vlmul_trunc_v_i32m1_i32mf2(__riscv_vslidedown_vx_i32m1(b_.sv128 , 2 , 4)) , 2);
r_.sv128 = __riscv_vmax_vv_i64m1(rst , __riscv_vneg_v_i64m1(rst , 2) , 2);
return simde_int64x2_from_private(r_);
#else #else
return simde_vabdl_s32(simde_vget_high_s32(a), simde_vget_high_s32(b)); return simde_vabdl_s32(simde_vget_high_s32(a), simde_vget_high_s32(b));
#endif #endif
...@@ -80,6 +105,17 @@ simde_uint16x8_t ...@@ -80,6 +105,17 @@ simde_uint16x8_t
simde_vabdl_high_u8(simde_uint8x16_t a, simde_uint8x16_t b) { simde_vabdl_high_u8(simde_uint8x16_t a, simde_uint8x16_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vabdl_high_u8(a, b); return vabdl_high_u8(a, b);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_uint16x8_private r_;
simde_uint8x16_private a_ = simde_uint8x16_to_private(a);
simde_uint8x16_private b_ = simde_uint8x16_to_private(b);
vint16m1_t a_tmp = __riscv_vreinterpret_v_u16m1_i16m1(__riscv_vwcvtu_x_x_v_u16m1( \
__riscv_vlmul_trunc_v_u8m1_u8mf2(__riscv_vslidedown_vx_u8m1(a_.sv128 , 8 , 16)), 8));
vint16m1_t b_tmp = __riscv_vreinterpret_v_u16m1_i16m1(__riscv_vwcvtu_x_x_v_u16m1( \
__riscv_vlmul_trunc_v_u8m1_u8mf2(__riscv_vslidedown_vx_u8m1(b_.sv128 , 8 , 16)), 8));
vint16m1_t rst = __riscv_vsub_vv_i16m1(a_tmp, b_tmp, 8);
r_.sv128 = __riscv_vreinterpret_v_i16m1_u16m1(__riscv_vmax_vv_i16m1(rst , __riscv_vneg_v_i16m1(rst , 8) , 8));
return simde_uint16x8_from_private(r_);
#else #else
return simde_vabdl_u8(simde_vget_high_u8(a), simde_vget_high_u8(b)); return simde_vabdl_u8(simde_vget_high_u8(a), simde_vget_high_u8(b));
#endif #endif
...@@ -94,6 +130,17 @@ simde_uint32x4_t ...@@ -94,6 +130,17 @@ simde_uint32x4_t
simde_vabdl_high_u16(simde_uint16x8_t a, simde_uint16x8_t b) { simde_vabdl_high_u16(simde_uint16x8_t a, simde_uint16x8_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vabdl_high_u16(a, b); return vabdl_high_u16(a, b);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_uint32x4_private r_;
simde_uint16x8_private a_ = simde_uint16x8_to_private(a);
simde_uint16x8_private b_ = simde_uint16x8_to_private(b);
vint32m1_t a_tmp = __riscv_vreinterpret_v_u32m1_i32m1(__riscv_vwcvtu_x_x_v_u32m1( \
__riscv_vlmul_trunc_v_u16m1_u16mf2(__riscv_vslidedown_vx_u16m1(a_.sv128 , 4 , 8)), 4));
vint32m1_t b_tmp = __riscv_vreinterpret_v_u32m1_i32m1(__riscv_vwcvtu_x_x_v_u32m1( \
__riscv_vlmul_trunc_v_u16m1_u16mf2(__riscv_vslidedown_vx_u16m1(b_.sv128 , 4 , 8)), 4));
vint32m1_t rst = __riscv_vsub_vv_i32m1(a_tmp, b_tmp, 4);
r_.sv128 = __riscv_vreinterpret_v_i32m1_u32m1(__riscv_vmax_vv_i32m1(rst , __riscv_vneg_v_i32m1(rst , 4) , 4));
return simde_uint32x4_from_private(r_);
#else #else
return simde_vabdl_u16(simde_vget_high_u16(a), simde_vget_high_u16(b)); return simde_vabdl_u16(simde_vget_high_u16(a), simde_vget_high_u16(b));
#endif #endif
...@@ -108,6 +155,17 @@ simde_uint64x2_t ...@@ -108,6 +155,17 @@ simde_uint64x2_t
simde_vabdl_high_u32(simde_uint32x4_t a, simde_uint32x4_t b) { simde_vabdl_high_u32(simde_uint32x4_t a, simde_uint32x4_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vabdl_high_u32(a, b); return vabdl_high_u32(a, b);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_uint64x2_private r_;
simde_uint32x4_private a_ = simde_uint32x4_to_private(a);
simde_uint32x4_private b_ = simde_uint32x4_to_private(b);
vint64m1_t a_tmp = __riscv_vreinterpret_v_u64m1_i64m1(__riscv_vwcvtu_x_x_v_u64m1( \
__riscv_vlmul_trunc_v_u32m1_u32mf2(__riscv_vslidedown_vx_u32m1(a_.sv128 , 2 , 4)), 2));
vint64m1_t b_tmp = __riscv_vreinterpret_v_u64m1_i64m1(__riscv_vwcvtu_x_x_v_u64m1( \
__riscv_vlmul_trunc_v_u32m1_u32mf2(__riscv_vslidedown_vx_u32m1(b_.sv128 , 2 , 4)), 2));
vint64m1_t rst = __riscv_vsub_vv_i64m1(a_tmp, b_tmp, 4);
r_.sv128 = __riscv_vreinterpret_v_i64m1_u64m1(__riscv_vmax_vv_i64m1(rst , __riscv_vneg_v_i64m1(rst , 2) , 2));
return simde_uint64x2_from_private(r_);
#else #else
return simde_vabdl_u32(simde_vget_high_u32(a), simde_vget_high_u32(b)); return simde_vabdl_u32(simde_vget_high_u32(a), simde_vget_high_u32(b));
#endif #endif
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* Copyright: * Copyright:
* 2020 Evan Nemerson <evan@nemerson.com> * 2020 Evan Nemerson <evan@nemerson.com>
* 2020 Sean Maher <seanptmaher@gmail.com> (Copyright owned by Google, LLC) * 2020 Sean Maher <seanptmaher@gmail.com> (Copyright owned by Google, LLC)
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_ADDW_H) #if !defined(SIMDE_ARM_NEON_ADDW_H)
...@@ -41,14 +42,17 @@ simde_int16x8_t ...@@ -41,14 +42,17 @@ simde_int16x8_t
simde_vaddw_s8(simde_int16x8_t a, simde_int8x8_t b) { simde_vaddw_s8(simde_int16x8_t a, simde_int8x8_t b) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vaddw_s8(a, b); return vaddw_s8(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_s16(a, simde_vmovl_s8(b)); return simde_vaddq_s16(a, simde_vmovl_s8(b));
#else #else
simde_int16x8_private r_; simde_int16x8_private r_;
simde_int16x8_private a_ = simde_int16x8_to_private(a); simde_int16x8_private a_ = simde_int16x8_to_private(a);
simde_int8x8_private b_ = simde_int8x8_to_private(b); simde_int8x8_private b_ = simde_int8x8_to_private(b);
#if (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
vint8mf2_t vb = __riscv_vlmul_trunc_v_i8m1_i8mf2 (b_.sv64);
r_.sv128 = __riscv_vwadd_wv_i16m1(a_.sv128, vb, 8);
#elif (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, b_.values); SIMDE_CONVERT_VECTOR_(r_.values, b_.values);
r_.values += a_.values; r_.values += a_.values;
#else #else
...@@ -71,14 +75,17 @@ simde_int32x4_t ...@@ -71,14 +75,17 @@ simde_int32x4_t
simde_vaddw_s16(simde_int32x4_t a, simde_int16x4_t b) { simde_vaddw_s16(simde_int32x4_t a, simde_int16x4_t b) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vaddw_s16(a, b); return vaddw_s16(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_s32(a, simde_vmovl_s16(b)); return simde_vaddq_s32(a, simde_vmovl_s16(b));
#else #else
simde_int32x4_private r_; simde_int32x4_private r_;
simde_int32x4_private a_ = simde_int32x4_to_private(a); simde_int32x4_private a_ = simde_int32x4_to_private(a);
simde_int16x4_private b_ = simde_int16x4_to_private(b); simde_int16x4_private b_ = simde_int16x4_to_private(b);
#if (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
vint16mf2_t vb = __riscv_vlmul_trunc_v_i16m1_i16mf2 (b_.sv64);
r_.sv128 = __riscv_vwadd_wv_i32m1(a_.sv128, vb, 4);
#elif (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, b_.values); SIMDE_CONVERT_VECTOR_(r_.values, b_.values);
r_.values += a_.values; r_.values += a_.values;
#else #else
...@@ -101,14 +108,17 @@ simde_int64x2_t ...@@ -101,14 +108,17 @@ simde_int64x2_t
simde_vaddw_s32(simde_int64x2_t a, simde_int32x2_t b) { simde_vaddw_s32(simde_int64x2_t a, simde_int32x2_t b) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vaddw_s32(a, b); return vaddw_s32(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_s64(a, simde_vmovl_s32(b)); return simde_vaddq_s64(a, simde_vmovl_s32(b));
#else #else
simde_int64x2_private r_; simde_int64x2_private r_;
simde_int64x2_private a_ = simde_int64x2_to_private(a); simde_int64x2_private a_ = simde_int64x2_to_private(a);
simde_int32x2_private b_ = simde_int32x2_to_private(b); simde_int32x2_private b_ = simde_int32x2_to_private(b);
#if (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
vint32mf2_t vb = __riscv_vlmul_trunc_v_i32m1_i32mf2 (b_.sv64);
r_.sv128 = __riscv_vwadd_wv_i64m1(a_.sv128, vb, 2);
#elif (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, b_.values); SIMDE_CONVERT_VECTOR_(r_.values, b_.values);
r_.values += a_.values; r_.values += a_.values;
#else #else
...@@ -131,14 +141,17 @@ simde_uint16x8_t ...@@ -131,14 +141,17 @@ simde_uint16x8_t
simde_vaddw_u8(simde_uint16x8_t a, simde_uint8x8_t b) { simde_vaddw_u8(simde_uint16x8_t a, simde_uint8x8_t b) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vaddw_u8(a, b); return vaddw_u8(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_u16(a, simde_vmovl_u8(b)); return simde_vaddq_u16(a, simde_vmovl_u8(b));
#else #else
simde_uint16x8_private r_; simde_uint16x8_private r_;
simde_uint16x8_private a_ = simde_uint16x8_to_private(a); simde_uint16x8_private a_ = simde_uint16x8_to_private(a);
simde_uint8x8_private b_ = simde_uint8x8_to_private(b); simde_uint8x8_private b_ = simde_uint8x8_to_private(b);
#if (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
vuint8mf2_t vb = __riscv_vlmul_trunc_v_u8m1_u8mf2 (b_.sv64);
r_.sv128 = __riscv_vwaddu_wv_u16m1(a_.sv128, vb, 8);
#elif (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, b_.values); SIMDE_CONVERT_VECTOR_(r_.values, b_.values);
r_.values += a_.values; r_.values += a_.values;
#else #else
...@@ -161,14 +174,17 @@ simde_uint32x4_t ...@@ -161,14 +174,17 @@ simde_uint32x4_t
simde_vaddw_u16(simde_uint32x4_t a, simde_uint16x4_t b) { simde_vaddw_u16(simde_uint32x4_t a, simde_uint16x4_t b) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vaddw_u16(a, b); return vaddw_u16(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_u32(a, simde_vmovl_u16(b)); return simde_vaddq_u32(a, simde_vmovl_u16(b));
#else #else
simde_uint32x4_private r_; simde_uint32x4_private r_;
simde_uint32x4_private a_ = simde_uint32x4_to_private(a); simde_uint32x4_private a_ = simde_uint32x4_to_private(a);
simde_uint16x4_private b_ = simde_uint16x4_to_private(b); simde_uint16x4_private b_ = simde_uint16x4_to_private(b);
#if (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
vuint16mf2_t vb = __riscv_vlmul_trunc_v_u16m1_u16mf2 (b_.sv64);
r_.sv128 = __riscv_vwaddu_wv_u32m1(a_.sv128, vb, 4);
#elif (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, b_.values); SIMDE_CONVERT_VECTOR_(r_.values, b_.values);
r_.values += a_.values; r_.values += a_.values;
#else #else
...@@ -191,14 +207,17 @@ simde_uint64x2_t ...@@ -191,14 +207,17 @@ simde_uint64x2_t
simde_vaddw_u32(simde_uint64x2_t a, simde_uint32x2_t b) { simde_vaddw_u32(simde_uint64x2_t a, simde_uint32x2_t b) {
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
return vaddw_u32(a, b); return vaddw_u32(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_u64(a, simde_vmovl_u32(b)); return simde_vaddq_u64(a, simde_vmovl_u32(b));
#else #else
simde_uint64x2_private r_; simde_uint64x2_private r_;
simde_uint64x2_private a_ = simde_uint64x2_to_private(a); simde_uint64x2_private a_ = simde_uint64x2_to_private(a);
simde_uint32x2_private b_ = simde_uint32x2_to_private(b); simde_uint32x2_private b_ = simde_uint32x2_to_private(b);
#if (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
vuint32mf2_t vb = __riscv_vlmul_trunc_v_u32m1_u32mf2 (b_.sv64);
r_.sv128 = __riscv_vwaddu_wv_u64m1(a_.sv128, vb, 2);
#elif (SIMDE_NATURAL_VECTOR_SIZE > 0) && defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, b_.values); SIMDE_CONVERT_VECTOR_(r_.values, b_.values);
r_.values += a_.values; r_.values += a_.values;
#else #else
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* *
* Copyright: * Copyright:
* 2020 Evan Nemerson <evan@nemerson.com> * 2020 Evan Nemerson <evan@nemerson.com>
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_ADDW_HIGH_H) #if !defined(SIMDE_ARM_NEON_ADDW_HIGH_H)
...@@ -30,6 +31,7 @@ ...@@ -30,6 +31,7 @@
#include "types.h" #include "types.h"
#include "movl_high.h" #include "movl_high.h"
#include "add.h" #include "add.h"
#include "addw.h"
HEDLEY_DIAGNOSTIC_PUSH HEDLEY_DIAGNOSTIC_PUSH
SIMDE_DISABLE_UNWANTED_DIAGNOSTICS SIMDE_DISABLE_UNWANTED_DIAGNOSTICS
...@@ -40,17 +42,22 @@ simde_int16x8_t ...@@ -40,17 +42,22 @@ simde_int16x8_t
simde_vaddw_high_s8(simde_int16x8_t a, simde_int8x16_t b) { simde_vaddw_high_s8(simde_int16x8_t a, simde_int8x16_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vaddw_high_s8(a, b); return vaddw_high_s8(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_s16(a, simde_vmovl_high_s8(b)); return simde_vaddq_s16(a, simde_vmovl_high_s8(b));
#else #else
simde_int16x8_private r_; simde_int16x8_private r_;
simde_int16x8_private a_ = simde_int16x8_to_private(a); simde_int16x8_private a_ = simde_int16x8_to_private(a);
simde_int8x16_private b_ = simde_int8x16_to_private(b); simde_int8x16_private b_ = simde_int8x16_to_private(b);
SIMDE_VECTORIZE #if defined(SIMDE_RISCV_V_NATIVE)
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { vint8mf2_t b_high = __riscv_vlmul_trunc_v_i8m1_i8mf2(__riscv_vslidedown_vx_i8m1(b_.sv128 , 8 , 16));
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)]; r_.sv128 = __riscv_vwadd_wv_i16m1(a_.sv128, b_high, 8);
} #else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)];
}
#endif
return simde_int16x8_from_private(r_); return simde_int16x8_from_private(r_);
#endif #endif
...@@ -65,17 +72,22 @@ simde_int32x4_t ...@@ -65,17 +72,22 @@ simde_int32x4_t
simde_vaddw_high_s16(simde_int32x4_t a, simde_int16x8_t b) { simde_vaddw_high_s16(simde_int32x4_t a, simde_int16x8_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vaddw_high_s16(a, b); return vaddw_high_s16(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_s32(a, simde_vmovl_high_s16(b)); return simde_vaddq_s32(a, simde_vmovl_high_s16(b));
#else #else
simde_int32x4_private r_; simde_int32x4_private r_;
simde_int32x4_private a_ = simde_int32x4_to_private(a); simde_int32x4_private a_ = simde_int32x4_to_private(a);
simde_int16x8_private b_ = simde_int16x8_to_private(b); simde_int16x8_private b_ = simde_int16x8_to_private(b);
SIMDE_VECTORIZE #if defined(SIMDE_RISCV_V_NATIVE)
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { vint16mf2_t b_high = __riscv_vlmul_trunc_v_i16m1_i16mf2(__riscv_vslidedown_vx_i16m1(b_.sv128 , 4 , 8));
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)]; r_.sv128 = __riscv_vwadd_wv_i32m1(a_.sv128, b_high, 4);
} #else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)];
}
#endif
return simde_int32x4_from_private(r_); return simde_int32x4_from_private(r_);
#endif #endif
...@@ -90,18 +102,21 @@ simde_int64x2_t ...@@ -90,18 +102,21 @@ simde_int64x2_t
simde_vaddw_high_s32(simde_int64x2_t a, simde_int32x4_t b) { simde_vaddw_high_s32(simde_int64x2_t a, simde_int32x4_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vaddw_high_s32(a, b); return vaddw_high_s32(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_s64(a, simde_vmovl_high_s32(b)); return simde_vaddq_s64(a, simde_vmovl_high_s32(b));
#else #else
simde_int64x2_private r_; simde_int64x2_private r_;
simde_int64x2_private a_ = simde_int64x2_to_private(a); simde_int64x2_private a_ = simde_int64x2_to_private(a);
simde_int32x4_private b_ = simde_int32x4_to_private(b); simde_int32x4_private b_ = simde_int32x4_to_private(b);
#if defined(SIMDE_RISCV_V_NATIVE)
SIMDE_VECTORIZE vint32mf2_t b_high = __riscv_vlmul_trunc_v_i32m1_i32mf2(__riscv_vslidedown_vx_i32m1(b_.sv128 , 2 , 4));
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { r_.sv128 = __riscv_vwadd_wv_i64m1(a_.sv128, b_high, 2);
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)]; #else
} SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)];
}
#endif
return simde_int64x2_from_private(r_); return simde_int64x2_from_private(r_);
#endif #endif
} }
...@@ -115,18 +130,21 @@ simde_uint16x8_t ...@@ -115,18 +130,21 @@ simde_uint16x8_t
simde_vaddw_high_u8(simde_uint16x8_t a, simde_uint8x16_t b) { simde_vaddw_high_u8(simde_uint16x8_t a, simde_uint8x16_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vaddw_high_u8(a, b); return vaddw_high_u8(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_u16(a, simde_vmovl_high_u8(b)); return simde_vaddq_u16(a, simde_vmovl_high_u8(b));
#else #else
simde_uint16x8_private r_; simde_uint16x8_private r_;
simde_uint16x8_private a_ = simde_uint16x8_to_private(a); simde_uint16x8_private a_ = simde_uint16x8_to_private(a);
simde_uint8x16_private b_ = simde_uint8x16_to_private(b); simde_uint8x16_private b_ = simde_uint8x16_to_private(b);
#if defined(SIMDE_RISCV_V_NATIVE)
SIMDE_VECTORIZE vuint8mf2_t b_high = __riscv_vlmul_trunc_v_u8m1_u8mf2(__riscv_vslidedown_vx_u8m1(b_.sv128 , 8 , 16));
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { r_.sv128 = __riscv_vwaddu_wv_u16m1(a_.sv128, b_high, 8);
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)]; #else
} SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)];
}
#endif
return simde_uint16x8_from_private(r_); return simde_uint16x8_from_private(r_);
#endif #endif
} }
...@@ -140,18 +158,21 @@ simde_uint32x4_t ...@@ -140,18 +158,21 @@ simde_uint32x4_t
simde_vaddw_high_u16(simde_uint32x4_t a, simde_uint16x8_t b) { simde_vaddw_high_u16(simde_uint32x4_t a, simde_uint16x8_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vaddw_high_u16(a, b); return vaddw_high_u16(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_u32(a, simde_vmovl_high_u16(b)); return simde_vaddq_u32(a, simde_vmovl_high_u16(b));
#else #else
simde_uint32x4_private r_; simde_uint32x4_private r_;
simde_uint32x4_private a_ = simde_uint32x4_to_private(a); simde_uint32x4_private a_ = simde_uint32x4_to_private(a);
simde_uint16x8_private b_ = simde_uint16x8_to_private(b); simde_uint16x8_private b_ = simde_uint16x8_to_private(b);
#if defined(SIMDE_RISCV_V_NATIVE)
SIMDE_VECTORIZE vuint16mf2_t b_high = __riscv_vlmul_trunc_v_u16m1_u16mf2(__riscv_vslidedown_vx_u16m1(b_.sv128 , 4 , 8));
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { r_.sv128 = __riscv_vwaddu_wv_u32m1(a_.sv128, b_high, 4);
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)]; #else
} SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)];
}
#endif
return simde_uint32x4_from_private(r_); return simde_uint32x4_from_private(r_);
#endif #endif
} }
...@@ -165,18 +186,21 @@ simde_uint64x2_t ...@@ -165,18 +186,21 @@ simde_uint64x2_t
simde_vaddw_high_u32(simde_uint64x2_t a, simde_uint32x4_t b) { simde_vaddw_high_u32(simde_uint64x2_t a, simde_uint32x4_t b) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE)
return vaddw_high_u32(a, b); return vaddw_high_u32(a, b);
#elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) #elif SIMDE_NATURAL_VECTOR_SIZE_GE(128) && !defined(SIMDE_RISCV_V_NATIVE)
return simde_vaddq_u64(a, simde_vmovl_high_u32(b)); return simde_vaddq_u64(a, simde_vmovl_high_u32(b));
#else #else
simde_uint64x2_private r_; simde_uint64x2_private r_;
simde_uint64x2_private a_ = simde_uint64x2_to_private(a); simde_uint64x2_private a_ = simde_uint64x2_to_private(a);
simde_uint32x4_private b_ = simde_uint32x4_to_private(b); simde_uint32x4_private b_ = simde_uint32x4_to_private(b);
#if defined(SIMDE_RISCV_V_NATIVE)
SIMDE_VECTORIZE vuint32mf2_t b_high = __riscv_vlmul_trunc_v_u32m1_u32mf2(__riscv_vslidedown_vx_u32m1(b_.sv128 , 2 , 4));
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { r_.sv128 = __riscv_vwaddu_wv_u64m1(a_.sv128, b_high, 2);
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)]; #else
} SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] + b_.values[i + ((sizeof(b_.values) / sizeof(b_.values[0])) / 2)];
}
#endif
return simde_uint64x2_from_private(r_); return simde_uint64x2_from_private(r_);
#endif #endif
} }
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* *
* Copyright: * Copyright:
* 2021 Atharva Nimbalkar <atharvakn@gmail.com> * 2021 Atharva Nimbalkar <atharvakn@gmail.com>
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_BCAX_H) #if !defined(SIMDE_ARM_NEON_BCAX_H)
...@@ -41,6 +42,15 @@ simde_uint8x16_t ...@@ -41,6 +42,15 @@ simde_uint8x16_t
simde_vbcaxq_u8(simde_uint8x16_t a, simde_uint8x16_t b, simde_uint8x16_t c) { simde_vbcaxq_u8(simde_uint8x16_t a, simde_uint8x16_t b, simde_uint8x16_t c) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3)
return vbcaxq_u8(a, b, c); return vbcaxq_u8(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_uint8x16_private
r_,
a_ = simde_uint8x16_to_private(a),
b_ = simde_uint8x16_to_private(b),
c_ = simde_uint8x16_to_private(c);
r_.sv128 = __riscv_vxor_vv_u8m1(a_.sv128, __riscv_vand_vv_u8m1(b_.sv128 , \
__riscv_vnot_v_u8m1(c_.sv128 , 16), 16), 16);
return simde_uint8x16_from_private(r_);
#else #else
return simde_veorq_u8(a, simde_vbicq_u8(b, c)); return simde_veorq_u8(a, simde_vbicq_u8(b, c));
#endif #endif
...@@ -55,6 +65,15 @@ simde_uint16x8_t ...@@ -55,6 +65,15 @@ simde_uint16x8_t
simde_vbcaxq_u16(simde_uint16x8_t a, simde_uint16x8_t b, simde_uint16x8_t c) { simde_vbcaxq_u16(simde_uint16x8_t a, simde_uint16x8_t b, simde_uint16x8_t c) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3)
return vbcaxq_u16(a, b, c); return vbcaxq_u16(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_uint16x8_private
r_,
a_ = simde_uint16x8_to_private(a),
b_ = simde_uint16x8_to_private(b),
c_ = simde_uint16x8_to_private(c);
r_.sv128 = __riscv_vxor_vv_u16m1(a_.sv128, __riscv_vand_vv_u16m1(b_.sv128 , \
__riscv_vnot_v_u16m1(c_.sv128 , 8), 8), 8);
return simde_uint16x8_from_private(r_);
#else #else
return simde_veorq_u16(a, simde_vbicq_u16(b, c)); return simde_veorq_u16(a, simde_vbicq_u16(b, c));
#endif #endif
...@@ -69,6 +88,15 @@ simde_uint32x4_t ...@@ -69,6 +88,15 @@ simde_uint32x4_t
simde_vbcaxq_u32(simde_uint32x4_t a, simde_uint32x4_t b, simde_uint32x4_t c) { simde_vbcaxq_u32(simde_uint32x4_t a, simde_uint32x4_t b, simde_uint32x4_t c) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3)
return vbcaxq_u32(a, b, c); return vbcaxq_u32(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_uint32x4_private
r_,
a_ = simde_uint32x4_to_private(a),
b_ = simde_uint32x4_to_private(b),
c_ = simde_uint32x4_to_private(c);
r_.sv128 = __riscv_vxor_vv_u32m1(a_.sv128, __riscv_vand_vv_u32m1(b_.sv128 , \
__riscv_vnot_v_u32m1(c_.sv128 , 4), 4), 4);
return simde_uint32x4_from_private(r_);
#else #else
return simde_veorq_u32(a, simde_vbicq_u32(b, c)); return simde_veorq_u32(a, simde_vbicq_u32(b, c));
#endif #endif
...@@ -83,6 +111,15 @@ simde_uint64x2_t ...@@ -83,6 +111,15 @@ simde_uint64x2_t
simde_vbcaxq_u64(simde_uint64x2_t a, simde_uint64x2_t b, simde_uint64x2_t c) { simde_vbcaxq_u64(simde_uint64x2_t a, simde_uint64x2_t b, simde_uint64x2_t c) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3)
return vbcaxq_u64(a, b, c); return vbcaxq_u64(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_uint64x2_private
r_,
a_ = simde_uint64x2_to_private(a),
b_ = simde_uint64x2_to_private(b),
c_ = simde_uint64x2_to_private(c);
r_.sv128 = __riscv_vxor_vv_u64m1(a_.sv128, __riscv_vand_vv_u64m1(b_.sv128 , \
__riscv_vnot_v_u64m1(c_.sv128 , 2), 2), 2);
return simde_uint64x2_from_private(r_);
#else #else
return simde_veorq_u64(a, simde_vbicq_u64(b, c)); return simde_veorq_u64(a, simde_vbicq_u64(b, c));
#endif #endif
...@@ -97,6 +134,15 @@ simde_int8x16_t ...@@ -97,6 +134,15 @@ simde_int8x16_t
simde_vbcaxq_s8(simde_int8x16_t a, simde_int8x16_t b, simde_int8x16_t c) { simde_vbcaxq_s8(simde_int8x16_t a, simde_int8x16_t b, simde_int8x16_t c) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3)
return vbcaxq_s8(a, b, c); return vbcaxq_s8(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_int8x16_private
r_,
a_ = simde_int8x16_to_private(a),
b_ = simde_int8x16_to_private(b),
c_ = simde_int8x16_to_private(c);
r_.sv128 = __riscv_vxor_vv_i8m1(a_.sv128, __riscv_vand_vv_i8m1(b_.sv128 , \
__riscv_vnot_v_i8m1(c_.sv128 , 16), 16), 16);
return simde_int8x16_from_private(r_);
#else #else
return simde_veorq_s8(a, simde_vbicq_s8(b, c)); return simde_veorq_s8(a, simde_vbicq_s8(b, c));
#endif #endif
...@@ -111,6 +157,15 @@ simde_int16x8_t ...@@ -111,6 +157,15 @@ simde_int16x8_t
simde_vbcaxq_s16(simde_int16x8_t a, simde_int16x8_t b, simde_int16x8_t c) { simde_vbcaxq_s16(simde_int16x8_t a, simde_int16x8_t b, simde_int16x8_t c) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3)
return vbcaxq_s16(a, b, c); return vbcaxq_s16(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_int16x8_private
r_,
a_ = simde_int16x8_to_private(a),
b_ = simde_int16x8_to_private(b),
c_ = simde_int16x8_to_private(c);
r_.sv128 = __riscv_vxor_vv_i16m1(a_.sv128, __riscv_vand_vv_i16m1(b_.sv128 , \
__riscv_vnot_v_i16m1(c_.sv128 , 8), 8), 8);
return simde_int16x8_from_private(r_);
#else #else
return simde_veorq_s16(a,simde_vbicq_s16(b, c)); return simde_veorq_s16(a,simde_vbicq_s16(b, c));
#endif #endif
...@@ -125,6 +180,15 @@ simde_int32x4_t ...@@ -125,6 +180,15 @@ simde_int32x4_t
simde_vbcaxq_s32(simde_int32x4_t a, simde_int32x4_t b, simde_int32x4_t c) { simde_vbcaxq_s32(simde_int32x4_t a, simde_int32x4_t b, simde_int32x4_t c) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3)
return vbcaxq_s32(a, b, c); return vbcaxq_s32(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_int32x4_private
r_,
a_ = simde_int32x4_to_private(a),
b_ = simde_int32x4_to_private(b),
c_ = simde_int32x4_to_private(c);
r_.sv128 = __riscv_vxor_vv_i32m1(a_.sv128, __riscv_vand_vv_i32m1(b_.sv128 , \
__riscv_vnot_v_i32m1(c_.sv128 , 4), 4), 4);
return simde_int32x4_from_private(r_);
#else #else
return simde_veorq_s32(a, simde_vbicq_s32(b, c)); return simde_veorq_s32(a, simde_vbicq_s32(b, c));
#endif #endif
...@@ -139,6 +203,15 @@ simde_int64x2_t ...@@ -139,6 +203,15 @@ simde_int64x2_t
simde_vbcaxq_s64(simde_int64x2_t a, simde_int64x2_t b, simde_int64x2_t c) { simde_vbcaxq_s64(simde_int64x2_t a, simde_int64x2_t b, simde_int64x2_t c) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARCH_ARM_SHA3)
return vbcaxq_s64(a, b, c); return vbcaxq_s64(a, b, c);
#elif defined(SIMDE_RISCV_V_NATIVE)
simde_int64x2_private
r_,
a_ = simde_int64x2_to_private(a),
b_ = simde_int64x2_to_private(b),
c_ = simde_int64x2_to_private(c);
r_.sv128 = __riscv_vxor_vv_i64m1(a_.sv128, __riscv_vand_vv_i64m1(b_.sv128 , \
__riscv_vnot_v_i64m1(c_.sv128 , 2), 2), 2);
return simde_int64x2_from_private(r_);
#else #else
return simde_veorq_s64(a, simde_vbicq_s64(b, c)); return simde_veorq_s64(a, simde_vbicq_s64(b, c));
#endif #endif
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* *
* Copyright: * Copyright:
* 2020 Evan Nemerson <evan@nemerson.com> * 2020 Evan Nemerson <evan@nemerson.com>
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_BIC_H) #if !defined(SIMDE_ARM_NEON_BIC_H)
...@@ -48,9 +49,13 @@ simde_vbic_s8(simde_int8x8_t a, simde_int8x8_t b) { ...@@ -48,9 +49,13 @@ simde_vbic_s8(simde_int8x8_t a, simde_int8x8_t b) {
#if defined(SIMDE_X86_MMX_NATIVE) #if defined(SIMDE_X86_MMX_NATIVE)
r_.m64 = _mm_andnot_si64(b_.m64, a_.m64); r_.m64 = _mm_andnot_si64(b_.m64, a_.m64);
#else #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
r_.values[i] = a_.values[i] & ~b_.values[i]; r_.sv64 = __riscv_vand_vv_i8m1(a_.sv64 , __riscv_vnot_v_i8m1(b_.sv64 , 8) , 8);
} #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] & ~b_.values[i];
}
#endif
#endif #endif
return simde_int8x8_from_private(r_); return simde_int8x8_from_private(r_);
...@@ -75,9 +80,13 @@ simde_vbic_s16(simde_int16x4_t a, simde_int16x4_t b) { ...@@ -75,9 +80,13 @@ simde_vbic_s16(simde_int16x4_t a, simde_int16x4_t b) {
#if defined(SIMDE_X86_MMX_NATIVE) #if defined(SIMDE_X86_MMX_NATIVE)
r_.m64 = _mm_andnot_si64(b_.m64, a_.m64); r_.m64 = _mm_andnot_si64(b_.m64, a_.m64);
#else #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
r_.values[i] = a_.values[i] & ~b_.values[i]; r_.sv64 = __riscv_vand_vv_i16m1(a_.sv64 , __riscv_vnot_v_i16m1(b_.sv64 , 4) , 4);
} #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] & ~b_.values[i];
}
#endif
#endif #endif
return simde_int16x4_from_private(r_); return simde_int16x4_from_private(r_);
...@@ -102,9 +111,13 @@ simde_vbic_s32(simde_int32x2_t a, simde_int32x2_t b) { ...@@ -102,9 +111,13 @@ simde_vbic_s32(simde_int32x2_t a, simde_int32x2_t b) {
#if defined(SIMDE_X86_MMX_NATIVE) #if defined(SIMDE_X86_MMX_NATIVE)
r_.m64 = _mm_andnot_si64(b_.m64, a_.m64); r_.m64 = _mm_andnot_si64(b_.m64, a_.m64);
#else #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
r_.values[i] = a_.values[i] & ~b_.values[i]; r_.sv64 = __riscv_vand_vv_i32m1(a_.sv64 , __riscv_vnot_v_i32m1(b_.sv64 , 2) , 2);
} #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] & ~b_.values[i];
}
#endif
#endif #endif
return simde_int32x2_from_private(r_); return simde_int32x2_from_private(r_);
...@@ -129,9 +142,13 @@ simde_vbic_s64(simde_int64x1_t a, simde_int64x1_t b) { ...@@ -129,9 +142,13 @@ simde_vbic_s64(simde_int64x1_t a, simde_int64x1_t b) {
#if defined(SIMDE_X86_MMX_NATIVE) #if defined(SIMDE_X86_MMX_NATIVE)
r_.m64 = _mm_andnot_si64(b_.m64, a_.m64); r_.m64 = _mm_andnot_si64(b_.m64, a_.m64);
#else #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
r_.values[i] = a_.values[i] & ~b_.values[i]; r_.sv64 = __riscv_vand_vv_i64m1(a_.sv64 , __riscv_vnot_v_i64m1(b_.sv64 , 1) , 1);
} #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] & ~b_.values[i];
}
#endif
#endif #endif
return simde_int64x1_from_private(r_); return simde_int64x1_from_private(r_);
...@@ -156,9 +173,13 @@ simde_vbic_u8(simde_uint8x8_t a, simde_uint8x8_t b) { ...@@ -156,9 +173,13 @@ simde_vbic_u8(simde_uint8x8_t a, simde_uint8x8_t b) {
#if defined(SIMDE_X86_MMX_NATIVE) #if defined(SIMDE_X86_MMX_NATIVE)
r_.m64 = _mm_andnot_si64(b_.m64, a_.m64); r_.m64 = _mm_andnot_si64(b_.m64, a_.m64);
#else #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
r_.values[i] = a_.values[i] & ~b_.values[i]; r_.sv64 = __riscv_vand_vv_u8m1(a_.sv64 , __riscv_vnot_v_u8m1(b_.sv64 , 8) , 8);
} #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] & ~b_.values[i];
}
#endif
#endif #endif
return simde_uint8x8_from_private(r_); return simde_uint8x8_from_private(r_);
...@@ -183,9 +204,13 @@ simde_vbic_u16(simde_uint16x4_t a, simde_uint16x4_t b) { ...@@ -183,9 +204,13 @@ simde_vbic_u16(simde_uint16x4_t a, simde_uint16x4_t b) {
#if defined(SIMDE_X86_MMX_NATIVE) #if defined(SIMDE_X86_MMX_NATIVE)
r_.m64 = _mm_andnot_si64(b_.m64, a_.m64); r_.m64 = _mm_andnot_si64(b_.m64, a_.m64);
#else #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
r_.values[i] = a_.values[i] & ~b_.values[i]; r_.sv64 = __riscv_vand_vv_u16m1(a_.sv64 , __riscv_vnot_v_u16m1(b_.sv64 , 4) , 4);
} #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] & ~b_.values[i];
}
#endif
#endif #endif
return simde_uint16x4_from_private(r_); return simde_uint16x4_from_private(r_);
...@@ -210,9 +235,13 @@ simde_vbic_u32(simde_uint32x2_t a, simde_uint32x2_t b) { ...@@ -210,9 +235,13 @@ simde_vbic_u32(simde_uint32x2_t a, simde_uint32x2_t b) {
#if defined(SIMDE_X86_MMX_NATIVE) #if defined(SIMDE_X86_MMX_NATIVE)
r_.m64 = _mm_andnot_si64(b_.m64, a_.m64); r_.m64 = _mm_andnot_si64(b_.m64, a_.m64);
#else #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
r_.values[i] = a_.values[i] & ~b_.values[i]; r_.sv64 = __riscv_vand_vv_u32m1(a_.sv64 , __riscv_vnot_v_u32m1(b_.sv64 , 2) , 2);
} #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] & ~b_.values[i];
}
#endif
#endif #endif
return simde_uint32x2_from_private(r_); return simde_uint32x2_from_private(r_);
...@@ -237,9 +266,13 @@ simde_vbic_u64(simde_uint64x1_t a, simde_uint64x1_t b) { ...@@ -237,9 +266,13 @@ simde_vbic_u64(simde_uint64x1_t a, simde_uint64x1_t b) {
#if defined(SIMDE_X86_MMX_NATIVE) #if defined(SIMDE_X86_MMX_NATIVE)
r_.m64 = _mm_andnot_si64(b_.m64, a_.m64); r_.m64 = _mm_andnot_si64(b_.m64, a_.m64);
#else #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
r_.values[i] = a_.values[i] & ~b_.values[i]; r_.sv64 = __riscv_vand_vv_u64m1(a_.sv64 , __riscv_vnot_v_u64m1(b_.sv64 , 1) , 1);
} #else
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = a_.values[i] & ~b_.values[i];
}
#endif
#endif #endif
return simde_uint64x1_from_private(r_); return simde_uint64x1_from_private(r_);
...@@ -263,7 +296,9 @@ simde_vbicq_s8(simde_int8x16_t a, simde_int8x16_t b) { ...@@ -263,7 +296,9 @@ simde_vbicq_s8(simde_int8x16_t a, simde_int8x16_t b) {
b_ = simde_int8x16_to_private(b), b_ = simde_int8x16_to_private(b),
r_; r_;
#if defined(SIMDE_X86_SSE2_NATIVE) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vand_vv_i8m1(a_.sv128 , __riscv_vnot_v_i8m1(b_.sv128 , 16) , 16);
#elif defined(SIMDE_X86_SSE2_NATIVE)
r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i); r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i);
#elif defined(SIMDE_WASM_SIMD128_NATIVE) #elif defined(SIMDE_WASM_SIMD128_NATIVE)
r_.v128 = wasm_v128_andnot(a_.v128, b_.v128); r_.v128 = wasm_v128_andnot(a_.v128, b_.v128);
...@@ -294,7 +329,9 @@ simde_vbicq_s16(simde_int16x8_t a, simde_int16x8_t b) { ...@@ -294,7 +329,9 @@ simde_vbicq_s16(simde_int16x8_t a, simde_int16x8_t b) {
b_ = simde_int16x8_to_private(b), b_ = simde_int16x8_to_private(b),
r_; r_;
#if defined(SIMDE_X86_SSE2_NATIVE) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vand_vv_i16m1(a_.sv128 , __riscv_vnot_v_i16m1(b_.sv128 , 8) , 8);
#elif defined(SIMDE_X86_SSE2_NATIVE)
r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i); r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i);
#elif defined(SIMDE_WASM_SIMD128_NATIVE) #elif defined(SIMDE_WASM_SIMD128_NATIVE)
r_.v128 = wasm_v128_andnot(a_.v128, b_.v128); r_.v128 = wasm_v128_andnot(a_.v128, b_.v128);
...@@ -325,7 +362,9 @@ simde_vbicq_s32(simde_int32x4_t a, simde_int32x4_t b) { ...@@ -325,7 +362,9 @@ simde_vbicq_s32(simde_int32x4_t a, simde_int32x4_t b) {
b_ = simde_int32x4_to_private(b), b_ = simde_int32x4_to_private(b),
r_; r_;
#if defined(SIMDE_X86_SSE2_NATIVE) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vand_vv_i32m1(a_.sv128 , __riscv_vnot_v_i32m1(b_.sv128 , 4) , 4);
#elif defined(SIMDE_X86_SSE2_NATIVE)
r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i); r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i);
#elif defined(SIMDE_WASM_SIMD128_NATIVE) #elif defined(SIMDE_WASM_SIMD128_NATIVE)
r_.v128 = wasm_v128_andnot(a_.v128, b_.v128); r_.v128 = wasm_v128_andnot(a_.v128, b_.v128);
...@@ -356,7 +395,9 @@ simde_vbicq_s64(simde_int64x2_t a, simde_int64x2_t b) { ...@@ -356,7 +395,9 @@ simde_vbicq_s64(simde_int64x2_t a, simde_int64x2_t b) {
b_ = simde_int64x2_to_private(b), b_ = simde_int64x2_to_private(b),
r_; r_;
#if defined(SIMDE_X86_SSE2_NATIVE) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vand_vv_i64m1(a_.sv128 , __riscv_vnot_v_i64m1(b_.sv128 , 2) , 2);
#elif defined(SIMDE_X86_SSE2_NATIVE)
r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i); r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i);
#elif defined(SIMDE_WASM_SIMD128_NATIVE) #elif defined(SIMDE_WASM_SIMD128_NATIVE)
r_.v128 = wasm_v128_andnot(a_.v128, b_.v128); r_.v128 = wasm_v128_andnot(a_.v128, b_.v128);
...@@ -387,7 +428,9 @@ simde_vbicq_u8(simde_uint8x16_t a, simde_uint8x16_t b) { ...@@ -387,7 +428,9 @@ simde_vbicq_u8(simde_uint8x16_t a, simde_uint8x16_t b) {
b_ = simde_uint8x16_to_private(b), b_ = simde_uint8x16_to_private(b),
r_; r_;
#if defined(SIMDE_X86_SSE2_NATIVE) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vand_vv_u8m1(a_.sv128 , __riscv_vnot_v_u8m1(b_.sv128 , 16) , 16);
#elif defined(SIMDE_X86_SSE2_NATIVE)
r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i); r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i);
#elif defined(SIMDE_WASM_SIMD128_NATIVE) #elif defined(SIMDE_WASM_SIMD128_NATIVE)
r_.v128 = wasm_v128_andnot(a_.v128, b_.v128); r_.v128 = wasm_v128_andnot(a_.v128, b_.v128);
...@@ -418,7 +461,9 @@ simde_vbicq_u16(simde_uint16x8_t a, simde_uint16x8_t b) { ...@@ -418,7 +461,9 @@ simde_vbicq_u16(simde_uint16x8_t a, simde_uint16x8_t b) {
b_ = simde_uint16x8_to_private(b), b_ = simde_uint16x8_to_private(b),
r_; r_;
#if defined(SIMDE_X86_SSE2_NATIVE) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vand_vv_u16m1(a_.sv128 , __riscv_vnot_v_u16m1(b_.sv128 , 8) , 8);
#elif defined(SIMDE_X86_SSE2_NATIVE)
r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i); r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i);
#elif defined(SIMDE_WASM_SIMD128_NATIVE) #elif defined(SIMDE_WASM_SIMD128_NATIVE)
r_.v128 = wasm_v128_andnot(a_.v128, b_.v128); r_.v128 = wasm_v128_andnot(a_.v128, b_.v128);
...@@ -449,7 +494,9 @@ simde_vbicq_u32(simde_uint32x4_t a, simde_uint32x4_t b) { ...@@ -449,7 +494,9 @@ simde_vbicq_u32(simde_uint32x4_t a, simde_uint32x4_t b) {
b_ = simde_uint32x4_to_private(b), b_ = simde_uint32x4_to_private(b),
r_; r_;
#if defined(SIMDE_X86_SSE2_NATIVE) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vand_vv_u32m1(a_.sv128 , __riscv_vnot_v_u32m1(b_.sv128 , 4) , 4);
#elif defined(SIMDE_X86_SSE2_NATIVE)
r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i); r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i);
#elif defined(SIMDE_WASM_SIMD128_NATIVE) #elif defined(SIMDE_WASM_SIMD128_NATIVE)
r_.v128 = wasm_v128_andnot(a_.v128, b_.v128); r_.v128 = wasm_v128_andnot(a_.v128, b_.v128);
...@@ -480,7 +527,9 @@ simde_vbicq_u64(simde_uint64x2_t a, simde_uint64x2_t b) { ...@@ -480,7 +527,9 @@ simde_vbicq_u64(simde_uint64x2_t a, simde_uint64x2_t b) {
b_ = simde_uint64x2_to_private(b), b_ = simde_uint64x2_to_private(b),
r_; r_;
#if defined(SIMDE_X86_SSE2_NATIVE) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vand_vv_u64m1(a_.sv128 , __riscv_vnot_v_u64m1(b_.sv128 , 2) , 2);
#elif defined(SIMDE_X86_SSE2_NATIVE)
r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i); r_.m128i = _mm_andnot_si128(b_.m128i, a_.m128i);
#elif defined(SIMDE_WASM_SIMD128_NATIVE) #elif defined(SIMDE_WASM_SIMD128_NATIVE)
r_.v128 = wasm_v128_andnot(a_.v128, b_.v128); r_.v128 = wasm_v128_andnot(a_.v128, b_.v128);
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* SOFTWARE. * SOFTWARE.
* *
* Copyright: * Copyright:
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> * 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_CADD_ROT270_H) #if !defined(SIMDE_ARM_NEON_CADD_ROT270_H)
...@@ -47,7 +47,12 @@ simde_float16x4_t simde_vcadd_rot270_f16(simde_float16x4_t a, simde_float16x4_t ...@@ -47,7 +47,12 @@ simde_float16x4_t simde_vcadd_rot270_f16(simde_float16x4_t a, simde_float16x4_t
return vcadd_rot270_f16(a, b); return vcadd_rot270_f16(a, b);
#else #else
simde_float16x4_private r_, a_ = simde_float16x4_to_private(a), b_ = simde_float16x4_to_private(b); simde_float16x4_private r_, a_ = simde_float16x4_to_private(a), b_ = simde_float16x4_to_private(b);
#if defined(SIMDE_SHUFFLE_VECTOR_) && !defined(SIMDE_BUG_GCC_100760) && \ #if defined(SIMDE_RISCV_V_NATIVE) && SIMDE_ARCH_RISCV_ZVFH
uint16_t idx1[4] = {5, 0, 7, 2};
vfloat16m1_t op1 = __riscv_vrgather_vv_f16m1(__riscv_vslideup_vx_f16m1( \
__riscv_vfneg_v_f16m1(b_.sv64, 4), b_.sv64, 4, 8), __riscv_vle16_v_u16m1(idx1, 4), 4);
r_.sv64 = __riscv_vfadd_vv_f16m1(op1, a_.sv64, 4);
#elif defined(SIMDE_SHUFFLE_VECTOR_) && !defined(SIMDE_BUG_GCC_100760) && \
((SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16) || (SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FLOAT16)) ((SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16) || (SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FLOAT16))
b_.values = SIMDE_SHUFFLE_VECTOR_(16, 4, -b_.values, b_.values, 5, 0, 7, 2); b_.values = SIMDE_SHUFFLE_VECTOR_(16, 4, -b_.values, b_.values, 5, 0, 7, 2);
r_.values = b_.values + a_.values; r_.values = b_.values + a_.values;
...@@ -77,7 +82,13 @@ simde_float16x8_t simde_vcaddq_rot270_f16(simde_float16x8_t a, simde_float16x8_t ...@@ -77,7 +82,13 @@ simde_float16x8_t simde_vcaddq_rot270_f16(simde_float16x8_t a, simde_float16x8_t
return vcaddq_rot270_f16(a, b); return vcaddq_rot270_f16(a, b);
#else #else
simde_float16x8_private r_, a_ = simde_float16x8_to_private(a), b_ = simde_float16x8_to_private(b); simde_float16x8_private r_, a_ = simde_float16x8_to_private(a), b_ = simde_float16x8_to_private(b);
#if defined(SIMDE_SHUFFLE_VECTOR_) && \ #if defined(SIMDE_RISCV_V_NATIVE) && SIMDE_ARCH_RISCV_ZVFH
uint16_t idx1[8] = {9, 0, 11, 2, 13, 4, 15, 6};
vfloat16m2_t b_tmp = __riscv_vlmul_ext_v_f16m1_f16m2 (b_.sv128);
vfloat16m1_t op1 = __riscv_vlmul_trunc_v_f16m2_f16m1(__riscv_vrgather_vv_f16m2(__riscv_vslideup_vx_f16m2( \
__riscv_vfneg_v_f16m2(b_tmp, 8), b_tmp, 8, 16), __riscv_vle16_v_u16m2(idx1, 8), 8));
r_.sv128 = __riscv_vfadd_vv_f16m1(op1, a_.sv128, 8);
#elif defined(SIMDE_SHUFFLE_VECTOR_) && \
((SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16) || (SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FLOAT16)) ((SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16) || (SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FLOAT16))
b_.values = SIMDE_SHUFFLE_VECTOR_(16, 8, -b_.values, b_.values, 9, 0, 11, 2, 13, 4, 15, 6); b_.values = SIMDE_SHUFFLE_VECTOR_(16, 8, -b_.values, b_.values, 9, 0, 11, 2, 13, 4, 15, 6);
r_.values = b_.values + a_.values; r_.values = b_.values + a_.values;
...@@ -107,7 +118,12 @@ simde_float32x2_t simde_vcadd_rot270_f32(simde_float32x2_t a, simde_float32x2_t ...@@ -107,7 +118,12 @@ simde_float32x2_t simde_vcadd_rot270_f32(simde_float32x2_t a, simde_float32x2_t
return vcadd_rot270_f32(a, b); return vcadd_rot270_f32(a, b);
#else #else
simde_float32x2_private r_, a_ = simde_float32x2_to_private(a), b_ = simde_float32x2_to_private(b); simde_float32x2_private r_, a_ = simde_float32x2_to_private(a), b_ = simde_float32x2_to_private(b);
#if defined(SIMDE_SHUFFLE_VECTOR_) && !defined(SIMDE_BUG_GCC_100760) #if defined(SIMDE_RISCV_V_NATIVE)
uint32_t idx1[2] = {3, 0};
vfloat32m1_t op1 = __riscv_vrgather_vv_f32m1(__riscv_vslideup_vx_f32m1( \
__riscv_vfneg_v_f32m1(b_.sv64, 2), b_.sv64, 2, 4), __riscv_vle32_v_u32m1(idx1, 2), 2);
r_.sv64 = __riscv_vfadd_vv_f32m1(op1, a_.sv64, 2);
#elif defined(SIMDE_SHUFFLE_VECTOR_) && !defined(SIMDE_BUG_GCC_100760)
b_.values = SIMDE_SHUFFLE_VECTOR_(32, 8, -b_.values, b_.values, 3, 0); b_.values = SIMDE_SHUFFLE_VECTOR_(32, 8, -b_.values, b_.values, 3, 0);
r_.values = b_.values + a_.values; r_.values = b_.values + a_.values;
#else #else
...@@ -135,7 +151,13 @@ simde_float32x4_t simde_vcaddq_rot270_f32(simde_float32x4_t a, simde_float32x4_t ...@@ -135,7 +151,13 @@ simde_float32x4_t simde_vcaddq_rot270_f32(simde_float32x4_t a, simde_float32x4_t
return vcaddq_rot270_f32(a, b); return vcaddq_rot270_f32(a, b);
#else #else
simde_float32x4_private r_, a_ = simde_float32x4_to_private(a), b_ = simde_float32x4_to_private(b); simde_float32x4_private r_, a_ = simde_float32x4_to_private(a), b_ = simde_float32x4_to_private(b);
#if defined(SIMDE_SHUFFLE_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
uint32_t idx1[4] = {5, 0, 7, 2};
vfloat32m2_t b_tmp = __riscv_vlmul_ext_v_f32m1_f32m2 (b_.sv128);
vfloat32m1_t op1 = __riscv_vlmul_trunc_v_f32m2_f32m1(__riscv_vrgather_vv_f32m2(__riscv_vslideup_vx_f32m2( \
__riscv_vfneg_v_f32m2(b_tmp, 4), b_tmp, 4, 8), __riscv_vle32_v_u32m2(idx1, 4), 4));
r_.sv128 = __riscv_vfadd_vv_f32m1(op1, a_.sv128, 4);
#elif defined(SIMDE_SHUFFLE_VECTOR_)
b_.values = SIMDE_SHUFFLE_VECTOR_(32, 16, -b_.values, b_.values, 5, 0, 7, 2); b_.values = SIMDE_SHUFFLE_VECTOR_(32, 16, -b_.values, b_.values, 5, 0, 7, 2);
r_.values = b_.values + a_.values; r_.values = b_.values + a_.values;
#else #else
...@@ -163,7 +185,13 @@ simde_float64x2_t simde_vcaddq_rot270_f64(simde_float64x2_t a, simde_float64x2_t ...@@ -163,7 +185,13 @@ simde_float64x2_t simde_vcaddq_rot270_f64(simde_float64x2_t a, simde_float64x2_t
return vcaddq_rot270_f64(a, b); return vcaddq_rot270_f64(a, b);
#else #else
simde_float64x2_private r_, a_ = simde_float64x2_to_private(a), b_ = simde_float64x2_to_private(b); simde_float64x2_private r_, a_ = simde_float64x2_to_private(a), b_ = simde_float64x2_to_private(b);
#if defined(SIMDE_SHUFFLE_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
uint64_t idx1[2] = {3, 0};
vfloat64m2_t b_tmp = __riscv_vlmul_ext_v_f64m1_f64m2 (b_.sv128);
vfloat64m1_t op1 = __riscv_vlmul_trunc_v_f64m2_f64m1(__riscv_vrgather_vv_f64m2(__riscv_vslideup_vx_f64m2( \
__riscv_vfneg_v_f64m2(b_tmp, 2), b_tmp, 2, 4), __riscv_vle64_v_u64m2(idx1, 2), 2));
r_.sv128 = __riscv_vfadd_vv_f64m1(op1, a_.sv128, 2);
#elif defined(SIMDE_SHUFFLE_VECTOR_)
b_.values = SIMDE_SHUFFLE_VECTOR_(64, 16, -b_.values, b_.values, 3, 0); b_.values = SIMDE_SHUFFLE_VECTOR_(64, 16, -b_.values, b_.values, 3, 0);
r_.values = b_.values + a_.values; r_.values = b_.values + a_.values;
#else #else
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* SOFTWARE. * SOFTWARE.
* *
* Copyright: * Copyright:
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> * 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_CADD_ROT90_H) #if !defined(SIMDE_ARM_NEON_CADD_ROT90_H)
...@@ -47,7 +47,12 @@ simde_float16x4_t simde_vcadd_rot90_f16(simde_float16x4_t a, simde_float16x4_t b ...@@ -47,7 +47,12 @@ simde_float16x4_t simde_vcadd_rot90_f16(simde_float16x4_t a, simde_float16x4_t b
return vcadd_rot90_f16(a, b); return vcadd_rot90_f16(a, b);
#else #else
simde_float16x4_private r_, a_ = simde_float16x4_to_private(a), b_ = simde_float16x4_to_private(b); simde_float16x4_private r_, a_ = simde_float16x4_to_private(a), b_ = simde_float16x4_to_private(b);
#if defined(SIMDE_SHUFFLE_VECTOR_) && \ #if defined(SIMDE_RISCV_V_NATIVE) && SIMDE_ARCH_RISCV_ZVFH
uint16_t idx1[4] = {1, 4, 3, 6};
vfloat16m1_t op1 = __riscv_vrgather_vv_f16m1(__riscv_vslideup_vx_f16m1( \
__riscv_vfneg_v_f16m1(b_.sv64, 4), b_.sv64, 4, 8), __riscv_vle16_v_u16m1(idx1, 4), 4);
r_.sv64 = __riscv_vfadd_vv_f16m1(op1, a_.sv64, 4);
#elif defined(SIMDE_SHUFFLE_VECTOR_) && \
((SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16) || (SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FLOAT16)) ((SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16) || (SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FLOAT16))
b_.values = SIMDE_SHUFFLE_VECTOR_(16, 4, -b_.values, b_.values, 1, 4, 3, 6); b_.values = SIMDE_SHUFFLE_VECTOR_(16, 4, -b_.values, b_.values, 1, 4, 3, 6);
r_.values = b_.values + a_.values; r_.values = b_.values + a_.values;
...@@ -77,7 +82,13 @@ simde_float16x8_t simde_vcaddq_rot90_f16(simde_float16x8_t a, simde_float16x8_t ...@@ -77,7 +82,13 @@ simde_float16x8_t simde_vcaddq_rot90_f16(simde_float16x8_t a, simde_float16x8_t
return vcaddq_rot90_f16(a, b); return vcaddq_rot90_f16(a, b);
#else #else
simde_float16x8_private r_, a_ = simde_float16x8_to_private(a), b_ = simde_float16x8_to_private(b); simde_float16x8_private r_, a_ = simde_float16x8_to_private(a), b_ = simde_float16x8_to_private(b);
#if defined(SIMDE_SHUFFLE_VECTOR_) && \ #if defined(SIMDE_RISCV_V_NATIVE) && SIMDE_ARCH_RISCV_ZVFH
uint16_t idx1[8] = {1, 8, 3, 10, 5, 12, 7, 14};
vfloat16m2_t b_tmp = __riscv_vlmul_ext_v_f16m1_f16m2 (b_.sv128);
vfloat16m1_t op1 = __riscv_vlmul_trunc_v_f16m2_f16m1(__riscv_vrgather_vv_f16m2(__riscv_vslideup_vx_f16m2( \
__riscv_vfneg_v_f16m2(b_tmp, 8), b_tmp, 8, 16), __riscv_vle16_v_u16m2(idx1, 8), 8));
r_.sv128 = __riscv_vfadd_vv_f16m1(op1, a_.sv128, 8);
#elif defined(SIMDE_SHUFFLE_VECTOR_) && \
((SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16) || (SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FLOAT16)) ((SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FP16) || (SIMDE_FLOAT16_API == SIMDE_FLOAT16_API_FLOAT16))
b_.values = SIMDE_SHUFFLE_VECTOR_(16, 8, -b_.values, b_.values, 1, 8, 3, 10, 5, 12, 7, 14); b_.values = SIMDE_SHUFFLE_VECTOR_(16, 8, -b_.values, b_.values, 1, 8, 3, 10, 5, 12, 7, 14);
r_.values = b_.values + a_.values; r_.values = b_.values + a_.values;
...@@ -107,7 +118,12 @@ simde_float32x2_t simde_vcadd_rot90_f32(simde_float32x2_t a, simde_float32x2_t b ...@@ -107,7 +118,12 @@ simde_float32x2_t simde_vcadd_rot90_f32(simde_float32x2_t a, simde_float32x2_t b
return vcadd_rot90_f32(a, b); return vcadd_rot90_f32(a, b);
#else #else
simde_float32x2_private r_, a_ = simde_float32x2_to_private(a), b_ = simde_float32x2_to_private(b); simde_float32x2_private r_, a_ = simde_float32x2_to_private(a), b_ = simde_float32x2_to_private(b);
#if defined(SIMDE_SHUFFLE_VECTOR_) && !defined(SIMDE_BUG_GCC_100760) #if defined(SIMDE_RISCV_V_NATIVE)
uint32_t idx1[2] = {1, 2};
vfloat32m1_t op1 = __riscv_vrgather_vv_f32m1(__riscv_vslideup_vx_f32m1( \
__riscv_vfneg_v_f32m1(b_.sv64, 2), b_.sv64, 2, 4), __riscv_vle32_v_u32m1(idx1, 2), 2);
r_.sv64 = __riscv_vfadd_vv_f32m1(op1, a_.sv64, 2);
#elif defined(SIMDE_SHUFFLE_VECTOR_) && !defined(SIMDE_BUG_GCC_100760)
b_.values = SIMDE_SHUFFLE_VECTOR_(32, 8, -b_.values, b_.values, 1, 2); b_.values = SIMDE_SHUFFLE_VECTOR_(32, 8, -b_.values, b_.values, 1, 2);
r_.values = b_.values + a_.values; r_.values = b_.values + a_.values;
#else #else
...@@ -135,7 +151,13 @@ simde_float32x4_t simde_vcaddq_rot90_f32(simde_float32x4_t a, simde_float32x4_t ...@@ -135,7 +151,13 @@ simde_float32x4_t simde_vcaddq_rot90_f32(simde_float32x4_t a, simde_float32x4_t
return vcaddq_rot90_f32(a, b); return vcaddq_rot90_f32(a, b);
#else #else
simde_float32x4_private r_, a_ = simde_float32x4_to_private(a), b_ = simde_float32x4_to_private(b); simde_float32x4_private r_, a_ = simde_float32x4_to_private(a), b_ = simde_float32x4_to_private(b);
#if defined(SIMDE_SHUFFLE_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
uint32_t idx1[4] = {1, 4, 3, 6};
vfloat32m2_t b_tmp = __riscv_vlmul_ext_v_f32m1_f32m2 (b_.sv128);
vfloat32m1_t op1 = __riscv_vlmul_trunc_v_f32m2_f32m1(__riscv_vrgather_vv_f32m2(__riscv_vslideup_vx_f32m2( \
__riscv_vfneg_v_f32m2(b_tmp, 4), b_tmp, 4, 8), __riscv_vle32_v_u32m2(idx1, 4), 4));
r_.sv128 = __riscv_vfadd_vv_f32m1(op1, a_.sv128, 4);
#elif defined(SIMDE_SHUFFLE_VECTOR_)
b_.values = SIMDE_SHUFFLE_VECTOR_(32, 16, -b_.values, b_.values, 1, 4, 3, 6); b_.values = SIMDE_SHUFFLE_VECTOR_(32, 16, -b_.values, b_.values, 1, 4, 3, 6);
r_.values = b_.values + a_.values; r_.values = b_.values + a_.values;
#else #else
...@@ -163,7 +185,13 @@ simde_float64x2_t simde_vcaddq_rot90_f64(simde_float64x2_t a, simde_float64x2_t ...@@ -163,7 +185,13 @@ simde_float64x2_t simde_vcaddq_rot90_f64(simde_float64x2_t a, simde_float64x2_t
return vcaddq_rot90_f64(a, b); return vcaddq_rot90_f64(a, b);
#else #else
simde_float64x2_private r_, a_ = simde_float64x2_to_private(a), b_ = simde_float64x2_to_private(b); simde_float64x2_private r_, a_ = simde_float64x2_to_private(a), b_ = simde_float64x2_to_private(b);
#if defined(SIMDE_SHUFFLE_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
uint64_t idx1[2] = {1, 2};
vfloat64m2_t b_tmp = __riscv_vlmul_ext_v_f64m1_f64m2 (b_.sv128);
vfloat64m1_t op1 = __riscv_vlmul_trunc_v_f64m2_f64m1(__riscv_vrgather_vv_f64m2(__riscv_vslideup_vx_f64m2( \
__riscv_vfneg_v_f64m2(b_tmp, 2), b_tmp, 2, 4), __riscv_vle64_v_u64m2(idx1, 2), 2));
r_.sv128 = __riscv_vfadd_vv_f64m1(op1, a_.sv128, 2);
#elif defined(SIMDE_SHUFFLE_VECTOR_)
b_.values = SIMDE_SHUFFLE_VECTOR_(64, 16, -b_.values, b_.values, 1, 2); b_.values = SIMDE_SHUFFLE_VECTOR_(64, 16, -b_.values, b_.values, 1, 2);
r_.values = b_.values + a_.values; r_.values = b_.values + a_.values;
#else #else
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
* 2020 Evan Nemerson <evan@nemerson.com> * 2020 Evan Nemerson <evan@nemerson.com>
* 2020 Sean Maher <seanptmaher@gmail.com> (Copyright owned by Google, LLC) * 2020 Sean Maher <seanptmaher@gmail.com> (Copyright owned by Google, LLC)
* 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology) * 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology)
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_COMBINE_H) #if !defined(SIMDE_ARM_NEON_COMBINE_H)
...@@ -45,14 +46,16 @@ simde_vcombine_f16(simde_float16x4_t low, simde_float16x4_t high) { ...@@ -45,14 +46,16 @@ simde_vcombine_f16(simde_float16x4_t low, simde_float16x4_t high) {
simde_float16x4_private simde_float16x4_private
low_ = simde_float16x4_to_private(low), low_ = simde_float16x4_to_private(low),
high_ = simde_float16x4_to_private(high); high_ = simde_float16x4_to_private(high);
#if defined(SIMDE_RISCV_V_NATIVE) && SIMDE_ARCH_RISCV_ZVFH
size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; r_.sv128 = __riscv_vslideup_vx_f16m1(low_.sv64, high_.sv64, 4, 8);
SIMDE_VECTORIZE #else
for (size_t i = 0 ; i < halfway ; i++) { size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2;
r_.values[i] = low_.values[i]; SIMDE_VECTORIZE
r_.values[i + halfway] = high_.values[i]; for (size_t i = 0 ; i < halfway ; i++) {
} r_.values[i] = low_.values[i];
r_.values[i + halfway] = high_.values[i];
}
#endif
return simde_float16x8_from_private(r_); return simde_float16x8_from_private(r_);
#endif #endif
} }
...@@ -75,7 +78,9 @@ simde_vcombine_f32(simde_float32x2_t low, simde_float32x2_t high) { ...@@ -75,7 +78,9 @@ simde_vcombine_f32(simde_float32x2_t low, simde_float32x2_t high) {
/* Note: __builtin_shufflevector can have a the output contain /* Note: __builtin_shufflevector can have a the output contain
* twice the number of elements, __builtin_shuffle cannot. * twice the number of elements, __builtin_shuffle cannot.
* Using SIMDE_SHUFFLE_VECTOR_ here would not work. */ * Using SIMDE_SHUFFLE_VECTOR_ here would not work. */
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vslideup_vx_f32m1(low_.sv64, high_.sv64, 2, 4);
#elif defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3); r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3);
#else #else
size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2;
...@@ -105,7 +110,9 @@ simde_vcombine_f64(simde_float64x1_t low, simde_float64x1_t high) { ...@@ -105,7 +110,9 @@ simde_vcombine_f64(simde_float64x1_t low, simde_float64x1_t high) {
low_ = simde_float64x1_to_private(low), low_ = simde_float64x1_to_private(low),
high_ = simde_float64x1_to_private(high); high_ = simde_float64x1_to_private(high);
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vslideup_vx_f64m1(low_.sv64, high_.sv64, 1, 2);
#elif defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1); r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1);
#else #else
size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2;
...@@ -135,7 +142,9 @@ simde_vcombine_s8(simde_int8x8_t low, simde_int8x8_t high) { ...@@ -135,7 +142,9 @@ simde_vcombine_s8(simde_int8x8_t low, simde_int8x8_t high) {
low_ = simde_int8x8_to_private(low), low_ = simde_int8x8_to_private(low),
high_ = simde_int8x8_to_private(high); high_ = simde_int8x8_to_private(high);
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vslideup_vx_i8m1(low_.sv64, high_.sv64, 8, 16);
#elif defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
#else #else
size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2;
...@@ -165,7 +174,9 @@ simde_vcombine_s16(simde_int16x4_t low, simde_int16x4_t high) { ...@@ -165,7 +174,9 @@ simde_vcombine_s16(simde_int16x4_t low, simde_int16x4_t high) {
low_ = simde_int16x4_to_private(low), low_ = simde_int16x4_to_private(low),
high_ = simde_int16x4_to_private(high); high_ = simde_int16x4_to_private(high);
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vslideup_vx_i16m1(low_.sv64, high_.sv64, 4, 8);
#elif defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3, 4, 5, 6, 7); r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3, 4, 5, 6, 7);
#else #else
size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2;
...@@ -195,7 +206,9 @@ simde_vcombine_s32(simde_int32x2_t low, simde_int32x2_t high) { ...@@ -195,7 +206,9 @@ simde_vcombine_s32(simde_int32x2_t low, simde_int32x2_t high) {
low_ = simde_int32x2_to_private(low), low_ = simde_int32x2_to_private(low),
high_ = simde_int32x2_to_private(high); high_ = simde_int32x2_to_private(high);
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vslideup_vx_i32m1(low_.sv64, high_.sv64, 2, 4);
#elif defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3); r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3);
#else #else
size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2;
...@@ -225,7 +238,9 @@ simde_vcombine_s64(simde_int64x1_t low, simde_int64x1_t high) { ...@@ -225,7 +238,9 @@ simde_vcombine_s64(simde_int64x1_t low, simde_int64x1_t high) {
low_ = simde_int64x1_to_private(low), low_ = simde_int64x1_to_private(low),
high_ = simde_int64x1_to_private(high); high_ = simde_int64x1_to_private(high);
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vslideup_vx_i64m1(low_.sv64, high_.sv64, 1, 2);
#elif defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1); r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1);
#else #else
size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2;
...@@ -255,7 +270,9 @@ simde_vcombine_u8(simde_uint8x8_t low, simde_uint8x8_t high) { ...@@ -255,7 +270,9 @@ simde_vcombine_u8(simde_uint8x8_t low, simde_uint8x8_t high) {
low_ = simde_uint8x8_to_private(low), low_ = simde_uint8x8_to_private(low),
high_ = simde_uint8x8_to_private(high); high_ = simde_uint8x8_to_private(high);
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vslideup_vx_u8m1(low_.sv64, high_.sv64, 8, 16);
#elif defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
#else #else
size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2;
...@@ -285,7 +302,9 @@ simde_vcombine_u16(simde_uint16x4_t low, simde_uint16x4_t high) { ...@@ -285,7 +302,9 @@ simde_vcombine_u16(simde_uint16x4_t low, simde_uint16x4_t high) {
low_ = simde_uint16x4_to_private(low), low_ = simde_uint16x4_to_private(low),
high_ = simde_uint16x4_to_private(high); high_ = simde_uint16x4_to_private(high);
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vslideup_vx_u16m1(low_.sv64, high_.sv64, 4, 8);
#elif defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3, 4, 5, 6, 7); r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3, 4, 5, 6, 7);
#else #else
size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2;
...@@ -315,7 +334,9 @@ simde_vcombine_u32(simde_uint32x2_t low, simde_uint32x2_t high) { ...@@ -315,7 +334,9 @@ simde_vcombine_u32(simde_uint32x2_t low, simde_uint32x2_t high) {
low_ = simde_uint32x2_to_private(low), low_ = simde_uint32x2_to_private(low),
high_ = simde_uint32x2_to_private(high); high_ = simde_uint32x2_to_private(high);
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vslideup_vx_u32m1(low_.sv64, high_.sv64, 2, 4);
#elif defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3); r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1, 2, 3);
#else #else
size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2;
...@@ -345,7 +366,9 @@ simde_vcombine_u64(simde_uint64x1_t low, simde_uint64x1_t high) { ...@@ -345,7 +366,9 @@ simde_vcombine_u64(simde_uint64x1_t low, simde_uint64x1_t high) {
low_ = simde_uint64x1_to_private(low), low_ = simde_uint64x1_to_private(low),
high_ = simde_uint64x1_to_private(high); high_ = simde_uint64x1_to_private(high);
#if defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv128 = __riscv_vslideup_vx_u64m1(low_.sv64, high_.sv64, 1, 2);
#elif defined(SIMDE_VECTOR_SUBSCRIPT) && HEDLEY_HAS_BUILTIN(__builtin_shufflevector)
r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1); r_.values = __builtin_shufflevector(low_.values, high_.values, 0, 1);
#else #else
size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2; size_t halfway = (sizeof(r_.values) / sizeof(r_.values[0])) / 2;
......
This diff is collapsed.
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* Copyright: * Copyright:
* 2020 Evan Nemerson <evan@nemerson.com> * 2020 Evan Nemerson <evan@nemerson.com>
* 2020 Sean Maher <seanptmaher@gmail.com> (Copyright owned by Google, LLC) * 2020 Sean Maher <seanptmaher@gmail.com> (Copyright owned by Google, LLC)
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_DOT_H) #if !defined(SIMDE_ARM_NEON_DOT_H)
...@@ -55,16 +56,32 @@ simde_vdot_s32(simde_int32x2_t r, simde_int8x8_t a, simde_int8x8_t b) { ...@@ -55,16 +56,32 @@ simde_vdot_s32(simde_int32x2_t r, simde_int8x8_t a, simde_int8x8_t b) {
simde_int8x8_private simde_int8x8_private
a_ = simde_int8x8_to_private(a), a_ = simde_int8x8_to_private(a),
b_ = simde_int8x8_to_private(b); b_ = simde_int8x8_to_private(b);
for (int i = 0 ; i < 2 ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
int32_t acc = 0; simde_int32x2_private r_tmp = simde_int32x2_to_private(r);
SIMDE_VECTORIZE_REDUCTION(+:acc) vint16m2_t vd_low = __riscv_vwmul_vv_i16m2 (a_.sv64, b_.sv64, 8);
for (int j = 0 ; j < 4 ; j++) { vint16m2_t vd_high = __riscv_vslidedown_vx_i16m2(vd_low, 4, 8);
const int idx = j + (i << 2); vint32m1_t vd = __riscv_vmv_v_x_i32m1(0, 4);
acc += HEDLEY_STATIC_CAST(int32_t, a_.values[idx]) * HEDLEY_STATIC_CAST(int32_t, b_.values[idx]); vint32m1_t vd_low_wide = __riscv_vwcvt_x_x_v_i32m1 (__riscv_vlmul_trunc_v_i16m2_i16mf2(vd_low), 4);
} vint32m1_t rst0 = __riscv_vredsum_vs_i32m1_i32m1(vd_low_wide, vd, 4);
r_.values[i] = acc; vint32m1_t vd_high_wide = __riscv_vwcvt_x_x_v_i32m1 (__riscv_vlmul_trunc_v_i16m2_i16mf2(vd_high), 4);
} vint32m1_t rst1 = __riscv_vredsum_vs_i32m1_i32m1(vd_high_wide, vd, 4);
return simde_vadd_s32(r, simde_int32x2_from_private(r_)); r_.sv64 = __riscv_vslideup_vx_i32m1(
__riscv_vadd_vx_i32m1(rst0, r_tmp.values[0], 2),
__riscv_vadd_vx_i32m1(rst1, r_tmp.values[1], 2),
1, 2);
return simde_int32x2_from_private(r_);
#else
for (int i = 0 ; i < 2 ; i++) {
int32_t acc = 0;
SIMDE_VECTORIZE_REDUCTION(+:acc)
for (int j = 0 ; j < 4 ; j++) {
const int idx = j + (i << 2);
acc += HEDLEY_STATIC_CAST(int32_t, a_.values[idx]) * HEDLEY_STATIC_CAST(int32_t, b_.values[idx]);
}
r_.values[i] = acc;
}
#endif
return simde_vadd_s32(r, simde_int32x2_from_private(r_));
#endif #endif
} }
#if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_ARM_NEON_A32V8_ENABLE_NATIVE_ALIASES)
...@@ -85,15 +102,31 @@ simde_vdot_u32(simde_uint32x2_t r, simde_uint8x8_t a, simde_uint8x8_t b) { ...@@ -85,15 +102,31 @@ simde_vdot_u32(simde_uint32x2_t r, simde_uint8x8_t a, simde_uint8x8_t b) {
a_ = simde_uint8x8_to_private(a), a_ = simde_uint8x8_to_private(a),
b_ = simde_uint8x8_to_private(b); b_ = simde_uint8x8_to_private(b);
for (int i = 0 ; i < 2 ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
uint32_t acc = 0; simde_uint32x2_private r_tmp = simde_uint32x2_to_private(r);
SIMDE_VECTORIZE_REDUCTION(+:acc) vuint16m2_t vd_low = __riscv_vwmulu_vv_u16m2 (a_.sv64, b_.sv64, 8);
for (int j = 0 ; j < 4 ; j++) { vuint16m2_t vd_high = __riscv_vslidedown_vx_u16m2(vd_low, 4, 8);
const int idx = j + (i << 2); vuint32m1_t vd = __riscv_vmv_v_x_u32m1(0, 4);
acc += HEDLEY_STATIC_CAST(uint32_t, a_.values[idx]) * HEDLEY_STATIC_CAST(uint32_t, b_.values[idx]); vuint32m1_t vd_low_wide = __riscv_vwcvtu_x_x_v_u32m1 (__riscv_vlmul_trunc_v_u16m2_u16mf2(vd_low), 4);
} vuint32m1_t rst0 = __riscv_vredsum_vs_u32m1_u32m1(vd_low_wide, vd, 4);
r_.values[i] = acc; vuint32m1_t vd_high_wide = __riscv_vwcvtu_x_x_v_u32m1 (__riscv_vlmul_trunc_v_u16m2_u16mf2(vd_high), 4);
} vuint32m1_t rst1 = __riscv_vredsum_vs_u32m1_u32m1(vd_high_wide, vd, 4);
r_.sv64 = __riscv_vslideup_vx_u32m1(
__riscv_vadd_vx_u32m1(rst0, r_tmp.values[0], 2),
__riscv_vadd_vx_u32m1(rst1, r_tmp.values[1], 2),
1, 2);
return simde_uint32x2_from_private(r_);
#else
for (int i = 0 ; i < 2 ; i++) {
uint32_t acc = 0;
SIMDE_VECTORIZE_REDUCTION(+:acc)
for (int j = 0 ; j < 4 ; j++) {
const int idx = j + (i << 2);
acc += HEDLEY_STATIC_CAST(uint32_t, a_.values[idx]) * HEDLEY_STATIC_CAST(uint32_t, b_.values[idx]);
}
r_.values[i] = acc;
}
#endif
return simde_vadd_u32(r, simde_uint32x2_from_private(r_)); return simde_vadd_u32(r, simde_uint32x2_from_private(r_));
#endif #endif
} }
...@@ -116,15 +149,33 @@ simde_vdotq_s32(simde_int32x4_t r, simde_int8x16_t a, simde_int8x16_t b) { ...@@ -116,15 +149,33 @@ simde_vdotq_s32(simde_int32x4_t r, simde_int8x16_t a, simde_int8x16_t b) {
simde_int8x16_private simde_int8x16_private
a_ = simde_int8x16_to_private(a), a_ = simde_int8x16_to_private(a),
b_ = simde_int8x16_to_private(b); b_ = simde_int8x16_to_private(b);
for (int i = 0 ; i < 4 ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
int32_t acc = 0; simde_int32x4_private r_tmp = simde_int32x4_to_private(r);
SIMDE_VECTORIZE_REDUCTION(+:acc) vint16m2_t vd_low = __riscv_vwmul_vv_i16m2 (a_.sv128, b_.sv128, 16);
for (int j = 0 ; j < 4 ; j++) { vint32m1_t vd = __riscv_vmv_v_x_i32m1(0, 4);
const int idx = j + (i << 2); vint32m1_t rst0 = __riscv_vredsum_vs_i32m1_i32m1(__riscv_vwcvt_x_x_v_i32m1(__riscv_vlmul_trunc_v_i16m2_i16mf2( \
acc += HEDLEY_STATIC_CAST(int32_t, a_.values[idx]) * HEDLEY_STATIC_CAST(int32_t, b_.values[idx]); vd_low), 4), vd, 4);
} vint32m1_t rst1 = __riscv_vredsum_vs_i32m1_i32m1(__riscv_vwcvt_x_x_v_i32m1(__riscv_vlmul_trunc_v_i16m2_i16mf2( \
r_.values[i] = acc; __riscv_vslidedown_vx_i16m2(vd_low, 4, 4)), 4), vd, 4);
} vint32m1_t rst2 = __riscv_vredsum_vs_i32m1_i32m1(__riscv_vwcvt_x_x_v_i32m1(__riscv_vlmul_trunc_v_i16m2_i16mf2( \
__riscv_vslidedown_vx_i16m2(vd_low, 8, 4)), 4), vd, 4);
vint32m1_t rst3 = __riscv_vredsum_vs_i32m1_i32m1(__riscv_vwcvt_x_x_v_i32m1(__riscv_vlmul_trunc_v_i16m2_i16mf2( \
__riscv_vslidedown_vx_i16m2(vd_low, 12, 4)), 4), vd, 4);
vint32m1_t r0 = __riscv_vslideup_vx_i32m1(__riscv_vadd_vx_i32m1(rst0, r_tmp.values[0], 2), __riscv_vadd_vx_i32m1(rst1, r_tmp.values[1], 2), 1, 2);
vint32m1_t r1 = __riscv_vslideup_vx_i32m1(r0, __riscv_vadd_vx_i32m1(rst2, r_tmp.values[2], 2), 2, 3);
r_.sv128 = __riscv_vslideup_vx_i32m1(r1, __riscv_vadd_vx_i32m1(rst3, r_tmp.values[3], 2), 3, 4);
return simde_int32x4_from_private(r_);
#else
for (int i = 0 ; i < 4 ; i++) {
int32_t acc = 0;
SIMDE_VECTORIZE_REDUCTION(+:acc)
for (int j = 0 ; j < 4 ; j++) {
const int idx = j + (i << 2);
acc += HEDLEY_STATIC_CAST(int32_t, a_.values[idx]) * HEDLEY_STATIC_CAST(int32_t, b_.values[idx]);
}
r_.values[i] = acc;
}
#endif
return simde_vaddq_s32(r, simde_int32x4_from_private(r_)); return simde_vaddq_s32(r, simde_int32x4_from_private(r_));
#endif #endif
} }
...@@ -147,15 +198,33 @@ simde_vdotq_u32(simde_uint32x4_t r, simde_uint8x16_t a, simde_uint8x16_t b) { ...@@ -147,15 +198,33 @@ simde_vdotq_u32(simde_uint32x4_t r, simde_uint8x16_t a, simde_uint8x16_t b) {
simde_uint8x16_private simde_uint8x16_private
a_ = simde_uint8x16_to_private(a), a_ = simde_uint8x16_to_private(a),
b_ = simde_uint8x16_to_private(b); b_ = simde_uint8x16_to_private(b);
for (int i = 0 ; i < 4 ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
uint32_t acc = 0; simde_uint32x4_private r_tmp = simde_uint32x4_to_private(r);
SIMDE_VECTORIZE_REDUCTION(+:acc) vuint16m2_t vd_low = __riscv_vwmulu_vv_u16m2 (a_.sv128, b_.sv128, 16);
for (int j = 0 ; j < 4 ; j++) { vuint32m1_t vd = __riscv_vmv_v_x_u32m1(0, 4);
const int idx = j + (i << 2); vuint32m1_t rst0 = __riscv_vredsum_vs_u32m1_u32m1(__riscv_vwcvtu_x_x_v_u32m1(__riscv_vlmul_trunc_v_u16m2_u16mf2( \
acc += HEDLEY_STATIC_CAST(uint32_t, a_.values[idx]) * HEDLEY_STATIC_CAST(uint32_t, b_.values[idx]); vd_low), 4), vd, 4);
vuint32m1_t rst1 = __riscv_vredsum_vs_u32m1_u32m1(__riscv_vwcvtu_x_x_v_u32m1(__riscv_vlmul_trunc_v_u16m2_u16mf2( \
__riscv_vslidedown_vx_u16m2(vd_low, 4, 4)), 4), vd, 4);
vuint32m1_t rst2 = __riscv_vredsum_vs_u32m1_u32m1(__riscv_vwcvtu_x_x_v_u32m1(__riscv_vlmul_trunc_v_u16m2_u16mf2( \
__riscv_vslidedown_vx_u16m2(vd_low, 8, 4)), 4), vd, 4);
vuint32m1_t rst3 = __riscv_vredsum_vs_u32m1_u32m1(__riscv_vwcvtu_x_x_v_u32m1(__riscv_vlmul_trunc_v_u16m2_u16mf2( \
__riscv_vslidedown_vx_u16m2(vd_low, 12, 4)), 4), vd, 4);
vuint32m1_t r0 = __riscv_vslideup_vx_u32m1(__riscv_vadd_vx_u32m1(rst0, r_tmp.values[0], 2), __riscv_vadd_vx_u32m1(rst1, r_tmp.values[1], 2), 1, 2);
vuint32m1_t r1 = __riscv_vslideup_vx_u32m1(r0, __riscv_vadd_vx_u32m1(rst2, r_tmp.values[2], 2), 2, 3);
r_.sv128 = __riscv_vslideup_vx_u32m1(r1, __riscv_vadd_vx_u32m1(rst3, r_tmp.values[3], 2), 3, 4);
return simde_uint32x4_from_private(r_);
#else
for (int i = 0 ; i < 4 ; i++) {
uint32_t acc = 0;
SIMDE_VECTORIZE_REDUCTION(+:acc)
for (int j = 0 ; j < 4 ; j++) {
const int idx = j + (i << 2);
acc += HEDLEY_STATIC_CAST(uint32_t, a_.values[idx]) * HEDLEY_STATIC_CAST(uint32_t, b_.values[idx]);
}
r_.values[i] = acc;
} }
r_.values[i] = acc; #endif
}
return simde_vaddq_u32(r, simde_uint32x4_from_private(r_)); return simde_vaddq_u32(r, simde_uint32x4_from_private(r_));
#endif #endif
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* *
* Copyright: * Copyright:
* 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology) * 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology)
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_MAXNMV_H) #if !defined(SIMDE_ARM_NEON_MAXNMV_H)
...@@ -45,10 +46,15 @@ simde_vmaxnmv_f32(simde_float32x2_t a) { ...@@ -45,10 +46,15 @@ simde_vmaxnmv_f32(simde_float32x2_t a) {
simde_float32x2_private a_ = simde_float32x2_to_private(a); simde_float32x2_private a_ = simde_float32x2_to_private(a);
r = -SIMDE_MATH_INFINITYF; r = -SIMDE_MATH_INFINITYF;
SIMDE_VECTORIZE_REDUCTION(max:r) #if defined(SIMDE_RISCV_V_NATIVE)
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) { r = __riscv_vfmv_f_s_f32m1_f32(__riscv_vfredmax_vs_f32m1_f32m1(a_.sv64, \
r = a_.values[i] > r ? a_.values[i] : r; __riscv_vfmv_v_f_f32m1(r, 2), 2));
} #else
SIMDE_VECTORIZE_REDUCTION(max:r)
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
r = a_.values[i] > r ? a_.values[i] : r;
}
#endif
#endif #endif
return r; return r;
...@@ -69,10 +75,18 @@ simde_vmaxnmvq_f32(simde_float32x4_t a) { ...@@ -69,10 +75,18 @@ simde_vmaxnmvq_f32(simde_float32x4_t a) {
simde_float32x4_private a_ = simde_float32x4_to_private(a); simde_float32x4_private a_ = simde_float32x4_to_private(a);
r = -SIMDE_MATH_INFINITYF; r = -SIMDE_MATH_INFINITYF;
SIMDE_VECTORIZE_REDUCTION(max:r) #if defined(SIMDE_RISCV_V_NATIVE)
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) { r = __riscv_vfmv_f_s_f32m1_f32(__riscv_vfredmax_vs_f32m1_f32m1(a_.sv128, \
r = a_.values[i] > r ? a_.values[i] : r; __riscv_vfmv_v_f_f32m1(r, 4), 4));
} #elif defined(SIMDE_VECTOR_SUBSCRIPT_OPS) && HEDLEY_HAS_BUILTIN(__builtin_reduce_max)
simde_float32_t rst = __builtin_reduce_max(a_.values);
r = (rst > r) ? rst : r;
#else
SIMDE_VECTORIZE_REDUCTION(max:r)
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
r = a_.values[i] > r ? a_.values[i] : r;
}
#endif
#endif #endif
return r; return r;
...@@ -93,10 +107,15 @@ simde_vmaxnmvq_f64(simde_float64x2_t a) { ...@@ -93,10 +107,15 @@ simde_vmaxnmvq_f64(simde_float64x2_t a) {
simde_float64x2_private a_ = simde_float64x2_to_private(a); simde_float64x2_private a_ = simde_float64x2_to_private(a);
r = -SIMDE_MATH_INFINITY; r = -SIMDE_MATH_INFINITY;
SIMDE_VECTORIZE_REDUCTION(max:r) #if defined(SIMDE_RISCV_V_NATIVE)
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) { r = __riscv_vfmv_f_s_f64m1_f64(__riscv_vfredmax_vs_f64m1_f64m1(a_.sv128, \
r = a_.values[i] > r ? a_.values[i] : r; __riscv_vfmv_v_f_f64m1(r, 2), 2));
} #else
SIMDE_VECTORIZE_REDUCTION(max:r)
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
r = a_.values[i] > r ? a_.values[i] : r;
}
#endif
#endif #endif
return r; return r;
...@@ -112,23 +131,28 @@ simde_vmaxnmv_f16(simde_float16x4_t a) { ...@@ -112,23 +131,28 @@ simde_vmaxnmv_f16(simde_float16x4_t a) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16)
return vmaxnmv_f16(a); return vmaxnmv_f16(a);
#else #else
simde_float32_t r_ = simde_float16_to_float32(SIMDE_NINFINITYHF);
simde_float16x4_private a_ = simde_float16x4_to_private(a); simde_float16x4_private a_ = simde_float16x4_to_private(a);
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_RISCV_V_NATIVE) && defined(SIMDE_ARCH_RISCV_ZVFH)
SIMDE_VECTORIZE_REDUCTION(max:r_) return __riscv_vfmv_f_s_f16m1_f16(__riscv_vfredmax_vs_f16m1_f16m1(a_.sv64, \
__riscv_vfmv_v_f_f16m1(SIMDE_NINFINITYHF, 4), 4));
#else #else
SIMDE_VECTORIZE simde_float32_t r_ = simde_float16_to_float32(SIMDE_NINFINITYHF);
#endif
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
simde_float32_t tmp_a = simde_float16_to_float32(a_.values[i]);
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_FAST_NANS)
r_ = tmp_a > r_ ? tmp_a : r_; SIMDE_VECTORIZE_REDUCTION(max:r_)
#else #else
r_ = (tmp_a > r_) ? tmp_a : ((tmp_a <= r_) ? r_ : ((tmp_a == tmp_a) ? r_ : tmp_a)); SIMDE_VECTORIZE
#endif #endif
} for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
return simde_float16_from_float32(r_); simde_float32_t tmp_a = simde_float16_to_float32(a_.values[i]);
#if defined(SIMDE_FAST_NANS)
r_ = tmp_a > r_ ? tmp_a : r_;
#else
r_ = (tmp_a > r_) ? tmp_a : ((tmp_a <= r_) ? r_ : ((tmp_a == tmp_a) ? r_ : tmp_a));
#endif
}
return simde_float16_from_float32(r_);
#endif
#endif #endif
} }
#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES)
...@@ -142,23 +166,28 @@ simde_vmaxnmvq_f16(simde_float16x8_t a) { ...@@ -142,23 +166,28 @@ simde_vmaxnmvq_f16(simde_float16x8_t a) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16)
return vmaxnmvq_f16(a); return vmaxnmvq_f16(a);
#else #else
simde_float32_t r_ = simde_float16_to_float32(SIMDE_NINFINITYHF);
simde_float16x8_private a_ = simde_float16x8_to_private(a); simde_float16x8_private a_ = simde_float16x8_to_private(a);
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_RISCV_V_NATIVE) && defined(SIMDE_ARCH_RISCV_ZVFH)
SIMDE_VECTORIZE_REDUCTION(max:r_) return __riscv_vfmv_f_s_f16m1_f16(__riscv_vfredmax_vs_f16m1_f16m1(a_.sv128, \
__riscv_vfmv_v_f_f16m1(SIMDE_NINFINITYHF, 8), 8));
#else #else
SIMDE_VECTORIZE simde_float32_t r_ = simde_float16_to_float32(SIMDE_NINFINITYHF);
#endif
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
simde_float32_t tmp_a = simde_float16_to_float32(a_.values[i]);
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_FAST_NANS)
r_ = tmp_a > r_ ? tmp_a : r_; SIMDE_VECTORIZE_REDUCTION(max:r_)
#else #else
r_ = (tmp_a > r_) ? tmp_a : ((tmp_a <= r_) ? r_ : ((tmp_a == tmp_a) ? r_ : tmp_a)); SIMDE_VECTORIZE
#endif #endif
} for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
return simde_float16_from_float32(r_); simde_float32_t tmp_a = simde_float16_to_float32(a_.values[i]);
#if defined(SIMDE_FAST_NANS)
r_ = tmp_a > r_ ? tmp_a : r_;
#else
r_ = (tmp_a > r_) ? tmp_a : ((tmp_a <= r_) ? r_ : ((tmp_a == tmp_a) ? r_ : tmp_a));
#endif
}
return simde_float16_from_float32(r_);
#endif
#endif #endif
} }
#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES)
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* *
* Copyright: * Copyright:
* 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology) * 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology)
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_MINNMV_H) #if !defined(SIMDE_ARM_NEON_MINNMV_H)
...@@ -40,23 +41,29 @@ simde_vminnmv_f16(simde_float16x4_t a) { ...@@ -40,23 +41,29 @@ simde_vminnmv_f16(simde_float16x4_t a) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16)
return vminnmv_f16(a); return vminnmv_f16(a);
#else #else
simde_float32_t r_ = simde_float16_to_float32(SIMDE_INFINITYHF);
simde_float16x4_private a_ = simde_float16x4_to_private(a); simde_float16x4_private a_ = simde_float16x4_to_private(a);
#if defined(SIMDE_RISCV_V_NATIVE) && defined(SIMDE_ARCH_RISCV_ZVFH)
#if defined(SIMDE_FAST_NANS) return __riscv_vfmv_f_s_f16m1_f16(__riscv_vfredmin_vs_f16m1_f16m1(a_.sv64, \
SIMDE_VECTORIZE_REDUCTION(min:r_) __riscv_vfmv_v_f_f16m1(SIMDE_INFINITYHF, 4), 4));
#else #else
SIMDE_VECTORIZE simde_float32_t r_ = simde_float16_to_float32(SIMDE_INFINITYHF);
#endif a_ = simde_float16x4_to_private(a);
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
simde_float32_t tmp_a = simde_float16_to_float32(a_.values[i]);
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_FAST_NANS)
r_ = tmp_a < r_ ? tmp_a : r_; SIMDE_VECTORIZE_REDUCTION(min:r_)
#else #else
r_ = (tmp_a < r_) ? tmp_a : ((tmp_a >= r_) ? r_ : ((tmp_a == tmp_a) ? r_ : tmp_a)); SIMDE_VECTORIZE
#endif #endif
} for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
return simde_float16_from_float32(r_); simde_float32_t tmp_a = simde_float16_to_float32(a_.values[i]);
#if defined(SIMDE_FAST_NANS)
r_ = tmp_a < r_ ? tmp_a : r_;
#else
r_ = (tmp_a < r_) ? tmp_a : ((tmp_a >= r_) ? r_ : ((tmp_a == tmp_a) ? r_ : tmp_a));
#endif
}
return simde_float16_from_float32(r_);
#endif
#endif #endif
} }
#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES)
...@@ -75,18 +82,23 @@ simde_vminnmv_f32(simde_float32x2_t a) { ...@@ -75,18 +82,23 @@ simde_vminnmv_f32(simde_float32x2_t a) {
simde_float32x2_private a_ = simde_float32x2_to_private(a); simde_float32x2_private a_ = simde_float32x2_to_private(a);
r = SIMDE_MATH_INFINITYF; r = SIMDE_MATH_INFINITYF;
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_RISCV_V_NATIVE)
SIMDE_VECTORIZE_REDUCTION(min:r) r = __riscv_vfmv_f_s_f32m1_f32(__riscv_vfredmin_vs_f32m1_f32m1(a_.sv64, \
__riscv_vfmv_v_f_f32m1(r, 2), 2));
#else #else
SIMDE_VECTORIZE
#endif
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_FAST_NANS)
r = a_.values[i] < r ? a_.values[i] : r; SIMDE_VECTORIZE_REDUCTION(min:r)
#else #else
r = (a_.values[i] < r) ? a_.values[i] : ((a_.values[i] >= r) ? r : ((a_.values[i] == a_.values[i]) ? r : a_.values[i])); SIMDE_VECTORIZE
#endif #endif
} for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
#if defined(SIMDE_FAST_NANS)
r = a_.values[i] < r ? a_.values[i] : r;
#else
r = (a_.values[i] < r) ? a_.values[i] : ((a_.values[i] >= r) ? r : ((a_.values[i] == a_.values[i]) ? r : a_.values[i]));
#endif
}
#endif
#endif #endif
return r; return r;
...@@ -102,23 +114,28 @@ simde_vminnmvq_f16(simde_float16x8_t a) { ...@@ -102,23 +114,28 @@ simde_vminnmvq_f16(simde_float16x8_t a) {
#if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16) #if defined(SIMDE_ARM_NEON_A64V8_NATIVE) && defined(SIMDE_ARM_NEON_FP16)
return vminnmvq_f16(a); return vminnmvq_f16(a);
#else #else
simde_float32_t r_ = simde_float16_to_float32(SIMDE_INFINITYHF);
simde_float16x8_private a_ = simde_float16x8_to_private(a); simde_float16x8_private a_ = simde_float16x8_to_private(a);
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_RISCV_V_NATIVE) && defined(SIMDE_ARCH_RISCV_ZVFH)
SIMDE_VECTORIZE_REDUCTION(min:r_) return __riscv_vfmv_f_s_f16m1_f16(__riscv_vfredmin_vs_f16m1_f16m1(a_.sv128, \
__riscv_vfmv_v_f_f16m1(SIMDE_INFINITYHF, 8), 8));
#else #else
SIMDE_VECTORIZE simde_float32_t r_ = simde_float16_to_float32(SIMDE_INFINITYHF);
#endif
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
simde_float32_t tmp_a = simde_float16_to_float32(a_.values[i]);
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_FAST_NANS)
r_ = tmp_a < r_ ? tmp_a : r_; SIMDE_VECTORIZE_REDUCTION(min:r_)
#else #else
r_ = (tmp_a < r_) ? tmp_a : ((tmp_a >= r_) ? r_ : ((tmp_a == tmp_a) ? r_ : tmp_a)); SIMDE_VECTORIZE
#endif #endif
} for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
return simde_float16_from_float32(r_); simde_float32_t tmp_a = simde_float16_to_float32(a_.values[i]);
#if defined(SIMDE_FAST_NANS)
r_ = tmp_a < r_ ? tmp_a : r_;
#else
r_ = (tmp_a < r_) ? tmp_a : ((tmp_a >= r_) ? r_ : ((tmp_a == tmp_a) ? r_ : tmp_a));
#endif
}
return simde_float16_from_float32(r_);
#endif
#endif #endif
} }
#if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES) #if defined(SIMDE_ARM_NEON_A64V8_ENABLE_NATIVE_ALIASES)
...@@ -137,18 +154,23 @@ simde_vminnmvq_f32(simde_float32x4_t a) { ...@@ -137,18 +154,23 @@ simde_vminnmvq_f32(simde_float32x4_t a) {
simde_float32x4_private a_ = simde_float32x4_to_private(a); simde_float32x4_private a_ = simde_float32x4_to_private(a);
r = SIMDE_MATH_INFINITYF; r = SIMDE_MATH_INFINITYF;
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_RISCV_V_NATIVE)
SIMDE_VECTORIZE_REDUCTION(min:r) r = __riscv_vfmv_f_s_f32m1_f32(__riscv_vfredmin_vs_f32m1_f32m1(a_.sv128, \
__riscv_vfmv_v_f_f32m1(r, 4), 4));
#else #else
SIMDE_VECTORIZE
#endif
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_FAST_NANS)
r = a_.values[i] < r ? a_.values[i] : r; SIMDE_VECTORIZE_REDUCTION(min:r)
#else #else
r = (a_.values[i] < r) ? a_.values[i] : ((a_.values[i] >= r) ? r : ((a_.values[i] == a_.values[i]) ? r : a_.values[i])); SIMDE_VECTORIZE
#endif #endif
} for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
#if defined(SIMDE_FAST_NANS)
r = a_.values[i] < r ? a_.values[i] : r;
#else
r = (a_.values[i] < r) ? a_.values[i] : ((a_.values[i] >= r) ? r : ((a_.values[i] == a_.values[i]) ? r : a_.values[i]));
#endif
}
#endif
#endif #endif
return r; return r;
...@@ -169,18 +191,23 @@ simde_vminnmvq_f64(simde_float64x2_t a) { ...@@ -169,18 +191,23 @@ simde_vminnmvq_f64(simde_float64x2_t a) {
simde_float64x2_private a_ = simde_float64x2_to_private(a); simde_float64x2_private a_ = simde_float64x2_to_private(a);
r = SIMDE_MATH_INFINITY; r = SIMDE_MATH_INFINITY;
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_RISCV_V_NATIVE)
SIMDE_VECTORIZE_REDUCTION(min:r) r = __riscv_vfmv_f_s_f64m1_f64(__riscv_vfredmin_vs_f64m1_f64m1(a_.sv128, \
__riscv_vfmv_v_f_f64m1(r, 2), 2));
#else #else
SIMDE_VECTORIZE
#endif
for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
#if defined(SIMDE_FAST_NANS) #if defined(SIMDE_FAST_NANS)
r = a_.values[i] < r ? a_.values[i] : r; SIMDE_VECTORIZE_REDUCTION(min:r)
#else #else
r = (a_.values[i] < r) ? a_.values[i] : ((a_.values[i] >= r) ? r : ((a_.values[i] == a_.values[i]) ? r : a_.values[i])); SIMDE_VECTORIZE
#endif #endif
} for (size_t i = 0 ; i < (sizeof(a_.values) / sizeof(a_.values[0])) ; i++) {
#if defined(SIMDE_FAST_NANS)
r = a_.values[i] < r ? a_.values[i] : r;
#else
r = (a_.values[i] < r) ? a_.values[i] : ((a_.values[i] >= r) ? r : ((a_.values[i] == a_.values[i]) ? r : a_.values[i]));
#endif
}
#endif
#endif #endif
return r; return r;
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
* Copyright: * Copyright:
* 2020 Evan Nemerson <evan@nemerson.com> * 2020 Evan Nemerson <evan@nemerson.com>
* 2020 Sean Maher <seanptmaher@gmail.com> (Copyright owned by Google, LLC) * 2020 Sean Maher <seanptmaher@gmail.com> (Copyright owned by Google, LLC)
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_MOVL_H) #if !defined(SIMDE_ARM_NEON_MOVL_H)
...@@ -50,7 +51,10 @@ simde_vmovl_s8(simde_int8x8_t a) { ...@@ -50,7 +51,10 @@ simde_vmovl_s8(simde_int8x8_t a) {
simde_int16x8_private r_; simde_int16x8_private r_;
simde_int8x8_private a_ = simde_int8x8_to_private(a); simde_int8x8_private a_ = simde_int8x8_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) && !defined(SIMDE_BUG_GCC_100761) #if defined(SIMDE_RISCV_V_NATIVE)
vint8mf2_t va = __riscv_vlmul_trunc_v_i8m1_i8mf2 (a_.sv64);
r_.sv128 = __riscv_vwcvt_x_x_v_i16m1 (va, 8);
#elif defined(SIMDE_CONVERT_VECTOR_) && !defined(SIMDE_BUG_GCC_100761)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -83,7 +87,10 @@ simde_vmovl_s16(simde_int16x4_t a) { ...@@ -83,7 +87,10 @@ simde_vmovl_s16(simde_int16x4_t a) {
simde_int32x4_private r_; simde_int32x4_private r_;
simde_int16x4_private a_ = simde_int16x4_to_private(a); simde_int16x4_private a_ = simde_int16x4_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) && !defined(SIMDE_BUG_GCC_100761) #if defined(SIMDE_RISCV_V_NATIVE)
vint16mf2_t va = __riscv_vlmul_trunc_v_i16m1_i16mf2 (a_.sv64);
r_.sv128 = __riscv_vwcvt_x_x_v_i32m1 (va, 4);
#elif defined(SIMDE_CONVERT_VECTOR_) && !defined(SIMDE_BUG_GCC_100761)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -116,7 +123,10 @@ simde_vmovl_s32(simde_int32x2_t a) { ...@@ -116,7 +123,10 @@ simde_vmovl_s32(simde_int32x2_t a) {
simde_int64x2_private r_; simde_int64x2_private r_;
simde_int32x2_private a_ = simde_int32x2_to_private(a); simde_int32x2_private a_ = simde_int32x2_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
vint32mf2_t va = __riscv_vlmul_trunc_v_i32m1_i32mf2(a_.sv64);
r_.sv128 = __riscv_vwcvt_x_x_v_i64m1 (va, 2);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -149,7 +159,10 @@ simde_vmovl_u8(simde_uint8x8_t a) { ...@@ -149,7 +159,10 @@ simde_vmovl_u8(simde_uint8x8_t a) {
simde_uint16x8_private r_; simde_uint16x8_private r_;
simde_uint8x8_private a_ = simde_uint8x8_to_private(a); simde_uint8x8_private a_ = simde_uint8x8_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) && !defined(SIMDE_BUG_GCC_100761) #if defined(SIMDE_RISCV_V_NATIVE)
vuint8mf2_t va = __riscv_vlmul_trunc_v_u8m1_u8mf2(a_.sv64);
r_.sv128 = __riscv_vwcvtu_x_x_v_u16m1 (va, 8);
#elif defined(SIMDE_CONVERT_VECTOR_) && !defined(SIMDE_BUG_GCC_100761)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -182,7 +195,10 @@ simde_vmovl_u16(simde_uint16x4_t a) { ...@@ -182,7 +195,10 @@ simde_vmovl_u16(simde_uint16x4_t a) {
simde_uint32x4_private r_; simde_uint32x4_private r_;
simde_uint16x4_private a_ = simde_uint16x4_to_private(a); simde_uint16x4_private a_ = simde_uint16x4_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) && !defined(SIMDE_BUG_GCC_100761) #if defined(SIMDE_RISCV_V_NATIVE)
vuint16mf2_t va = __riscv_vlmul_trunc_v_u16m1_u16mf2(a_.sv64);
r_.sv128 = __riscv_vwcvtu_x_x_v_u32m1 (va, 4);
#elif defined(SIMDE_CONVERT_VECTOR_) && !defined(SIMDE_BUG_GCC_100761)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -215,7 +231,10 @@ simde_vmovl_u32(simde_uint32x2_t a) { ...@@ -215,7 +231,10 @@ simde_vmovl_u32(simde_uint32x2_t a) {
simde_uint64x2_private r_; simde_uint64x2_private r_;
simde_uint32x2_private a_ = simde_uint32x2_to_private(a); simde_uint32x2_private a_ = simde_uint32x2_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
vuint32mf2_t va = __riscv_vlmul_trunc_v_u32m1_u32mf2(a_.sv64);
r_.sv128 = __riscv_vwcvtu_x_x_v_u64m1 (va, 2);
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* *
* Copyright: * Copyright:
* 2020 Evan Nemerson <evan@nemerson.com> * 2020 Evan Nemerson <evan@nemerson.com>
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_MOVN_H) #if !defined(SIMDE_ARM_NEON_MOVN_H)
...@@ -42,7 +43,9 @@ simde_vmovn_s16(simde_int16x8_t a) { ...@@ -42,7 +43,9 @@ simde_vmovn_s16(simde_int16x8_t a) {
simde_int8x8_private r_; simde_int8x8_private r_;
simde_int16x8_private a_ = simde_int16x8_to_private(a); simde_int16x8_private a_ = simde_int16x8_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv64 = __riscv_vlmul_ext_v_i8mf2_i8m1(__riscv_vncvt_x_x_w_i8mf2(a_.sv128, 8));
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -68,7 +71,9 @@ simde_vmovn_s32(simde_int32x4_t a) { ...@@ -68,7 +71,9 @@ simde_vmovn_s32(simde_int32x4_t a) {
simde_int16x4_private r_; simde_int16x4_private r_;
simde_int32x4_private a_ = simde_int32x4_to_private(a); simde_int32x4_private a_ = simde_int32x4_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv64 = __riscv_vlmul_ext_v_i16mf2_i16m1(__riscv_vncvt_x_x_w_i16mf2(a_.sv128, 4));
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -94,7 +99,9 @@ simde_vmovn_s64(simde_int64x2_t a) { ...@@ -94,7 +99,9 @@ simde_vmovn_s64(simde_int64x2_t a) {
simde_int32x2_private r_; simde_int32x2_private r_;
simde_int64x2_private a_ = simde_int64x2_to_private(a); simde_int64x2_private a_ = simde_int64x2_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv64 = __riscv_vlmul_ext_v_i32mf2_i32m1(__riscv_vncvt_x_x_w_i32mf2(a_.sv128, 2));
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -120,7 +127,9 @@ simde_vmovn_u16(simde_uint16x8_t a) { ...@@ -120,7 +127,9 @@ simde_vmovn_u16(simde_uint16x8_t a) {
simde_uint8x8_private r_; simde_uint8x8_private r_;
simde_uint16x8_private a_ = simde_uint16x8_to_private(a); simde_uint16x8_private a_ = simde_uint16x8_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv64 = __riscv_vlmul_ext_v_u8mf2_u8m1(__riscv_vncvt_x_x_w_u8mf2(a_.sv128, 8));
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -146,7 +155,9 @@ simde_vmovn_u32(simde_uint32x4_t a) { ...@@ -146,7 +155,9 @@ simde_vmovn_u32(simde_uint32x4_t a) {
simde_uint16x4_private r_; simde_uint16x4_private r_;
simde_uint32x4_private a_ = simde_uint32x4_to_private(a); simde_uint32x4_private a_ = simde_uint32x4_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv64 = __riscv_vlmul_ext_v_u16mf2_u16m1(__riscv_vncvt_x_x_w_u16mf2(a_.sv128, 4));
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
...@@ -172,7 +183,9 @@ simde_vmovn_u64(simde_uint64x2_t a) { ...@@ -172,7 +183,9 @@ simde_vmovn_u64(simde_uint64x2_t a) {
simde_uint32x2_private r_; simde_uint32x2_private r_;
simde_uint64x2_private a_ = simde_uint64x2_to_private(a); simde_uint64x2_private a_ = simde_uint64x2_to_private(a);
#if defined(SIMDE_CONVERT_VECTOR_) #if defined(SIMDE_RISCV_V_NATIVE)
r_.sv64 = __riscv_vlmul_ext_v_u32mf2_u32m1(__riscv_vncvt_x_x_w_u32mf2(a_.sv128, 2));
#elif defined(SIMDE_CONVERT_VECTOR_)
SIMDE_CONVERT_VECTOR_(r_.values, a_.values); SIMDE_CONVERT_VECTOR_(r_.values, a_.values);
#else #else
SIMDE_VECTORIZE SIMDE_VECTORIZE
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
* 2020 Evan Nemerson <evan@nemerson.com> * 2020 Evan Nemerson <evan@nemerson.com>
* 2020 Sean Maher <seanptmaher@gmail.com> (Copyright owned by Google, LLC) * 2020 Sean Maher <seanptmaher@gmail.com> (Copyright owned by Google, LLC)
* 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology) * 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology)
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
/* Implementation notes (seanptmaher): /* Implementation notes (seanptmaher):
...@@ -97,11 +98,17 @@ simde_vqdmull_s16(simde_int16x4_t a, simde_int16x4_t b) { ...@@ -97,11 +98,17 @@ simde_vqdmull_s16(simde_int16x4_t a, simde_int16x4_t b) {
simde_int16x4_private simde_int16x4_private
a_ = simde_int16x4_to_private(a), a_ = simde_int16x4_to_private(a),
b_ = simde_int16x4_to_private(b); b_ = simde_int16x4_to_private(b);
#if defined(SIMDE_RISCV_V_NATIVE)
SIMDE_VECTORIZE vint32m2_t mul = __riscv_vwmul_vv_i32m2(a_.sv64, b_.sv64, 4);
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { r_.sv128 = __riscv_vlmul_trunc_v_i32m2_i32m1(__riscv_vmerge_vxm_i32m2(__riscv_vmerge_vxm_i32m2(
r_.values[i] = simde_vqdmullh_s16(a_.values[i], b_.values[i]); __riscv_vsll_vx_i32m2(mul, 1, 4), INT32_MAX, __riscv_vmsgt_vx_i32m2_b16(mul, INT32_C(0x3FFFFFFF), 4), 4),
} INT32_MIN, __riscv_vmslt_vx_i32m2_b16(mul, -INT32_C(0x40000000), 4), 4));
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = simde_vqdmullh_s16(a_.values[i], b_.values[i]);
}
#endif
return simde_int32x4_from_private(r_); return simde_int32x4_from_private(r_);
#endif #endif
...@@ -137,10 +144,17 @@ simde_vqdmull_s32(simde_int32x2_t a, simde_int32x2_t b) { ...@@ -137,10 +144,17 @@ simde_vqdmull_s32(simde_int32x2_t a, simde_int32x2_t b) {
a_ = simde_int32x2_to_private(a), a_ = simde_int32x2_to_private(a),
b_ = simde_int32x2_to_private(b); b_ = simde_int32x2_to_private(b);
SIMDE_VECTORIZE #if defined(SIMDE_RISCV_V_NATIVE)
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { vint64m2_t mul = __riscv_vwmul_vv_i64m2(a_.sv64, b_.sv64, 2);
r_.values[i] = simde_vqdmulls_s32(a_.values[i], b_.values[i]); r_.sv128 = __riscv_vlmul_trunc_v_i64m2_i64m1(__riscv_vmerge_vxm_i64m2(__riscv_vmerge_vxm_i64m2(
} __riscv_vsll_vx_i64m2(mul, 1, 2), INT64_MAX, __riscv_vmsgt_vx_i64m2_b32(mul, INT64_C(0x3FFFFFFFFFFFFFFF), 2), 2),
INT64_MIN, __riscv_vmslt_vx_i64m2_b32(mul, -INT64_C(0x4000000000000000), 2), 2));
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = simde_vqdmulls_s32(a_.values[i], b_.values[i]);
}
#endif
return simde_int64x2_from_private(r_); return simde_int64x2_from_private(r_);
#endif #endif
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
* 2020 Evan Nemerson <evan@nemerson.com> * 2020 Evan Nemerson <evan@nemerson.com>
* 2021 Zhi An Ng <zhin@google.com> (Copyright owned by Google, LLC) * 2021 Zhi An Ng <zhin@google.com> (Copyright owned by Google, LLC)
* 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology) * 2023 Yi-Yen Chung <eric681@andestech.com> (Copyright owned by Andes Technology)
* 2023 Chi-Wei Chu <wewe5215@gapp.nthu.edu.tw> (Copyright owned by NTHU pllab)
*/ */
#if !defined(SIMDE_ARM_NEON_SHRN_N_H) #if !defined(SIMDE_ARM_NEON_SHRN_N_H)
...@@ -44,10 +45,16 @@ simde_vshrn_n_s16 (const simde_int16x8_t a, const int n) ...@@ -44,10 +45,16 @@ simde_vshrn_n_s16 (const simde_int16x8_t a, const int n)
SIMDE_REQUIRE_CONSTANT_RANGE(n, 1, 8) { SIMDE_REQUIRE_CONSTANT_RANGE(n, 1, 8) {
simde_int8x8_private r_; simde_int8x8_private r_;
simde_int16x8_private a_ = simde_int16x8_to_private(a); simde_int16x8_private a_ = simde_int16x8_to_private(a);
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { #if defined(SIMDE_RISCV_V_NATIVE)
r_.values[i] = HEDLEY_STATIC_CAST(int8_t, (a_.values[i] >> n) & UINT8_MAX); vint16m1_t shift = __riscv_vand_vx_i16m1(__riscv_vsll_vx_i16m1 (a_.sv128, n, 8), UINT8_MAX, 8);
} r_.sv64 = __riscv_vlmul_ext_v_i8mf2_i8m1(__riscv_vncvt_x_x_w_i8mf2(shift, 8));
#else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = HEDLEY_STATIC_CAST(int8_t, (a_.values[i] >> n) & UINT8_MAX);
}
#endif
return simde_int8x8_from_private(r_); return simde_int8x8_from_private(r_);
} }
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
...@@ -66,12 +73,15 @@ simde_vshrn_n_s32 (const simde_int32x4_t a, const int n) ...@@ -66,12 +73,15 @@ simde_vshrn_n_s32 (const simde_int32x4_t a, const int n)
SIMDE_REQUIRE_CONSTANT_RANGE(n, 1, 16) { SIMDE_REQUIRE_CONSTANT_RANGE(n, 1, 16) {
simde_int16x4_private r_; simde_int16x4_private r_;
simde_int32x4_private a_ = simde_int32x4_to_private(a); simde_int32x4_private a_ = simde_int32x4_to_private(a);
#if defined(SIMDE_RISCV_V_NATIVE)
SIMDE_VECTORIZE vint32m1_t shift = __riscv_vand_vx_i32m1(__riscv_vsll_vx_i32m1 (a_.sv128, n, 4), UINT16_MAX, 4);
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { r_.sv64 = __riscv_vlmul_ext_v_i16mf2_i16m1(__riscv_vncvt_x_x_w_i16mf2(shift, 4));
r_.values[i] = HEDLEY_STATIC_CAST(int16_t, (a_.values[i] >> n) & UINT16_MAX); #else
} SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = HEDLEY_STATIC_CAST(int16_t, (a_.values[i] >> n) & UINT16_MAX);
}
#endif
return simde_int16x4_from_private(r_); return simde_int16x4_from_private(r_);
} }
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
...@@ -91,11 +101,15 @@ simde_vshrn_n_s64 (const simde_int64x2_t a, const int n) ...@@ -91,11 +101,15 @@ simde_vshrn_n_s64 (const simde_int64x2_t a, const int n)
simde_int32x2_private r_; simde_int32x2_private r_;
simde_int64x2_private a_ = simde_int64x2_to_private(a); simde_int64x2_private a_ = simde_int64x2_to_private(a);
SIMDE_VECTORIZE #if defined(SIMDE_RISCV_V_NATIVE)
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) { vint64m1_t shift = __riscv_vand_vx_i64m1(__riscv_vsll_vx_i64m1 (a_.sv128, n, 2), UINT32_MAX, 2);
r_.values[i] = HEDLEY_STATIC_CAST(int32_t, (a_.values[i] >> n) & UINT32_MAX); r_.sv64 = __riscv_vlmul_ext_v_i32mf2_i32m1(__riscv_vncvt_x_x_w_i32mf2(shift, 2));
} #else
SIMDE_VECTORIZE
for (size_t i = 0 ; i < (sizeof(r_.values) / sizeof(r_.values[0])) ; i++) {
r_.values[i] = HEDLEY_STATIC_CAST(int32_t, (a_.values[i] >> n) & UINT32_MAX);
}
#endif
return simde_int32x2_from_private(r_); return simde_int32x2_from_private(r_);
} }
#if defined(SIMDE_ARM_NEON_A32V7_NATIVE) #if defined(SIMDE_ARM_NEON_A32V7_NATIVE)
......
This diff is collapsed.
This diff is collapsed.
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