per thread context loading is ok, working on global context

This commit is contained in:
Nitload
2026-02-25 00:20:09 +08:00
parent 7ee9c749e5
commit b71515b2d4
9 changed files with 225 additions and 218 deletions
+1 -2
View File
@@ -19,7 +19,7 @@ PRIVATE void load_intrinsic_avx(sn_intrinsic *context, SIMDID id);
PRIVATE void load_intrinsic_512_dual(sn_intrinsic *context, SIMDID id);
PRIVATE void load_intrinsic_512(sn_intrinsic *context, SIMDID id);
SN_API SIMDID load_intrinsic_function(void *intrinsic_context, uint64_t id)
SN_API void load_intrinsic_function(void *intrinsic_context, uint64_t id)
{
sn_null_assert(intrinsic_context);
@@ -45,7 +45,6 @@ SN_API SIMDID load_intrinsic_function(void *intrinsic_context, uint64_t id)
load_intrinsic_512(context, simdid);
break;
}
return simdid;
}
void load_intrinsic_sse(sn_intrinsic *context, SIMDID id)
+24 -25
View File
@@ -20,33 +20,34 @@
* [63..56] uArchHi make_byte[7]
* ----------------------------------------------------------------------- */
#define FIELD_MAIN(id) ((unsigned char)(id).make_byte[1])
#define FIELD_AVX512(id) ((uint16_t)((unsigned char)(id).make_byte[2] | \
((unsigned char)(id).make_byte[3] << 8)))
#define FIELD_AMX(id) ((unsigned char)(id).make_byte[4])
#define FIELD_AVX(id) ((unsigned char)(id).make_byte[5])
#define FIELD_AVX10(id) ((unsigned char)(id).make_byte[6])
#define FIELD_UARCH(id) ((unsigned char)(id).make_byte[7])
#define FIELD_MAIN(id) ((unsigned char)(id).make_byte[1])
#define FIELD_AVX512(id) \
((uint16_t)((unsigned char)(id).make_byte[2] | ((unsigned char)(id).make_byte[3] << 8)))
#define FIELD_AMX(id) ((unsigned char)(id).make_byte[4])
#define FIELD_AVX(id) ((unsigned char)(id).make_byte[5])
#define FIELD_AVX10(id) ((unsigned char)(id).make_byte[6])
#define FIELD_UARCH(id) ((unsigned char)(id).make_byte[7])
/* Portable popcount for a 16-bit value. */
static int popcount16(uint16_t v)
{
int c = 0;
while (v) { v &= v - 1; c++; }
while (v) {
v &= v - 1;
c++;
}
return c;
}
/* Map AVX512_IMPL 2-bit field to a strength ordinal for tie-breaking.
* DUAL(1) => 0 (weakest), UNKNOWN(0) => 1, NATIVE(2) => 2 (strongest) */
* Index = impl value (0=UNKNOWN, 1=DUAL, 2=NATIVE, 3=reserved).
* Strength: DUAL(0) < UNKNOWN(1) < NATIVE(2). */
static const int impl_strength_table[4] = { 1, 0, 2, 1 };
static int impl_strength(uint16_t avx512)
{
unsigned impl = (avx512 >> SIMDID_AVX512_IMPL_SHIFT) & 0x3u;
switch (impl) {
case 1: return 0; /* DUAL — glue / downclock risk */
case 0: return 1; /* UNKNOWN — conservatively mid */
case 2: return 2; /* NATIVE — full-width ALU */
default: return 1; /* reserved, treat as unknown */
}
return impl_strength_table[impl];
}
/* -----------------------------------------------------------------------
@@ -85,11 +86,10 @@ SN_API SIMDID SN_DECL sn_get_unite_simd(SIMDID left, SIMDID right)
/* Clear the IMPL field, then set the weaker one */
int ls = impl_strength(l512);
int rs = impl_strength(r512);
unsigned weak_impl = (ls <= rs)
? ((l512 >> SIMDID_AVX512_IMPL_SHIFT) & 0x3u)
: ((r512 >> SIMDID_AVX512_IMPL_SHIFT) & 0x3u);
merged = (merged & ~(uint16_t)SIMDID_AVX512_IMPL_MASK)
| (uint16_t)(weak_impl << SIMDID_AVX512_IMPL_SHIFT);
int s = (ls <= rs) ? l512 : r512; /* pick the one with weaker strength ordinal */
unsigned weak_impl = (s >> SIMDID_AVX512_IMPL_SHIFT) & 0x3u;
merged &= ~(uint16_t)SIMDID_AVX512_IMPL_MASK;
merged |= (uint16_t)(weak_impl << SIMDID_AVX512_IMPL_SHIFT);
out.make_byte[2] = (char)(merged & 0xFF);
out.make_byte[3] = (char)((merged >> 8) & 0xFF);
@@ -171,10 +171,9 @@ SN_API int SN_DECL sn_compare_simd(SIMDID left, SIMDID right)
if (lb != rb)
return lb > rb ? 1 : -1;
/* 4. Extension popcount (mask out BASE + IMPL + reserved low nibble) */
uint16_t ext_mask = (uint16_t)~(SIMDID_AVX512_BASE
| SIMDID_AVX512_IMPL_MASK
| 0x000Fu);
// 4. Extension popcount (mask out BASE + IMPL + reserved low nibble)
int drop = ~(SIMDID_AVX512_BASE | SIMDID_AVX512_IMPL_MASK | 0x000Fu);
uint16_t ext_mask = drop & (l512 | r512); /* only consider bits set in either */
int lp = popcount16(l512 & ext_mask);
int rp = popcount16(r512 & ext_mask);
if (lp != rp)
@@ -196,4 +195,4 @@ SN_API int SN_DECL sn_compare_simd(SIMDID left, SIMDID right)
return 0;
}
#endif
#endif