From 4521fb73efa0b1ad9b65e356c9d55e78bbfad66a Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Tue, 28 Dec 2021 17:32:11 +0100 Subject: [PATCH] size optimized uncompress function in loader --- platform/bin/loader.wasm | Bin 1288 -> 1251 bytes platform/src/loader.cwa | 25 +++++++++---------------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/platform/bin/loader.wasm b/platform/bin/loader.wasm index 5f6f9dadf4eeecadfd8e7f77f2fda5fa25990600..5030f0ffec7aa90ab6abe625af78f4a756d4cb3b 100644 GIT binary patch delta 173 zcmWlRu?oU46h(9M(nc+!P7W@w(LpFqf`cF!r!M|T8VAMB*3D7KX9$8gxcL`;fs3DE zyIc+&&b@TL?W@QAvD-r3fH=I7!Gs^C&|x5l3vE#t-4#h>krJ($ERIb5_+ZFZGOrDT zX(l~5BR7%UTxeGIEWN9h ORi#@tC9CJ0KKKKsKOt)X delta 228 zcmYL@Jqp4=5QX>c?1pIY=LoYZSOhO12u^2XVQ*ob#749>W$c8Uz$1u-otF?#VCf~C zG|Ip*Ki``-?^e}57kFN`OSn7W>j%>MgYi0|IYYzd6Jw^vFa%iuM}mA1bxa}%-irxN z3sRT_d!~N03&c9h22SFIa(aXQdKLJj-q>091kjPq#FS+(puX62g@tO#sqxTCd??sv lBdf-hrd-@X{k@b;^V@6PAPU8q5_v$v`s=j0%5>|}3tvf1C%*sy diff --git a/platform/src/loader.cwa b/platform/src/loader.cwa index 8c4eadc..658d5ac 100644 --- a/platform/src/loader.cwa +++ b/platform/src/loader.cwa @@ -96,7 +96,8 @@ export fn uncompress(src_ptr: i32, dest_ptr: i32) -> i32 { block finished { loop unpack_loop { - if upkr_bit(0) { + let lazy is_match = upkr_bit(0); + if is_match { let inline new_offset = if prev_was_match { 1 } else { upkr_bit(256) }; if new_offset { offset = upkr_length(257) - 1; @@ -108,19 +109,16 @@ export fn uncompress(src_ptr: i32, dest_ptr: i32) -> i32 { dest_ptr = dest_ptr + 1; branch_if (length := length - 1): copy; } - prev_was_match = 1; } else { // literal - i = 0; byte = 1; loop literal { - byte = (byte << 1) | upkr_bit(byte); - branch_if (i := i + 1) < 8: literal; + branch_if (byte := (byte << 1) | upkr_bit(byte)) < 256: literal; } dest_ptr?0 = byte; dest_ptr = dest_ptr + 1; - prev_was_match = 0; } + prev_was_match = is_match; branch unpack_loop; } } @@ -143,7 +141,7 @@ fn upkr_length(context_index: i32) -> i32 { } fn upkr_bit(context_index: i32) -> i32 { - let prob = context_index?0x3c000; + let lazy prob = context_index?0x3c000; loop refill { if upkr_state < 1<<12 { @@ -154,17 +152,12 @@ fn upkr_bit(context_index: i32) -> i32 { } let lazy state_low = upkr_state & 0xff; - let bit = state_low < prob; + let lazy state_hi = upkr_state >> 8; + let lazy bit = state_low < prob; - if bit { - upkr_state = prob * (upkr_state >> 8) + state_low; - prob = prob + ((0x108 - prob) >> 4); - } else { - upkr_state = (0x100 - prob) * (upkr_state >> 8) + state_low - prob; - prob = prob - ((prob + 8) >> 4); - } + upkr_state = state_low + select(bit, prob * state_hi, (0x100 - prob) * state_hi - prob); - context_index?0x3c000 = prob; + context_index?0x3c000 = prob + ((7 + bit * 257 - prob) >> 4); bit }