many versions of simdid
This commit is contained in:
@@ -61,7 +61,7 @@ static int impl_strength(uint16_t avx512)
|
||||
* - AVX features : bitwise AND
|
||||
* - AVX10 features : bitwise AND
|
||||
* - Root / Manu : keep left (must be same arch in practice)
|
||||
* - uArchHi : min (most conservative policy)
|
||||
* - uArchHi : bitwise OR (HYBRID_P/E union; SIMD_DUAL set if either core is dual)
|
||||
* ----------------------------------------------------------------------- */
|
||||
SN_API SIMDID SN_DECL sn_get_unite_simd(SIMDID left, SIMDID right)
|
||||
{
|
||||
@@ -102,10 +102,14 @@ SN_API SIMDID SN_DECL sn_get_unite_simd(SIMDID left, SIMDID right)
|
||||
/* AVX10 (byte 6): AND */
|
||||
out.make_byte[6] = left.make_byte[6] & right.make_byte[6];
|
||||
|
||||
/* uArchHi (byte 7): min */
|
||||
/* uArchHi (byte 7):
|
||||
* topology bits [1..0]: AND — conservative intersection (weaker topology wins)
|
||||
* SIMD_DUAL bit [2]: OR — dual if either core is dual */
|
||||
unsigned char lu = FIELD_UARCH(left);
|
||||
unsigned char ru = FIELD_UARCH(right);
|
||||
out.make_byte[7] = (char)(lu < ru ? lu : ru);
|
||||
unsigned char topo = (lu & 0x3u) & (ru & 0x3u);
|
||||
unsigned char dual = (lu | ru) & (unsigned char)SIMDID_UARCH_SIMD_DUAL;
|
||||
out.make_byte[7] = (char)(topo | dual);
|
||||
|
||||
return out;
|
||||
}
|
||||
@@ -142,8 +146,12 @@ SN_API SIMDID SN_DECL sn_get_unite_simd(SIMDID left, SIMDID right)
|
||||
* DUAL(weakest) < UNKNOWN < NATIVE(strongest).
|
||||
* This is not ISA capability but execution-width risk.
|
||||
*
|
||||
* 6. uArchHi (final tie-break)
|
||||
* Higher value = more specific / stronger policy hint.
|
||||
* 6. uArchHi topology bits [1..0]
|
||||
* Numeric value: unified(11=3) > P-core(10=2) > E-core(01=1) > unknown(00=0).
|
||||
* Higher value = stronger / higher-capability core form.
|
||||
*
|
||||
* 7. uArchHi SIMD_DUAL (final tie-break)
|
||||
* Non-dual (SIMD_DUAL=0) > dual (SIMD_DUAL=1).
|
||||
* ----------------------------------------------------------------------- */
|
||||
SN_API int SN_DECL sn_compare_simd(SIMDID left, SIMDID right)
|
||||
{
|
||||
@@ -186,11 +194,19 @@ SN_API int SN_DECL sn_compare_simd(SIMDID left, SIMDID right)
|
||||
return ls > rs ? 1 : -1;
|
||||
}
|
||||
|
||||
/* 6. uArchHi (final tie-break) */
|
||||
/* 6. uArchHi topology bits [1..0]: unified(3) > P(2) > E(1) > unknown(0) */
|
||||
unsigned lu = FIELD_UARCH(left);
|
||||
unsigned ru = FIELD_UARCH(right);
|
||||
if (lu != ru)
|
||||
return lu > ru ? 1 : -1;
|
||||
unsigned lt = lu & 0x3u;
|
||||
unsigned rt = ru & 0x3u;
|
||||
if (lt != rt)
|
||||
return lt > rt ? 1 : -1;
|
||||
|
||||
/* 7. uArchHi SIMD_DUAL: non-dual (SIMD_DUAL=0) > dual (SIMD_DUAL=1) */
|
||||
int ld = (lu & SIMDID_UARCH_SIMD_DUAL) != 0;
|
||||
int rd = (ru & SIMDID_UARCH_SIMD_DUAL) != 0;
|
||||
if (ld != rd)
|
||||
return ld ? -1 : 1; /* non-dual is stronger */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user