Skip to content

Commit 5e582b2

Browse files
authored
Merge pull request #192 from nyurik/simple-loop
Remove unused loop
2 parents ee7559e + 461c08c commit 5e582b2

File tree

1 file changed

+106
-130
lines changed
  • src/enc/backward_references

1 file changed

+106
-130
lines changed

src/enc/backward_references/hq.rs

Lines changed: 106 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -671,10 +671,8 @@ fn UpdateNodes<AllocF: Allocator<floatX>>(
671671
let max_distance: usize = min(cur_ix, max_backward_limit);
672672
let max_len: usize = num_bytes.wrapping_sub(pos);
673673
let max_zopfli_len: usize = MaxZopfliLen(params);
674-
let max_iters: usize = MaxZopfliCandidates(params);
675674
let min_len: usize;
676675
let mut result: usize = 0usize;
677-
let mut k: usize;
678676
let gap: usize = 0usize;
679677
EvaluateNode(
680678
block_start,
@@ -692,144 +690,122 @@ fn UpdateNodes<AllocF: Allocator<floatX>>(
692690
posdata.cost + model.get_min_cost_cmd() + model.get_literal_costs(posdata.pos, pos);
693691
min_len = ComputeMinimumCopyLength(min_cost, nodes, num_bytes, pos);
694692
}
695-
k = 0usize;
696-
while k < max_iters && k < queue.size() {
697-
'continue28: loop {
698-
{
699-
let posdata = queue.at(k);
700-
let start: usize = posdata.pos;
701-
let inscode: u16 = GetInsertLengthCode(pos.wrapping_sub(start));
702-
let start_costdiff: floatX = posdata.costdiff;
703-
let base_cost: floatX = start_costdiff
704-
+ GetInsertExtra(inscode) as (floatX)
705-
+ model.get_literal_costs(0, pos);
706-
let mut best_len: usize = min_len.wrapping_sub(1);
707-
for j in 0..16 {
708-
if best_len >= max_len {
709-
break;
710-
}
711693

712-
let idx: usize = kDistanceCacheIndex[j] as usize;
713-
let distance_cache_len_minus_1 = 3;
714-
debug_assert_eq!(distance_cache_len_minus_1 + 1, posdata.distance_cache.len());
715-
let backward: usize =
716-
(posdata.distance_cache[(idx & distance_cache_len_minus_1)]
717-
+ i32::from(kDistanceCacheOffset[j])) as usize;
718-
let mut prev_ix: usize = cur_ix.wrapping_sub(backward);
719-
let len: usize;
720-
let continuation: u8 = ringbuffer[cur_ix_masked.wrapping_add(best_len)];
721-
if cur_ix_masked.wrapping_add(best_len) > ringbuffer_mask {
722-
break;
723-
}
724-
if backward > max_distance.wrapping_add(gap) {
725-
continue;
726-
}
727-
if backward > max_distance {
728-
continue;
729-
}
730-
if prev_ix >= cur_ix {
731-
continue;
732-
}
733-
prev_ix &= ringbuffer_mask;
734-
if prev_ix.wrapping_add(best_len) > ringbuffer_mask
735-
|| continuation != ringbuffer[prev_ix.wrapping_add(best_len)]
736-
{
737-
continue;
738-
}
739-
len = FindMatchLengthWithLimit(
740-
&ringbuffer[prev_ix..],
741-
&ringbuffer[cur_ix_masked..],
742-
max_len,
743-
);
694+
for k in 0..min(MaxZopfliCandidates(params), queue.size()) {
695+
let posdata = queue.at(k);
696+
let start: usize = posdata.pos;
697+
let inscode: u16 = GetInsertLengthCode(pos.wrapping_sub(start));
698+
let start_costdiff: floatX = posdata.costdiff;
699+
let base_cost: floatX =
700+
start_costdiff + GetInsertExtra(inscode) as (floatX) + model.get_literal_costs(0, pos);
701+
let mut best_len: usize = min_len.wrapping_sub(1);
702+
for j in 0..16 {
703+
if best_len >= max_len {
704+
break;
705+
}
744706

745-
let dist_cost = base_cost + model.get_distance_cost(j);
746-
for l in best_len.wrapping_add(1)..=len {
747-
let copycode: u16 = GetCopyLengthCode(l);
748-
let cmdcode: u16 =
749-
CombineLengthCodes(inscode, copycode, (j == 0usize) as i32);
750-
let cost: floatX = (if cmdcode < 128 { base_cost } else { dist_cost })
751-
+ (GetCopyExtra(copycode) as floatX)
752-
+ model.get_command_cost(cmdcode);
753-
if cost
754-
< match nodes[pos.wrapping_add(l)].u {
755-
Union1::cost(cost) => cost,
756-
_ => 0.0,
757-
}
758-
{
759-
UpdateZopfliNode(
760-
nodes,
761-
pos,
762-
start,
763-
l,
764-
l,
765-
backward,
766-
j.wrapping_add(1),
767-
cost,
768-
);
769-
result = max(result, l);
770-
}
771-
best_len = l;
707+
let idx: usize = kDistanceCacheIndex[j] as usize;
708+
let distance_cache_len_minus_1 = 3;
709+
debug_assert_eq!(distance_cache_len_minus_1 + 1, posdata.distance_cache.len());
710+
let backward: usize = (posdata.distance_cache[(idx & distance_cache_len_minus_1)]
711+
+ i32::from(kDistanceCacheOffset[j])) as usize;
712+
let mut prev_ix: usize = cur_ix.wrapping_sub(backward);
713+
let len: usize;
714+
let continuation: u8 = ringbuffer[cur_ix_masked.wrapping_add(best_len)];
715+
if cur_ix_masked.wrapping_add(best_len) > ringbuffer_mask {
716+
break;
717+
}
718+
if backward > max_distance.wrapping_add(gap) {
719+
continue;
720+
}
721+
if backward > max_distance {
722+
continue;
723+
}
724+
if prev_ix >= cur_ix {
725+
continue;
726+
}
727+
prev_ix &= ringbuffer_mask;
728+
if prev_ix.wrapping_add(best_len) > ringbuffer_mask
729+
|| continuation != ringbuffer[prev_ix.wrapping_add(best_len)]
730+
{
731+
continue;
732+
}
733+
len = FindMatchLengthWithLimit(
734+
&ringbuffer[prev_ix..],
735+
&ringbuffer[cur_ix_masked..],
736+
max_len,
737+
);
738+
739+
let dist_cost = base_cost + model.get_distance_cost(j);
740+
for l in best_len.wrapping_add(1)..=len {
741+
let copycode: u16 = GetCopyLengthCode(l);
742+
let cmdcode: u16 = CombineLengthCodes(inscode, copycode, (j == 0usize) as i32);
743+
let cost: floatX = (if cmdcode < 128 { base_cost } else { dist_cost })
744+
+ (GetCopyExtra(copycode) as floatX)
745+
+ model.get_command_cost(cmdcode);
746+
if cost
747+
< match nodes[pos.wrapping_add(l)].u {
748+
Union1::cost(cost) => cost,
749+
_ => 0.0,
772750
}
751+
{
752+
UpdateZopfliNode(nodes, pos, start, l, l, backward, j.wrapping_add(1), cost);
753+
result = max(result, l);
773754
}
774-
if k >= 2usize {
775-
break 'continue28;
776-
}
755+
best_len = l;
756+
}
757+
}
758+
759+
if k >= 2 {
760+
continue;
761+
}
762+
763+
let mut len: usize = min_len;
764+
for j in 0usize..num_matches {
765+
let match_ = BackwardMatch(matches[j]);
766+
let dist: usize = match_.distance() as usize;
767+
let is_dictionary_match = dist > max_distance.wrapping_add(gap);
768+
let dist_code: usize = dist.wrapping_add(16).wrapping_sub(1);
769+
let mut dist_symbol: u16 = 0;
770+
let mut distextra: u32 = 0;
771+
772+
PrefixEncodeCopyDistance(
773+
dist_code,
774+
params.dist.num_direct_distance_codes as usize,
775+
u64::from(params.dist.distance_postfix_bits),
776+
&mut dist_symbol,
777+
&mut distextra,
778+
);
779+
let distnumextra: u32 = u32::from(dist_symbol) >> 10;
780+
let dist_cost = base_cost
781+
+ (distnumextra as floatX)
782+
+ model.get_distance_cost((dist_symbol as i32 & 0x03ff) as usize);
783+
let max_match_len = match_.length();
784+
if len < max_match_len && (is_dictionary_match || max_match_len > max_zopfli_len) {
785+
len = max_match_len;
786+
}
787+
while len <= max_match_len {
777788
{
778-
let mut len: usize = min_len;
779-
for j in 0usize..num_matches {
780-
let match_ = BackwardMatch(matches[j]);
781-
let dist: usize = match_.distance() as usize;
782-
let is_dictionary_match = dist > max_distance.wrapping_add(gap);
783-
let dist_code: usize = dist.wrapping_add(16).wrapping_sub(1);
784-
let mut dist_symbol: u16 = 0;
785-
let mut distextra: u32 = 0;
786-
787-
PrefixEncodeCopyDistance(
788-
dist_code,
789-
params.dist.num_direct_distance_codes as usize,
790-
u64::from(params.dist.distance_postfix_bits),
791-
&mut dist_symbol,
792-
&mut distextra,
793-
);
794-
let distnumextra: u32 = u32::from(dist_symbol) >> 10;
795-
let dist_cost = base_cost
796-
+ (distnumextra as floatX)
797-
+ model.get_distance_cost((dist_symbol as i32 & 0x03ff) as usize);
798-
let max_match_len = match_.length();
799-
if len < max_match_len
800-
&& (is_dictionary_match || max_match_len > max_zopfli_len)
801-
{
802-
len = max_match_len;
803-
}
804-
while len <= max_match_len {
805-
{
806-
let len_code: usize = if is_dictionary_match {
807-
match_.length_code()
808-
} else {
809-
len
810-
};
811-
let copycode: u16 = GetCopyLengthCode(len_code);
812-
let cmdcode: u16 = CombineLengthCodes(inscode, copycode, 0i32);
813-
let cost: floatX = dist_cost
814-
+ GetCopyExtra(copycode) as (floatX)
815-
+ model.get_command_cost(cmdcode);
816-
if let Union1::cost(nodeCost) = (nodes[pos.wrapping_add(len)]).u {
817-
if cost < nodeCost {
818-
UpdateZopfliNode(
819-
nodes, pos, start, len, len_code, dist, 0usize, cost,
820-
);
821-
result = max(result, len);
822-
}
823-
}
824-
}
825-
len = len.wrapping_add(1);
789+
let len_code: usize = if is_dictionary_match {
790+
match_.length_code()
791+
} else {
792+
len
793+
};
794+
let copycode: u16 = GetCopyLengthCode(len_code);
795+
let cmdcode: u16 = CombineLengthCodes(inscode, copycode, 0i32);
796+
let cost: floatX = dist_cost
797+
+ GetCopyExtra(copycode) as (floatX)
798+
+ model.get_command_cost(cmdcode);
799+
if let Union1::cost(nodeCost) = (nodes[pos.wrapping_add(len)]).u {
800+
if cost < nodeCost {
801+
UpdateZopfliNode(nodes, pos, start, len, len_code, dist, 0usize, cost);
802+
result = max(result, len);
826803
}
827804
}
828805
}
806+
len = len.wrapping_add(1);
829807
}
830-
break;
831808
}
832-
k = k.wrapping_add(1);
833809
}
834810
result
835811
}

0 commit comments

Comments
 (0)