aboutsummaryrefslogtreecommitdiff
path: root/pu2
diff options
context:
space:
mode:
authorGravatar Moon Flower <moon@coffin.ir> 2025-08-20 14:15:05 +0330
committerGravatar Moon Flower <moon@coffin.ir> 2025-08-20 14:15:05 +0330
commita6d16990fd6109f569324bb1422bfb603f6d031b (patch)
treedfe95ec2a8740dc8dfd29e4199af56bcd5938015 /pu2
parentthe speedster (diff)
added compat flags for easier cross-compilation
Diffstat (limited to 'pu2')
-rw-r--r--pu2/pu2.c6
-rw-r--r--pu2/pu2.out.c72
2 files changed, 64 insertions, 14 deletions
diff --git a/pu2/pu2.c b/pu2/pu2.c
index 1e3bdf1..076261c 100644
--- a/pu2/pu2.c
+++ b/pu2/pu2.c
@@ -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;