Add Pentium 4 Linux support

This commit is contained in:
2026-07-17 19:43:26 -05:00
parent 7f33d448c7
commit 136b417cf8
5 changed files with 76 additions and 7 deletions
+31 -2
View File
@@ -11,6 +11,10 @@
#include <stdio.h>
#include <string.h>
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
#include <emmintrin.h>
#endif
#if defined(__linux__)
#include <sys/auxv.h>
#endif
@@ -64,7 +68,7 @@ uint64_t fm_primes(uint64_t limit, uint8_t *sieve)
return count;
}
#if !defined(__powerpc64__)
#if defined(__powerpc__) && !defined(__powerpc64__)
static uint64_t fm_simd_scalar(uint64_t iters, void *memory)
{
uint32_t *v = (uint32_t *)memory;
@@ -109,7 +113,7 @@ uint64_t fm_simd(uint64_t iters, void *memory)
sum ^= v[j];
return sum;
}
#else
#elif defined(__powerpc__)
/* These are kept in fossmark_ppc32_ext.S so this translation unit, and thus
* the executable's default code path, only requires baseline PPC32. */
extern void fm_simd_ps_kernel(uint64_t iters, void *memory);
@@ -192,6 +196,31 @@ uint64_t fm_simd(uint64_t iters, void *memory)
sum ^= v[j];
return sum;
}
#else
uint64_t fm_simd(uint64_t iters, void *memory)
{
__m128i a, b;
uint32_t *v = (uint32_t *)memory;
uint32_t sum = 0;
uint64_t i;
unsigned j;
if (!iters)
return 0;
a = _mm_loadu_si128((const __m128i *)v);
b = _mm_loadu_si128((const __m128i *)(v + 4));
for (i = 0; i < iters; i++) {
a = _mm_add_epi32(a, b);
b = _mm_xor_si128(b, a);
a = _mm_add_epi32(a, b);
b = _mm_xor_si128(b, a);
}
_mm_storeu_si128((__m128i *)v, a);
_mm_storeu_si128((__m128i *)(v + 4), b);
for (j = 0; j < 8; j++)
sum ^= v[j];
return sum;
}
#endif
static uint32_t load32_native(const uint8_t *p)
+9 -1
View File
@@ -42,7 +42,7 @@
#ifndef FM_API_BASE_URL
# define FM_API_BASE_URL "https://fossbench.net"
#endif
#define FM_VERSION "0.1.3-hotfix3"
#define FM_VERSION "0.1.3-hotfix4"
/* ---------- platform identification (for the banner only) ---------- */
@@ -66,6 +66,11 @@
# define D_INT "64-bit ALU: imul, mul, div, bitops"
# define D_FP "double: mulsd/addsd, divsd, sqrtsd"
# define D_SIMD "SSE2: 128-bit integer + float"
#elif defined(__i386__) || defined(_M_IX86)
# define FM_ARCH "x86 32-bit"
# define D_INT "Pentium 4 integer ALU and software 64-bit arithmetic"
# define D_FP "x87 scalar double-precision floating point"
# define D_SIMD "SSE2: 128-bit integer vectors"
#elif defined(__powerpc64__)
# define FM_ARCH "PowerPC 64-bit big-endian"
# define D_INT "64-bit PowerPC integer ALU"
@@ -145,6 +150,9 @@ extern uint64_t fm_chase(void **ptrs, uint64_t steps);
#if defined(__powerpc__) && !defined(__powerpc64__)
# define CHASE_NODES (1u << 19) /* 2 MiB with 32-bit pointers */
# define CHASE_DETAIL "dependent-load pointer chase, 2 MiB"
#elif UINTPTR_MAX == UINT32_MAX
# define CHASE_NODES (1u << 21) /* 8 MiB with 32-bit pointers */
# define CHASE_DETAIL "dependent-load pointer chase, 8 MiB"
#else
# define CHASE_NODES (1u << 21) /* 16 MiB cycle, > any L2 */
# define CHASE_DETAIL "dependent-load pointer chase, 16 MiB"