adding __packed_store_active2 to generic targets
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
define(`MASK',`i32')
|
define(`MASK',`i32')
|
||||||
define(`WIDTH',`1')
|
define(`WIDTH',`1')
|
||||||
include(`util.m4')
|
include(`util.m4')
|
||||||
|
rdrand_decls()
|
||||||
; Define some basics for a 1-wide target
|
; Define some basics for a 1-wide target
|
||||||
stdlib_core()
|
stdlib_core()
|
||||||
packed_load_and_store()
|
packed_load_and_store()
|
||||||
@@ -655,7 +656,7 @@ define <1 x float> @__rsqrt_varying_float(<1 x float> %v) nounwind readonly alw
|
|||||||
declare <1 x float> @__svml_sind(<1 x float>) nounwind readnone alwaysinline
|
declare <1 x float> @__svml_sind(<1 x float>) nounwind readnone alwaysinline
|
||||||
declare <1 x float> @__svml_asind(<1 x float>) nounwind readnone alwaysinline
|
declare <1 x float> @__svml_asind(<1 x float>) nounwind readnone alwaysinline
|
||||||
declare <1 x float> @__svml_cosd(<1 x float>) nounwind readnone alwaysinline
|
declare <1 x float> @__svml_cosd(<1 x float>) nounwind readnone alwaysinline
|
||||||
declare void @__svml_sincosd(<1 x float>, <1 x float> *, <1 x float> *) nounwind readnone alwaysinline
|
declare void @__svml_sincosd(<1 x float>, <1 x double> *, <1 x double> *) nounwind readnone alwaysinline
|
||||||
declare <1 x float> @__svml_tand(<1 x float>) nounwind readnone alwaysinline
|
declare <1 x float> @__svml_tand(<1 x float>) nounwind readnone alwaysinline
|
||||||
declare <1 x float> @__svml_atand(<1 x float>) nounwind readnone alwaysinline
|
declare <1 x float> @__svml_atand(<1 x float>) nounwind readnone alwaysinline
|
||||||
declare <1 x float> @__svml_atan2d(<1 x float>, <1 x float>) nounwind readnone alwaysinline
|
declare <1 x float> @__svml_atan2d(<1 x float>, <1 x float>) nounwind readnone alwaysinline
|
||||||
|
|||||||
@@ -371,6 +371,8 @@ declare i32 @__packed_load_active(i32 * nocapture, <WIDTH x i32> * nocapture,
|
|||||||
<WIDTH x i1>) nounwind
|
<WIDTH x i1>) nounwind
|
||||||
declare i32 @__packed_store_active(i32 * nocapture, <WIDTH x i32> %vals,
|
declare i32 @__packed_store_active(i32 * nocapture, <WIDTH x i32> %vals,
|
||||||
<WIDTH x i1>) nounwind
|
<WIDTH x i1>) nounwind
|
||||||
|
declare i32 @__packed_store_active2(i32 * nocapture, <WIDTH x i32> %vals,
|
||||||
|
<WIDTH x i1>) nounwind
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|||||||
@@ -1472,31 +1472,38 @@ static FORCEINLINE int32_t __packed_store_active(int32_t *ptr, __vec16_i32 val,
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static FORCEINLINE int32_t __packed_store_active2(int32_t *ptr, __vec16_i32 val,
|
||||||
|
__vec16_i1 mask) {
|
||||||
|
int count = 0;
|
||||||
|
int32_t *ptr_ = ptr;
|
||||||
|
for (int i = 0; i < 16; ++i) {
|
||||||
|
*ptr = val.v[i];
|
||||||
|
ptr += mask.v & 1;
|
||||||
|
mask.v = mask.v >> 1;
|
||||||
|
}
|
||||||
|
return ptr - ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static FORCEINLINE int32_t __packed_load_active(uint32_t *ptr,
|
static FORCEINLINE int32_t __packed_load_active(uint32_t *ptr,
|
||||||
__vec16_i32 *val,
|
__vec16_i32 *val,
|
||||||
__vec16_i1 mask) {
|
__vec16_i1 mask) {
|
||||||
int count = 0;
|
return __packed_load_active((int32_t *)ptr, val, mask);
|
||||||
for (int i = 0; i < 16; ++i) {
|
|
||||||
if ((mask.v & (1 << i)) != 0) {
|
|
||||||
val->v[i] = *ptr++;
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static FORCEINLINE int32_t __packed_store_active(uint32_t *ptr,
|
static FORCEINLINE int32_t __packed_store_active(uint32_t *ptr,
|
||||||
__vec16_i32 val,
|
__vec16_i32 val,
|
||||||
__vec16_i1 mask) {
|
__vec16_i1 mask) {
|
||||||
int count = 0;
|
return __packed_store_active((int32_t *)ptr, val, mask);
|
||||||
for (int i = 0; i < 16; ++i) {
|
}
|
||||||
if ((mask.v & (1 << i)) != 0) {
|
|
||||||
*ptr++ = val.v[i];
|
|
||||||
++count;
|
static FORCEINLINE int32_t __packed_store_active2(uint32_t *ptr,
|
||||||
}
|
__vec16_i32 val,
|
||||||
}
|
__vec16_i1 mask) {
|
||||||
return count;
|
return __packed_store_active2((int32_t *)ptr, val, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1523,31 +1523,38 @@ static FORCEINLINE int32_t __packed_store_active(int32_t *ptr, __vec32_i32 val,
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static FORCEINLINE int32_t __packed_store_active2(int32_t *ptr, __vec32_i32 val,
|
||||||
|
__vec32_i1 mask) {
|
||||||
|
int count = 0;
|
||||||
|
int32_t *ptr_ = ptr;
|
||||||
|
for (int i = 0; i < 32; ++i) {
|
||||||
|
*ptr = val.v[i];
|
||||||
|
ptr += mask.v & 1;
|
||||||
|
mask.v = mask.v >> 1;
|
||||||
|
}
|
||||||
|
return ptr - ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static FORCEINLINE int32_t __packed_load_active(uint32_t *ptr,
|
static FORCEINLINE int32_t __packed_load_active(uint32_t *ptr,
|
||||||
__vec32_i32 *val,
|
__vec32_i32 *val,
|
||||||
__vec32_i1 mask) {
|
__vec32_i1 mask) {
|
||||||
int count = 0;
|
return __packed_load_active((int32_t *)ptr, val, mask);
|
||||||
for (int i = 0; i < 32; ++i) {
|
|
||||||
if ((mask.v & (1 << i)) != 0) {
|
|
||||||
val->v[i] = *ptr++;
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static FORCEINLINE int32_t __packed_store_active(uint32_t *ptr,
|
static FORCEINLINE int32_t __packed_store_active(uint32_t *ptr,
|
||||||
__vec32_i32 val,
|
__vec32_i32 val,
|
||||||
__vec32_i1 mask) {
|
__vec32_i1 mask) {
|
||||||
int count = 0;
|
return __packed_store_active((int32_t *)ptr, val, mask);
|
||||||
for (int i = 0; i < 32; ++i) {
|
}
|
||||||
if ((mask.v & (1 << i)) != 0) {
|
|
||||||
*ptr++ = val.v[i];
|
|
||||||
++count;
|
static FORCEINLINE int32_t __packed_store_active2(uint32_t *ptr,
|
||||||
}
|
__vec32_i32 val,
|
||||||
}
|
__vec32_i1 mask) {
|
||||||
return count;
|
return __packed_store_active2((int32_t *)ptr, val, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1656,31 +1656,38 @@ static FORCEINLINE int32_t __packed_store_active(int32_t *ptr, __vec64_i32 val,
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static FORCEINLINE int32_t __packed_store_active2(int32_t *ptr, __vec64_i32 val,
|
||||||
|
__vec64_i1 mask) {
|
||||||
|
int count = 0;
|
||||||
|
int32_t *ptr_ = ptr;
|
||||||
|
for (int i = 0; i < 64; ++i) {
|
||||||
|
*ptr = val.v[i];
|
||||||
|
ptr += mask.v & 1;
|
||||||
|
mask.v = mask.v >> 1;
|
||||||
|
}
|
||||||
|
return ptr - ptr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static FORCEINLINE int32_t __packed_load_active(uint32_t *ptr,
|
static FORCEINLINE int32_t __packed_load_active(uint32_t *ptr,
|
||||||
__vec64_i32 *val,
|
__vec64_i32 *val,
|
||||||
__vec64_i1 mask) {
|
__vec64_i1 mask) {
|
||||||
int count = 0;
|
return __packed_load_active((int32_t *) ptr, val, mask);
|
||||||
for (int i = 0; i < 64; ++i) {
|
|
||||||
if ((mask.v & (1ull << i)) != 0) {
|
|
||||||
val->v[i] = *ptr++;
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static FORCEINLINE int32_t __packed_store_active(uint32_t *ptr,
|
static FORCEINLINE int32_t __packed_store_active(uint32_t *ptr,
|
||||||
__vec64_i32 val,
|
__vec64_i32 val,
|
||||||
__vec64_i1 mask) {
|
__vec64_i1 mask) {
|
||||||
int count = 0;
|
return __packed_store_active((int32_t *) ptr, val, mask);
|
||||||
for (int i = 0; i < 64; ++i) {
|
}
|
||||||
if ((mask.v & (1ull << i)) != 0) {
|
|
||||||
*ptr++ = val.v[i];
|
|
||||||
++count;
|
static FORCEINLINE int32_t __packed_store_active2(uint32_t *ptr,
|
||||||
}
|
__vec64_i32 val,
|
||||||
}
|
__vec64_i1 mask) {
|
||||||
return count;
|
return __packed_store_active2((int32_t *) ptr, val, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2451,20 +2451,24 @@ static FORCEINLINE int32_t __packed_store_active(uint32_t *p, __vec16_i32 val, _
|
|||||||
return _mm_countbits_32(uint32_t(mask));
|
return _mm_countbits_32(uint32_t(mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCEINLINE int32_t __packed_store_active2(uint32_t *p, __vec16_i32 val, __vec16_i1 mask)
|
||||||
|
{
|
||||||
|
return __packed_store_active(p, val, mask);
|
||||||
|
}
|
||||||
|
|
||||||
static FORCEINLINE int32_t __packed_load_active(int32_t *p, __vec16_i32 *val, __vec16_i1 mask)
|
static FORCEINLINE int32_t __packed_load_active(int32_t *p, __vec16_i32 *val, __vec16_i1 mask)
|
||||||
{
|
{
|
||||||
__vec16_i32 v = __load<64>(val);
|
return __packed_load_active((uint32_t *)p, val, mask);
|
||||||
v = _mm512_mask_extloadunpacklo_epi32(v, mask, p, _MM_UPCONV_EPI32_NONE, _MM_HINT_NONE);
|
|
||||||
v = _mm512_mask_extloadunpackhi_epi32(v, mask, (uint8_t*)p+64, _MM_UPCONV_EPI32_NONE, _MM_HINT_NONE);
|
|
||||||
__store<64>(val, v);
|
|
||||||
return _mm_countbits_32(uint32_t(mask));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCEINLINE int32_t __packed_store_active(int32_t *p, __vec16_i32 val, __vec16_i1 mask)
|
static FORCEINLINE int32_t __packed_store_active(int32_t *p, __vec16_i32 val, __vec16_i1 mask)
|
||||||
{
|
{
|
||||||
_mm512_mask_extpackstorelo_epi32(p, mask, val, _MM_DOWNCONV_EPI32_NONE, _MM_HINT_NONE);
|
return __packed_store_active((uint32_t *)p, val, mask);
|
||||||
_mm512_mask_extpackstorehi_epi32((uint8_t*)p+64, mask, val, _MM_DOWNCONV_EPI32_NONE, _MM_HINT_NONE);
|
}
|
||||||
return _mm_countbits_32(uint32_t(mask));
|
|
||||||
|
static FORCEINLINE int32_t __packed_store_active2(int32_t *p, __vec16_i32 val, __vec16_i1 mask)
|
||||||
|
{
|
||||||
|
return __packed_store_active(p, val, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -2496,20 +2496,23 @@ static FORCEINLINE int32_t __packed_store_active(uint32_t *p, __vec8_i32 val,
|
|||||||
_mm512_mask_extpackstorehi_epi32((uint8_t*)p+64, 0xFF & mask, val, _MM_DOWNCONV_EPI32_NONE, _MM_HINT_NONE);
|
_mm512_mask_extpackstorehi_epi32((uint8_t*)p+64, 0xFF & mask, val, _MM_DOWNCONV_EPI32_NONE, _MM_HINT_NONE);
|
||||||
return _mm_countbits_32(uint32_t(0xFF & mask));
|
return _mm_countbits_32(uint32_t(0xFF & mask));
|
||||||
}
|
}
|
||||||
|
static FORCEINLINE int32_t __packed_store_active2(uint32_t *ptr, __vec4_i32 val,
|
||||||
|
__vec4_i1 mask) {
|
||||||
|
return __packed_store_active(ptr, val, mask);
|
||||||
|
}
|
||||||
static FORCEINLINE int32_t __packed_load_active(int32_t *p, __vec8_i32 *val,
|
static FORCEINLINE int32_t __packed_load_active(int32_t *p, __vec8_i32 *val,
|
||||||
__vec8_i1 mask) {
|
__vec8_i1 mask) {
|
||||||
__vec8_i32 v = __load<64>(val);
|
return __packed_load_active((uint32_t *)p, val, mask);
|
||||||
v = _mm512_mask_extloadunpacklo_epi32(v, 0xFF & mask, p, _MM_UPCONV_EPI32_NONE, _MM_HINT_NONE);
|
|
||||||
v = _mm512_mask_extloadunpackhi_epi32(v, 0xFF & mask, (uint8_t*)p+64, _MM_UPCONV_EPI32_NONE, _MM_HINT_NONE);
|
|
||||||
__store<64>(val, v);
|
|
||||||
return _mm_countbits_32(uint32_t(0xFF & mask));
|
|
||||||
}
|
}
|
||||||
static FORCEINLINE int32_t __packed_store_active(int32_t *p, __vec8_i32 val,
|
static FORCEINLINE int32_t __packed_store_active(int32_t *p, __vec8_i32 val,
|
||||||
__vec8_i1 mask) {
|
__vec8_i1 mask) {
|
||||||
_mm512_mask_extpackstorelo_epi32(p, 0xFF & mask, val, _MM_DOWNCONV_EPI32_NONE, _MM_HINT_NONE);
|
return __packed_store_active((uint32_t *)p, val, mask);
|
||||||
_mm512_mask_extpackstorehi_epi32((uint8_t*)p+64, 0xFF & mask, val, _MM_DOWNCONV_EPI32_NONE, _MM_HINT_NONE);
|
|
||||||
return _mm_countbits_32(uint32_t(0xFF & mask));
|
|
||||||
}
|
}
|
||||||
|
static FORCEINLINE int32_t __packed_store_active2(int32_t *ptr, __vec4_i32 val,
|
||||||
|
__vec4_i1 mask) {
|
||||||
|
return __packed_store_active(ptr, val, mask);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -1878,6 +1878,11 @@ static FORCEINLINE int32_t __packed_store_active(uint32_t *p, __vec16_i32 val,
|
|||||||
return _mm_countbits_32(uint32_t(mask));
|
return _mm_countbits_32(uint32_t(mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCEINLINE int32_t __packed_store_active2(uint32_t *p, __vec16_i32 val, __vec16_i1 mask)
|
||||||
|
{
|
||||||
|
return __packed_store_active(p, val, mask);
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// prefetch
|
// prefetch
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -3798,6 +3798,25 @@ static FORCEINLINE int32_t __packed_store_active(int32_t *ptr, __vec4_i32 val,
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCEINLINE int32_t __packed_store_active2(int32_t *ptr, __vec4_i32 val,
|
||||||
|
__vec4_i1 mask) {
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
ptr[count] = _mm_extract_epi32(val.v, 0);
|
||||||
|
count -= _mm_extract_ps(mask.v, 0);
|
||||||
|
|
||||||
|
ptr[count] = _mm_extract_epi32(val.v, 1);
|
||||||
|
count -= _mm_extract_ps(mask.v, 1);
|
||||||
|
|
||||||
|
ptr[count] = _mm_extract_epi32(val.v, 2);
|
||||||
|
count -= _mm_extract_ps(mask.v, 2);
|
||||||
|
|
||||||
|
ptr[count] = _mm_extract_epi32(val.v, 3);
|
||||||
|
count -= _mm_extract_ps(mask.v, 3);
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
static FORCEINLINE int32_t __packed_load_active(uint32_t *ptr, __vec4_i32 *val,
|
static FORCEINLINE int32_t __packed_load_active(uint32_t *ptr, __vec4_i32 *val,
|
||||||
__vec4_i1 mask) {
|
__vec4_i1 mask) {
|
||||||
return __packed_load_active((int32_t *)ptr, val, mask);
|
return __packed_load_active((int32_t *)ptr, val, mask);
|
||||||
@@ -3808,6 +3827,11 @@ static FORCEINLINE int32_t __packed_store_active(uint32_t *ptr, __vec4_i32 val,
|
|||||||
return __packed_store_active((int32_t *)ptr, val, mask);
|
return __packed_store_active((int32_t *)ptr, val, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCEINLINE int32_t __packed_store_active2(uint32_t *ptr, __vec4_i32 val,
|
||||||
|
__vec4_i1 mask) {
|
||||||
|
return __packed_store_active2((int32_t *)ptr, val, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// aos/soa
|
// aos/soa
|
||||||
|
|||||||
Reference in New Issue
Block a user