update upkr (new tweaked compressed format)

This commit is contained in:
2021-12-27 17:31:08 +01:00
parent 0f795ae061
commit 462dc3a1c6
7 changed files with 20 additions and 15 deletions

2
Cargo.lock generated
View File

@@ -1524,7 +1524,7 @@ dependencies = [
[[package]] [[package]]
name = "upkr" name = "upkr"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/exoticorn/upkr.git?rev=7d280bd#7d280bd533b037d579b6cdf12fb69046eb5c2c91" source = "git+https://github.com/exoticorn/upkr.git?rev=08c86af0#08c86af06f106631ce0401c881bd66fb2c0271e6"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cdivsufsort", "cdivsufsort",

2
platform/Cargo.lock generated
View File

@@ -326,7 +326,7 @@ dependencies = [
[[package]] [[package]]
name = "upkr" name = "upkr"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/exoticorn/upkr.git?rev=7d280bd#7d280bd533b037d579b6cdf12fb69046eb5c2c91" source = "git+https://github.com/exoticorn/upkr.git?rev=08c86af0#08c86af06f106631ce0401c881bd66fb2c0271e6"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cdivsufsort", "cdivsufsort",

Binary file not shown.

Binary file not shown.

View File

@@ -88,14 +88,17 @@ export fn uncompress(src_ptr: i32, dest_ptr: i32) -> i32 {
let i: i32; let i: i32;
loop init_contexts { loop init_contexts {
i!0x3c000 = 0x800; i?0x3c000 = 0x80;
branch_if (i := i + 4) < (256 + 1 + 128) * 4: init_contexts branch_if (i := i + 1) < 256 + 1 + 128: init_contexts
} }
let prev_was_match: i32;
block finished { block finished {
loop unpack_loop { loop unpack_loop {
if upkr_bit(0) { if upkr_bit(0) {
if upkr_bit(256) { let inline new_offset = if prev_was_match { 1 } else { upkr_bit(256) };
if new_offset {
offset = upkr_length(257) - 1; offset = upkr_length(257) - 1;
branch_if !offset: finished branch_if !offset: finished
} }
@@ -105,6 +108,7 @@ export fn uncompress(src_ptr: i32, dest_ptr: i32) -> i32 {
dest_ptr = dest_ptr + 1; dest_ptr = dest_ptr + 1;
branch_if (length := length - 1): copy; branch_if (length := length - 1): copy;
} }
prev_was_match = 1;
} else { } else {
// literal // literal
i = 0; i = 0;
@@ -115,6 +119,7 @@ export fn uncompress(src_ptr: i32, dest_ptr: i32) -> i32 {
} }
dest_ptr?0 = byte; dest_ptr?0 = byte;
dest_ptr = dest_ptr + 1; dest_ptr = dest_ptr + 1;
prev_was_match = 0;
} }
branch unpack_loop; branch unpack_loop;
} }
@@ -138,28 +143,28 @@ fn upkr_length(context_index: i32) -> i32 {
} }
fn upkr_bit(context_index: i32) -> i32 { fn upkr_bit(context_index: i32) -> i32 {
let prob = (context_index * 4)!0x3c000; let prob = context_index?0x3c000;
loop refill { loop refill {
if upkr_state < 1<<16 { if upkr_state < 1<<12 {
upkr_state = (upkr_state << 8) | upkr_src_ptr?0; upkr_state = (upkr_state << 8) | upkr_src_ptr?0;
upkr_src_ptr = upkr_src_ptr + 1; upkr_src_ptr = upkr_src_ptr + 1;
branch refill; branch refill;
} }
} }
let lazy state_low = upkr_state & 0xfff; let lazy state_low = upkr_state & 0xff;
let bit = state_low < prob; let bit = state_low < prob;
if bit { if bit {
upkr_state = prob * (upkr_state >> 12) + state_low; upkr_state = prob * (upkr_state >> 8) + state_low;
prob = prob + ((0x1000 - prob) >> 4); prob = prob + ((0x108 - prob) >> 4);
} else { } else {
upkr_state = (0x1000 - prob) * (upkr_state >> 12) + state_low - prob; upkr_state = (0x100 - prob) * (upkr_state >> 8) + state_low - prob;
prob = prob - (prob >> 4); prob = prob - ((prob + 8) >> 4);
} }
(context_index * 4)!0x3c000 = prob; context_index?0x3c000 = prob;
bit bit
} }

2
uw8-tool/Cargo.lock generated
View File

@@ -124,7 +124,7 @@ dependencies = [
[[package]] [[package]]
name = "upkr" name = "upkr"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/exoticorn/upkr.git?rev=7d280bd#7d280bd533b037d579b6cdf12fb69046eb5c2c91" source = "git+https://github.com/exoticorn/upkr.git?rev=08c86af0#08c86af06f106631ce0401c881bd66fb2c0271e6"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cdivsufsort", "cdivsufsort",

View File

@@ -10,5 +10,5 @@ wasmparser = "0.81"
wasm-encoder = "0.8" wasm-encoder = "0.8"
anyhow = "1" anyhow = "1"
pico-args = "0.4" pico-args = "0.4"
upkr = { git = "https://github.com/exoticorn/upkr.git", rev = "7d280bd" } upkr = { git = "https://github.com/exoticorn/upkr.git", rev = "08c86af0" }
pbr = "1" pbr = "1"