mirror of
https://github.com/intel/isa-l.git
synced 2025-02-25 07:41:06 +01:00
igzip: Move build_heap base functions to own file
Change-Id: I0161cd65c71df00fadad9dd69e207e9fb29a54ef Signed-off-by: Greg Tucker <greg.b.tucker@intel.com>
This commit is contained in:
parent
f80a1ed62b
commit
ec6e5de665
@ -34,8 +34,8 @@ lsrc += igzip/igzip.c \
|
||||
igzip/flatten_ll.c \
|
||||
igzip/encode_df.c
|
||||
|
||||
lsrc_base_aliases += igzip/igzip_base_aliases.c
|
||||
lsrc_x86_32 += igzip/igzip_base_aliases.c
|
||||
lsrc_base_aliases += igzip/igzip_base_aliases.c igzip/proc_heap_base.c
|
||||
lsrc_x86_32 += igzip/igzip_base_aliases.c igzip/proc_heap_base.c
|
||||
|
||||
lsrc_x86_64 += \
|
||||
igzip/igzip_body_01.asm \
|
||||
|
@ -621,9 +621,8 @@ struct slver isal_create_hufftables_slver = { 0x0086, 0x01, 0x00 };
|
||||
struct slver isal_create_hufftables_subset_slver_00010087;
|
||||
struct slver isal_create_hufftables_subset_slver = { 0x0087, 0x01, 0x00 };
|
||||
|
||||
extern uint32_t build_huff_tree_asm(struct heap_tree *heap, uint64_t heap_size,
|
||||
uint64_t node_ptr);
|
||||
extern void build_heap_asm(uint64_t * heap, uint64_t heap_size);
|
||||
extern uint32_t build_huff_tree(struct heap_tree *heap, uint64_t heap_size, uint64_t node_ptr);
|
||||
extern void build_heap(uint64_t * heap, uint64_t heap_size);
|
||||
|
||||
static const uint8_t bitrev8[0x100] = {
|
||||
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
|
||||
@ -800,62 +799,6 @@ uint32_t convert_length_to_len_sym(uint32_t length)
|
||||
return 285;
|
||||
}
|
||||
|
||||
void inline heapify(uint64_t * heap, uint64_t heap_size, uint64_t index)
|
||||
{
|
||||
uint64_t child = 2 * index, tmp;
|
||||
while (child <= heap_size) {
|
||||
child = (heap[child] <= heap[child + 1]) ? child : child + 1;
|
||||
|
||||
if (heap[index] > heap[child]) {
|
||||
tmp = heap[index];
|
||||
heap[index] = heap[child];
|
||||
heap[child] = tmp;
|
||||
index = child;
|
||||
child = 2 * index;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void build_heap_base(uint64_t * heap, uint64_t heap_size)
|
||||
{
|
||||
uint64_t i;
|
||||
heap[heap_size + 1] = -1;
|
||||
for (i = heap_size / 2; i > 0; i--)
|
||||
heapify(heap, heap_size, i);
|
||||
|
||||
}
|
||||
|
||||
uint32_t build_huff_tree_base(struct heap_tree *heap_space, uint64_t heap_size,
|
||||
uint64_t node_ptr)
|
||||
{
|
||||
uint64_t *heap = (uint64_t *) heap_space;
|
||||
uint64_t h1, h2;
|
||||
|
||||
while (heap_size > 1) {
|
||||
h1 = heap[1];
|
||||
heap[1] = heap[heap_size];
|
||||
heap[heap_size--] = -1;
|
||||
|
||||
heapify(heap, heap_size, 1);
|
||||
|
||||
h2 = heap[1];
|
||||
heap[1] = ((h1 + h2) & ~0xFFFFull) | node_ptr;
|
||||
|
||||
heapify(heap, heap_size, 1);
|
||||
|
||||
*(uint16_t *) (&heap[node_ptr]) = h1;
|
||||
*(uint16_t *) (&heap[node_ptr - 1]) = h2;
|
||||
node_ptr -= 2;
|
||||
|
||||
}
|
||||
h1 = heap[1];
|
||||
*(uint16_t *) (&heap[node_ptr]) = h1;
|
||||
return node_ptr;
|
||||
}
|
||||
|
||||
#define build_heap build_heap_base
|
||||
#define build_huff_tree build_huff_tree_base
|
||||
// Upon return, codes[] contains the code lengths,
|
||||
// and bl_count is the count of the lengths
|
||||
|
||||
|
@ -25,8 +25,8 @@
|
||||
%define i r11
|
||||
%define tmp2 r12
|
||||
|
||||
global build_huff_tree_asm
|
||||
build_huff_tree_asm:
|
||||
global build_huff_tree
|
||||
build_huff_tree:
|
||||
%ifidn __OUTPUT_FORMAT__, win64
|
||||
push rsi
|
||||
push rdi
|
||||
@ -73,8 +73,8 @@ build_huff_tree_asm:
|
||||
ret
|
||||
|
||||
align 32
|
||||
global build_heap_asm
|
||||
build_heap_asm:
|
||||
global build_heap
|
||||
build_heap:
|
||||
%ifidn __OUTPUT_FORMAT__, win64
|
||||
push rsi
|
||||
push rdi
|
||||
|
84
igzip/proc_heap_base.c
Normal file
84
igzip/proc_heap_base.c
Normal file
@ -0,0 +1,84 @@
|
||||
/**********************************************************************
|
||||
Copyright(c) 2011-2017 Intel Corporation All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
**********************************************************************/
|
||||
|
||||
#include "igzip_lib.h"
|
||||
#include "huff_codes.h"
|
||||
|
||||
void inline heapify(uint64_t * heap, uint64_t heap_size, uint64_t index)
|
||||
{
|
||||
uint64_t child = 2 * index, tmp;
|
||||
while (child <= heap_size) {
|
||||
child = (heap[child] <= heap[child + 1]) ? child : child + 1;
|
||||
|
||||
if (heap[index] > heap[child]) {
|
||||
tmp = heap[index];
|
||||
heap[index] = heap[child];
|
||||
heap[child] = tmp;
|
||||
index = child;
|
||||
child = 2 * index;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void build_heap(uint64_t * heap, uint64_t heap_size)
|
||||
{
|
||||
uint64_t i;
|
||||
heap[heap_size + 1] = -1;
|
||||
for (i = heap_size / 2; i > 0; i--)
|
||||
heapify(heap, heap_size, i);
|
||||
|
||||
}
|
||||
|
||||
uint32_t build_huff_tree(struct heap_tree *heap_space, uint64_t heap_size, uint64_t node_ptr)
|
||||
{
|
||||
uint64_t *heap = (uint64_t *) heap_space;
|
||||
uint64_t h1, h2;
|
||||
|
||||
while (heap_size > 1) {
|
||||
h1 = heap[1];
|
||||
heap[1] = heap[heap_size];
|
||||
heap[heap_size--] = -1;
|
||||
|
||||
heapify(heap, heap_size, 1);
|
||||
|
||||
h2 = heap[1];
|
||||
heap[1] = ((h1 + h2) & ~0xFFFFull) | node_ptr;
|
||||
|
||||
heapify(heap, heap_size, 1);
|
||||
|
||||
*(uint16_t *) (&heap[node_ptr]) = h1;
|
||||
*(uint16_t *) (&heap[node_ptr - 1]) = h2;
|
||||
node_ptr -= 2;
|
||||
|
||||
}
|
||||
h1 = heap[1];
|
||||
*(uint16_t *) (&heap[node_ptr]) = h1;
|
||||
return node_ptr;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user