From f917ba38ff62a318712085d214efff429ddb1f34 Mon Sep 17 00:00:00 2001 From: Toby Jaffey Date: Sun, 14 Dec 2025 19:51:36 +0000 Subject: [PATCH] Tighten up internal vs external functions, which lets optimiser do a better job, self.bin about 10% smaller. --- precompiled/self.bin | Bin 3728 -> 3392 bytes uvm32/uvm32.c | 22 +++++++++++----------- uvm32/uvm32.h | 21 +++++++++++---------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/precompiled/self.bin b/precompiled/self.bin index 6e34c59c1bdb84f9054a32de03c24e2dd7b9a9f8..22cc81880b336f1e015e932cbdd196c16b556f55 100755 GIT binary patch delta 2169 zcmY*aZ)_Ar6n}fWJ99l+C`@e=L^xTzLqbT+2G01YM5KNY#F)SrO)+CAK@%{+78Bwf zUfU~w1&4n@plF09Mor9WS3sc%?F9n{(R7snhh4cNM&M##mxAs2X0M2Rc$s-SZ{Gag z@BP`WkM&O6`t0nV?MEOb+VyXlzD~IbsYmTPNU`;qqrs{vRbqYPQAQew(C0$g2AnYWkIaf7iyrde_UsH|PTPmKZc%~Y&zEq4(8cD}>U{xsVb>Lg5CiH5! zS!}wTjxRvJ6~M-z|EXdjc{v#!20^_Nn^OyncqMbS2lhvBW3*5#oF43i}DPZ-1@=<5evEJB+siUz_sF%3{;)^t8=kTZfd@ z{uS`z4l4ZFfOj-ewLscK(rT9%PRI*CrQ;_M#41$`v;y;eD(-p;*RnNyc|Ib@Duq`% zHGD815~K)Rb7F$jD?H?&UJo3c=|W!$E1~xl)I)r%^E9riTkDL7fkwsj=c6wQ3BOdb z@_As61FSWhq--DyCcO@nF#gTI-RMdYnTcOosO<5d;HPk`Gd z_h&WHHV=$x`@#td3g2Hqp!JyWVPplWW#pz`0NxpyAok1vEApyhBtQ969!|J_XwqFl zO)|#@n^c3@ir|nw1d=qH9k9J|V0rk>*#%O!{6@uU_JQrPfiFgS>6MaIClYwHHQ04K1c)K-ls9zh>TnhBU2#e)Bw|Nl~~3vu|%B= zE(vZWJumb{ScFwrgk9bDd&HPJgiLgucDMHZ!!nxO-*bQHyNgv_atGv^8*v8%eZ(E< zyMy}hXi-sFPihS7$U$~m8WrA#0eR(sOqvDR5q1o~(vvo#?l19TPuM0D3$Gs z_CsY5_ggo&L#>m}a~I@;Wt-fc^4jG;Y&%7$OQh|TUnN^f?7@I89H=-%^pW%^ZLGyt z%vKwM)@oj&$oyJwH!3o}*qUJ9mUP-dt`nnlnmX2rWb@XchuC!2ILB0E(;cf125hc% z0ya(kYO+izPCLET#itFqYvc&O;V33Id764tY(~SfD?;A10y74`B~sQ<>Yi4 z5YSOsxOo340>riJ2m+M)5dQmFv^3q1)fLjV8( literal 3728 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 == NULL) { return false; @@ -408,7 +408,7 @@ uvm32_slice_t uvm32_arg_getslice_fixed(uvm32_state_t *vmst, uvm32_evt_t *evt, uv return scb; } -uint32_t _uvm32_extramLoad(void *userdata, uint32_t addr, uint32_t accessTyp) { +static uint32_t _uvm32_extramLoad(void *userdata, uint32_t addr, uint32_t accessTyp) { uvm32_state_t *vmst = (uvm32_state_t *)userdata; addr -= UVM32_EXTRAM_BASE; @@ -445,7 +445,7 @@ uint32_t _uvm32_extramLoad(void *userdata, uint32_t addr, uint32_t accessTyp) { return 0; } -uint32_t _uvm32_extramStore(void *userdata, uint32_t addr, uint32_t val, uint32_t accessTyp) { +static uint32_t _uvm32_extramStore(void *userdata, uint32_t addr, uint32_t val, uint32_t accessTyp) { uvm32_state_t *vmst = (uvm32_state_t *)userdata; addr -= UVM32_EXTRAM_BASE; if (vmst->_extram != NULL) { @@ -489,34 +489,34 @@ uint32_t uvm32_getProgramCounter(const uvm32_state_t *vmst) { } // Access of memory bus in alignment safe way -void _uvm32_store4(void *p, uint32_t off, uint32_t val) { +static void _uvm32_store4(void *p, uint32_t off, uint32_t val) { UVM32_MEMCPY((uint8_t *)p + off, &val, 4); } -void _uvm32_store2(void *p, uint32_t off, uint16_t val) { +static void _uvm32_store2(void *p, uint32_t off, uint16_t val) { UVM32_MEMCPY((uint8_t *)p + off, &val, 2); } -void _uvm32_store1(void *p, uint32_t off, uint8_t val) { +static void _uvm32_store1(void *p, uint32_t off, uint8_t val) { ((uint8_t *)p)[off] = val; } -uint32_t _uvm32_load4(void *p, uint32_t off) { +static uint32_t _uvm32_load4(void *p, uint32_t off) { uint32_t v; UVM32_MEMCPY(&v, (uint8_t *)p + off, 4); return v; } -uint16_t _uvm32_load2(void *p, uint32_t off) { +static uint16_t _uvm32_load2(void *p, uint32_t off) { uint16_t v; UVM32_MEMCPY(&v, (uint8_t *)p + off, 2); return v; } -uint8_t _uvm32_load1(void *p, uint32_t off) { +static uint8_t _uvm32_load1(void *p, uint32_t off) { return ((uint8_t *)p)[off]; } -int16_t _uvm32_load2s(void *p, uint32_t off) { +static int16_t _uvm32_load2s(void *p, uint32_t off) { int16_t v; UVM32_MEMCPY(&v, (uint8_t *)p + off, 2); return v; } -int8_t _uvm32_load1s(void *p, uint32_t off) { +static int8_t _uvm32_load1s(void *p, uint32_t off) { return ((int8_t *)p)[off]; } diff --git a/uvm32/uvm32.h b/uvm32/uvm32.h index a0efed2..ee9a49a 100644 --- a/uvm32/uvm32.h +++ b/uvm32/uvm32.h @@ -47,18 +47,8 @@ SOFTWARE. #define MINIRV32_NO_BREAKPOINT_NO_INTERRUPTS #define MINI_RV32_RAM_SIZE UVM32_MEMORY_SIZE #define MINIRV32_POSTEXEC(pc, ir, retval) {if (retval > 0) return retval;} -uint32_t _uvm32_extramLoad(void *userdata, uint32_t addr, uint32_t accessTyp); -uint32_t _uvm32_extramStore(void *userdata, uint32_t addr, uint32_t val, uint32_t accessTyp); #define MINIRV32_HANDLE_MEM_LOAD_CONTROL( addy, rval ) rval = _uvm32_extramLoad(userdata, addy, ( ir >> 12 ) & 0x7); #define MINIRV32_HANDLE_MEM_STORE_CONTROL( addy, val ) if( _uvm32_extramStore(userdata, addy, val, ( ir >> 12 ) & 0x7) ) return val; -void _uvm32_store4(void *p, uint32_t off, uint32_t val); -void _uvm32_store2(void *p, uint32_t off, uint16_t val); -void _uvm32_store1(void *p, uint32_t off, uint8_t val); -uint32_t _uvm32_load4(void *p, uint32_t off); -uint16_t _uvm32_load2(void *p, uint32_t off); -uint8_t _uvm32_load1(void *p, uint32_t off); -int16_t _uvm32_load2s(void *p, uint32_t off); -int8_t _uvm32_load1s(void *p, uint32_t off); #define MINIRV32_CUSTOM_MEMORY_BUS #define MINIRV32_STORE4( ofs, val ) _uvm32_store4(image, ofs, val) #define MINIRV32_STORE2( ofs, val ) _uvm32_store2(image, ofs, val) @@ -70,6 +60,17 @@ int8_t _uvm32_load1s(void *p, uint32_t off); #define MINIRV32_LOAD1_SIGNED( ofs ) _uvm32_load1s(image, ofs) #ifndef MINIRV32_IMPLEMENTATION #define MINIRV32_STEPPROTO +#else +static uint32_t _uvm32_extramLoad(void *userdata, uint32_t addr, uint32_t accessTyp); +static uint32_t _uvm32_extramStore(void *userdata, uint32_t addr, uint32_t val, uint32_t accessTyp); +static void _uvm32_store4(void *p, uint32_t off, uint32_t val); +static void _uvm32_store2(void *p, uint32_t off, uint16_t val); +static void _uvm32_store1(void *p, uint32_t off, uint8_t val); +static uint32_t _uvm32_load4(void *p, uint32_t off); +static uint16_t _uvm32_load2(void *p, uint32_t off); +static uint8_t _uvm32_load1(void *p, uint32_t off); +static int16_t _uvm32_load2s(void *p, uint32_t off); +static int8_t _uvm32_load1s(void *p, uint32_t off); #endif #include "mini-rv32ima.h"