Add Pentium 4 Linux support
This commit is contained in:
+31
-2
@@ -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
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user