From 385a621b9487456c3167f204b02cb0ea0752191d Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Mon, 31 Aug 2020 11:25:19 -0400 Subject: - Optimized the memory read/write functions a bit more. - Added a memcopy() function, for later on. --- sux.h | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'sux.h') diff --git a/sux.h b/sux.h index f3eb222..5abb29c 100644 --- a/sux.h +++ b/sux.h @@ -49,6 +49,13 @@ extern int get_key(WINDOW *scr); extern void io(uint64_t address, uint8_t rw); extern void init_scr(); + +static inline void *memcopy(void *dst, void *src, size_t n) { + uint8_t *d = dst, *s = src; + for (; n; *d++ = *s++, n--); + return dst; +} + static inline uint64_t read_value(struct sux *cpu, uint64_t reg, uint64_t address, uint8_t size, uint8_t inc_clk, uint8_t check_io) { #if (IO || debug) && !branch #if keypoll @@ -61,18 +68,34 @@ static inline uint64_t read_value(struct sux *cpu, uint64_t reg, uint64_t addres pthread_mutex_unlock(&mutex); #endif #endif - size = (size > 7) ? 7 : size; - uint64_t mask = (-(uint64_t)1 >> ((7 - size) * 8)); #if getclk cpu->clk += inc_clk; #endif - return (reg & ~mask) | (*(uint64_t *)(addr+address) & mask); + size = (size > 7) ? 7 : size; + #if 1 + if (size < 7) { + uint64_t mask = (-(uint64_t)1 >> ((7 - size) * 8)); + return (reg & ~mask) | (*(uint64_t *)(addr+address) & mask); + } else { + return *(uint64_t *)(addr+address); + } + #else + return *(uint64_t *)memcopy(®, addr+address, size+1); + #endif } static inline void write_value(struct sux *cpu, uint64_t value, uint64_t address, uint8_t size, uint8_t inc_clk, uint8_t check_io) { size = (size > 7) ? 7 : size; - uint64_t mask = (-(uint64_t)1 >> ((7 - size) * 8)); - *(uint64_t *)(addr+address) = (*(uint64_t *)(addr+address) & ~mask) | (value & mask); + #if 1 + if (size < 7) { + uint64_t mask = (-(uint64_t)1 >> ((7 - size) * 8)); + *(uint64_t *)(addr+address) = (*(uint64_t *)(addr+address) & ~mask) | (value & mask); + } else { + *(uint64_t *)(addr+address) = value; + } + #else + memcopy(addr+address, &value, size+1); + #endif #if (IO || debug) && !branch #if keypoll pthread_mutex_lock(&mutex); -- cgit v1.2.3-13-gbd6f