mirror of
https://github.com/intel/isa-l.git
synced 2025-10-30 21:50:45 +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:
@@ -34,8 +34,8 @@ lsrc += igzip/igzip.c \
|
|||||||
igzip/flatten_ll.c \
|
igzip/flatten_ll.c \
|
||||||
igzip/encode_df.c
|
igzip/encode_df.c
|
||||||
|
|
||||||
lsrc_base_aliases += 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
|
lsrc_x86_32 += igzip/igzip_base_aliases.c igzip/proc_heap_base.c
|
||||||
|
|
||||||
lsrc_x86_64 += \
|
lsrc_x86_64 += \
|
||||||
igzip/igzip_body_01.asm \
|
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_00010087;
|
||||||
struct slver isal_create_hufftables_subset_slver = { 0x0087, 0x01, 0x00 };
|
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,
|
extern uint32_t build_huff_tree(struct heap_tree *heap, uint64_t heap_size, uint64_t node_ptr);
|
||||||
uint64_t node_ptr);
|
extern void build_heap(uint64_t * heap, uint64_t heap_size);
|
||||||
extern void build_heap_asm(uint64_t * heap, uint64_t heap_size);
|
|
||||||
|
|
||||||
static const uint8_t bitrev8[0x100] = {
|
static const uint8_t bitrev8[0x100] = {
|
||||||
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
|
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
|
||||||
@@ -800,62 +799,6 @@ uint32_t convert_length_to_len_sym(uint32_t length)
|
|||||||
return 285;
|
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,
|
// Upon return, codes[] contains the code lengths,
|
||||||
// and bl_count is the count of the lengths
|
// and bl_count is the count of the lengths
|
||||||
|
|
||||||
|
|||||||
@@ -25,8 +25,8 @@
|
|||||||
%define i r11
|
%define i r11
|
||||||
%define tmp2 r12
|
%define tmp2 r12
|
||||||
|
|
||||||
global build_huff_tree_asm
|
global build_huff_tree
|
||||||
build_huff_tree_asm:
|
build_huff_tree:
|
||||||
%ifidn __OUTPUT_FORMAT__, win64
|
%ifidn __OUTPUT_FORMAT__, win64
|
||||||
push rsi
|
push rsi
|
||||||
push rdi
|
push rdi
|
||||||
@@ -73,8 +73,8 @@ build_huff_tree_asm:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
align 32
|
align 32
|
||||||
global build_heap_asm
|
global build_heap
|
||||||
build_heap_asm:
|
build_heap:
|
||||||
%ifidn __OUTPUT_FORMAT__, win64
|
%ifidn __OUTPUT_FORMAT__, win64
|
||||||
push rsi
|
push rsi
|
||||||
push rdi
|
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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user