mirror of
https://github.com/intel/isa-l.git
synced 2024-12-12 09:23:50 +01:00
igzip: implement encode_deflate_icf with assembly
Change-Id: I90b12da2d2a96bfdb47d29ab329648247a756585 Signed-off-by: Zhiyuan Zhu <zhiyuan.zhu@arm.com>
This commit is contained in:
parent
5eeb33f69c
commit
683364c47b
@ -48,6 +48,7 @@ lsrc_aarch64 += igzip/aarch64/igzip_inflate_multibinary_arm64.S \
|
||||
igzip/aarch64/isal_deflate_icf_body_hash_hist.S \
|
||||
igzip/aarch64/isal_deflate_icf_finish_hash_hist.S \
|
||||
igzip/aarch64/igzip_set_long_icf_fg.S \
|
||||
igzip/aarch64/encode_df.S \
|
||||
igzip/aarch64/isal_update_histogram.S \
|
||||
igzip/aarch64/igzip_deflate_hash_aarch64.S \
|
||||
igzip/proc_heap_base.c
|
||||
|
159
igzip/aarch64/encode_df.S
Normal file
159
igzip/aarch64/encode_df.S
Normal file
@ -0,0 +1,159 @@
|
||||
/**********************************************************************
|
||||
Copyright(c) 2019 Arm 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 Arm 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.
|
||||
**********************************************************************/
|
||||
|
||||
.arch armv8-a+crc
|
||||
.text
|
||||
.align 2
|
||||
#include "lz0a_const_aarch64.h"
|
||||
#include "data_struct_aarch64.h"
|
||||
#include "huffman_aarch64.h"
|
||||
#include "bitbuf2_aarch64.h"
|
||||
#include "stdmac_aarch64.h"
|
||||
|
||||
/*
|
||||
declare Macros
|
||||
*/
|
||||
|
||||
.macro declare_generic_reg name:req,reg:req,default:req
|
||||
\name .req \default\reg
|
||||
w_\name .req w\reg
|
||||
x_\name .req x\reg
|
||||
.endm
|
||||
|
||||
.global encode_deflate_icf_aarch64
|
||||
.type encode_deflate_icf_aarch64, %function
|
||||
|
||||
/*
|
||||
struct deflate_icf *encode_deflate_icf_base(struct deflate_icf *next_in,
|
||||
struct deflate_icf *end_in, struct BitBuf2 *bb,
|
||||
struct hufftables_icf *hufftables)
|
||||
|
||||
*/
|
||||
|
||||
// parameters
|
||||
declare_generic_reg next_in, 0,x
|
||||
declare_generic_reg end_in, 1,x
|
||||
declare_generic_reg bb, 2,x
|
||||
declare_generic_reg hufftables, 3,x
|
||||
|
||||
// local variable
|
||||
declare_generic_reg bb_out_end, 4,x
|
||||
declare_generic_reg bb_bit_count, 5,w
|
||||
declare_generic_reg dist_extra, 6,x
|
||||
declare_generic_reg dist_lit_table, 7,x
|
||||
declare_generic_reg code_and_extra, 8,x
|
||||
declare_generic_reg bb_out_buf, 9,x
|
||||
declare_generic_reg bb_bits, 10,x
|
||||
declare_generic_reg d_length, 11,x
|
||||
declare_generic_reg l_length, 12,x
|
||||
declare_generic_reg d_extra_bit_count, 13,x
|
||||
|
||||
declare_generic_reg code_sum, 4,x
|
||||
declare_generic_reg count_sum, 7,x
|
||||
|
||||
declare_generic_reg tmp0, 14,x
|
||||
declare_generic_reg tmp1, 15,x
|
||||
|
||||
// bit buffer offset
|
||||
.equ offset_m_bits, 0
|
||||
.equ offset_m_bit_count, 8
|
||||
.equ offset_m_out_buf, 16
|
||||
.equ offset_m_out_end, 24
|
||||
|
||||
encode_deflate_icf_aarch64:
|
||||
cmp next_in, end_in
|
||||
bcs .done
|
||||
|
||||
ldp bb_out_buf, bb_out_end, [bb, offset_m_out_buf]
|
||||
cmp bb_out_end, bb_out_buf
|
||||
bcc .done
|
||||
|
||||
ldr bb_bit_count, [bb, offset_m_bit_count]
|
||||
ldr bb_bits, [bb, offset_m_bits]
|
||||
b .loop_start
|
||||
|
||||
.align 3
|
||||
.loop:
|
||||
ldr bb_out_end, [bb, offset_m_out_end]
|
||||
cmp bb_out_end, bb_out_buf
|
||||
bcc .done
|
||||
|
||||
.loop_start:
|
||||
ldrh w_code_and_extra, [next_in]
|
||||
add next_in, next_in, 4
|
||||
ldr w_dist_lit_table, [next_in, -4]
|
||||
and code_and_extra, code_and_extra, 1023
|
||||
|
||||
ldrh w_dist_extra, [next_in, -2]
|
||||
add code_and_extra, code_and_extra, 31
|
||||
ubfx x_dist_lit_table, x_dist_lit_table, 10, 9
|
||||
add x_tmp0, hufftables, code_and_extra, lsl 2
|
||||
ubfx x_dist_extra, x_dist_extra, 3, 13
|
||||
lsl x_dist_lit_table, x_dist_lit_table, 2
|
||||
|
||||
ldr w_code_and_extra, [hufftables, code_and_extra, lsl 2]
|
||||
add x_d_extra_bit_count, hufftables, x_dist_lit_table
|
||||
ldrb w_l_length, [x_tmp0, 3]
|
||||
and code_and_extra, code_and_extra, 0xffffff
|
||||
ldrh w_code_sum, [hufftables, x_dist_lit_table]
|
||||
ldrb w_d_length, [x_d_extra_bit_count, 3]
|
||||
add w_l_length, w_l_length, bb_bit_count
|
||||
ldrb w_d_extra_bit_count, [x_d_extra_bit_count, 2]
|
||||
|
||||
lsl x_tmp0, code_and_extra, x_bb_bit_count
|
||||
add bb_bit_count, w_d_length, w_l_length
|
||||
lsl x_code_sum, x_code_sum, x_l_length
|
||||
orr x_code_sum, x_code_sum, x_tmp0
|
||||
add w_count_sum, w_d_extra_bit_count, bb_bit_count
|
||||
lsl x_bb_bit_count, x_dist_extra, x_bb_bit_count
|
||||
|
||||
orr x_bb_bit_count, x_bb_bit_count, bb_bits
|
||||
orr x_tmp0, x_code_sum, x_bb_bit_count // me->m_bits => x_tmp0
|
||||
str x_tmp0, [bb, offset_m_bits] // me->m_bits => x_tmp0
|
||||
str w_count_sum, [bb, offset_m_bit_count]
|
||||
|
||||
str x_tmp0, [bb_out_buf] // me->m_bits => x_tmp0
|
||||
ldr bb_bit_count, [bb, offset_m_bit_count]
|
||||
ldr bb_bits, [bb, offset_m_bits]
|
||||
and w_tmp0, bb_bit_count, -8 // bits => w_tmp0
|
||||
ldr bb_out_buf, [bb, offset_m_out_buf]
|
||||
lsr w_tmp1, bb_bit_count, 3 // bits/8 => w_tmp1
|
||||
lsr bb_bits, bb_bits, x_tmp0 // bits => x_tmp0
|
||||
sub bb_bit_count, bb_bit_count, w_tmp0 // bits => w_tmp0
|
||||
add bb_out_buf, bb_out_buf, x_tmp1 // bits/8 => x_tmp1
|
||||
str bb_bits, [bb,offset_m_bits]
|
||||
str bb_bit_count, [bb, offset_m_bit_count]
|
||||
str bb_out_buf, [bb, offset_m_out_buf]
|
||||
|
||||
cmp end_in, next_in
|
||||
bhi .loop
|
||||
|
||||
.done:
|
||||
ret
|
||||
.size encode_deflate_icf_aarch64, .-encode_deflate_icf_aarch64
|
@ -118,6 +118,11 @@ DEFINE_INTERFACE_DISPATCHER(set_long_icf_fg)
|
||||
return PROVIDER_INFO(set_long_icf_fg_aarch64);
|
||||
}
|
||||
|
||||
DEFINE_INTERFACE_DISPATCHER(encode_deflate_icf)
|
||||
{
|
||||
return PROVIDER_INFO(encode_deflate_icf_aarch64);
|
||||
}
|
||||
|
||||
DEFINE_INTERFACE_DISPATCHER(isal_update_histogram)
|
||||
{
|
||||
unsigned long auxval = getauxval(AT_HWCAP);
|
||||
|
@ -37,7 +37,7 @@ mbin_interface isal_deflate_icf_finish_lvl1
|
||||
mbin_interface isal_deflate_icf_finish_lvl2
|
||||
mbin_interface isal_deflate_icf_finish_lvl3
|
||||
mbin_interface isal_update_histogram
|
||||
mbin_interface_base encode_deflate_icf , encode_deflate_icf_base
|
||||
mbin_interface encode_deflate_icf
|
||||
mbin_interface set_long_icf_fg
|
||||
mbin_interface_base gen_icf_map_lh1 , gen_icf_map_h1_base
|
||||
mbin_interface isal_deflate_hash_lvl0
|
||||
|
Loading…
Reference in New Issue
Block a user