summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRobert Norton2019-07-02 16:34:11 +0100
committerRobert Norton2019-07-15 14:51:21 +0100
commit0a8981186d4da342ef36179cf093e64674573c63 (patch)
tree549858818706d78f4fdae88d51bbee556f1a9654 /lib
parent170543faa031d90186e6b45612ed8374f1c25f7b (diff)
Add a fast path to speed up platform_read_ram: use fast_read_ram if read is 8 bytes or less to avoid cost of using GMP integers (including free/malloc).
Diffstat (limited to 'lib')
-rw-r--r--lib/rts.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/rts.c b/lib/rts.c
index dfb2ba5a..57abbc3c 100644
--- a/lib/rts.c
+++ b/lib/rts.c
@@ -283,6 +283,13 @@ void platform_read_mem(lbits *data,
const sbits addr,
const mpz_t n)
{
+ sbits sdata;
+ uint64_t len = mpz_get_ui(n); /* Sail type says always >0 */
+ if (len <= 8) {
+ /* fast path for small reads */
+ sdata = fast_read_ram(len, addr.bits);
+ RECREATE_OF(lbits, sbits)(data, sdata, true);
+ } else {
mpz_t mpz_addr_size;
mpz_init(mpz_addr_size);
mpz_set_ui(mpz_addr_size, addr_size);
@@ -292,6 +299,7 @@ void platform_read_mem(lbits *data,
read_ram(data, mpz_addr_size, n, (lbits){.len=0, .bits=NULL}, (lbits){.len=addr.len, .bits=&addr_bv});
mpz_clear(mpz_addr_size);
mpz_clear(addr_bv);
+ }
}
unit platform_write_mem_ea(const int write_kind,