diff options
| author | 2025-08-20 14:15:05 +0330 | |
|---|---|---|
| committer | 2025-08-20 14:15:05 +0330 | |
| commit | a6d16990fd6109f569324bb1422bfb603f6d031b (patch) | |
| tree | dfe95ec2a8740dc8dfd29e4199af56bcd5938015 /pu2 | |
| parent | the speedster (diff) | |
added compat flags for easier cross-compilation
Diffstat (limited to 'pu2')
| -rw-r--r-- | pu2/pu2.c | 6 | ||||
| -rw-r--r-- | pu2/pu2.out.c | 72 |
2 files changed, 64 insertions, 14 deletions
@@ -286,7 +286,7 @@ int *Data; init_ir2() { Code = &m[ 4000 ]; - Data = &m[ S * sizeof(int) - 1 ]; // grows downwards + Data = &m[ S - 1 ]; // grows downwards } __attribute__((always_inline)) emit(int op, int val) { @@ -638,9 +638,13 @@ string op_names[] = { "hlt", "imm", "lod", "str", "swp", "add", "sub", "and", "n "a2u", "u2a", "b2u", "u2b", "nop", "cb1", "cb2", "cb3", "cb4" }; unsigned long long rdtsc(void) { +#ifndef PU2_NO_ASM unsigned hi, lo; __asm__ __volatile__("rdtsc" : "=a"(lo), "=d"(hi)); return ((unsigned long long) hi << 32) | lo; +#else + return 0; +#endif } clock_t ntime() { diff --git a/pu2/pu2.out.c b/pu2/pu2.out.c index 3f165de..98f0554 100644 --- a/pu2/pu2.out.c +++ b/pu2/pu2.out.c @@ -1,7 +1,18 @@ +/* -- BEGIN COMPILE TIME FLAGS -- */ +// #define PU2_NO_MMAP +// #define PU2_NO_ASM +#define __PU2_SPEED_IMPROVEMENT +#define __PU2_EXTENDED_INSTRUCTION_SET +/* -- END COMPILE TIME FLAGS --*/ + +#define _GNU_SOURCE #include <ctype.h> +#include <sched.h> #include <stdlib.h> #include <string.h> -#include <sys/mman.h> +#ifndef PU2_NO_MMAP + #include <sys/mman.h> +#endif #pragma clang diagnostic ignored "-Wparentheses" #pragma clang diagnostic ignored "-Wreturn-type" #pragma clang diagnostic ignored "-Wempty-body" @@ -17,9 +28,6 @@ // #define A my_custom_cpu_error_trap() // ^ calls my_custom_cpu_error_trap() -#define __PU2_SPEED_IMPROVEMENT -#define __PU2_EXTENDED_INSTRUCTION_SET - #define S (1 << 26) #define J while #define H !--c @@ -66,7 +74,12 @@ #define unlikely(JJ) __builtin_expect((JJ), 0) #define likely(JJ) __builtin_expect((JJ), 1) -__attribute__((aligned(64))) * m, a, b, u, c; + #ifndef PU2_NO_MMAP +__attribute__((aligned(64))) int *m; + #else +__attribute__((aligned(64))) int m[ S ]; + #endif +int a, b, u, c; typedef struct { int c; int v; @@ -74,12 +87,30 @@ typedef struct { const int hugepage_size = 2 * 1024 * 1024; -init_pu2() { +// unused +void set_affinity(int cpu) { + cpu_set_t mask; + CPU_ZERO(&mask); + CPU_SET(cpu, &mask); + + if (sched_setaffinity(0, sizeof(mask), &mask) != 0) { perror("sched_setaffinity failed"); } +} + +void init_pu2() { + // set_affinity(0); + + #ifndef PU2_NO_MMAP const int S_val = S * sizeof(int); - const int page_count = (S_val / hugepage_size) + 1; - const int page_size = page_count * hugepage_size; - m = mmap( - NULL, page_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0); + int page_count = (S_val / hugepage_size) + 1; + if (page_count < 1) page_count = 1; + const int page_size = page_count * hugepage_size; + m = mmap( + NULL, + page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGE_2MB | MAP_HUGETLB, + -1, + 0); if (m == MAP_FAILED) { perror("[warn] couldn't allocate pu2 memory"); printf( @@ -89,14 +120,15 @@ init_pu2() { page_count); exit(1); } + #endif - size_t i; - for (i = 0; i < 64; i++) ((char *) m)[ i * hugepage_size ] = 0; + // size_t i; + // for (i = 0; i < page_count; i++) ((char *) m)[ i * hugepage_size ] = 0; } #define asm(...) __asm__(__VA_ARGS__) -__attribute__((hot, aligned(64))) pu2() { +void __attribute__((hot, aligned(64))) pu2() { vminst *M2 = (vminst *) m; vminst *M = &M2[ m[ 7 ] >> 1 ]; @@ -119,10 +151,18 @@ __attribute__((hot, aligned(64))) pu2() { C_ZERO: goto PU2_END; C_ONE: + #ifndef PU2_NO_ASM asm("mov %1, %0" : "=r"(a) : "r"(inst.v)); + #else + a = inst.v; + #endif goto PU2_START; C_TWO: + #ifndef PU2_NO_ASM asm("mov %1, %0" : "=r"(a) : "r"(m[b])); + #else + a = m[ b ]; + #endif goto PU2_START; C_THREE: if (likely(u)) { @@ -132,7 +172,13 @@ __attribute__((hot, aligned(64))) pu2() { goto PU2_START; C_FOUR: + #ifndef PU2_NO_ASM asm("xchg %0, %1" : "+r"(a), "+r"(b)); + #else + s1 = a; + a = b; + b = s1; + #endif goto PU2_START; C_FIVE: a += b; |
