summaryrefslogtreecommitdiffstats
path: root/src/isa-l/igzip/igzip_deflate_hash.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/isa-l/igzip/igzip_deflate_hash.asm')
-rw-r--r--src/isa-l/igzip/igzip_deflate_hash.asm165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/isa-l/igzip/igzip_deflate_hash.asm b/src/isa-l/igzip/igzip_deflate_hash.asm
new file mode 100644
index 000000000..b61c4be1e
--- /dev/null
+++ b/src/isa-l/igzip/igzip_deflate_hash.asm
@@ -0,0 +1,165 @@
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Copyright(c) 2011-2018 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 "options.asm"
+%include "lz0a_const.asm"
+%include "data_struct2.asm"
+%include "huffman.asm"
+%include "reg_sizes.asm"
+
+%define DICT_SLOP 8
+%define DICT_END_SLOP 4
+
+%ifidn __OUTPUT_FORMAT__, win64
+%define arg1 rcx
+%define arg2 rdx
+%define arg3 r8
+%define arg4 r9
+%define arg5 rdi
+%define swap1 rsi
+%define stack_size 3 * 8
+%define PS 8
+%define arg(x) [rsp + stack_size + PS*x]
+%else
+%define arg1 rdi
+%define arg2 rsi
+%define arg3 rdx
+%define arg4 rcx
+%define arg5 r8
+%define swap1 r9
+%endif
+
+%define hash_table arg1
+
+%define hash_mask arg2
+
+%define f_i_end arg3
+
+%define dict_offset arg4
+
+%define dict_len arg5
+%define f_i arg5
+
+%define f_i_tmp rax
+
+%define hash swap1
+
+%define hash2 r10
+
+%define hash3 r11
+
+%define hash4 r12
+
+
+%macro FUNC_SAVE 0
+%ifidn __OUTPUT_FORMAT__, win64
+ push rsi
+ push rdi
+ push r12
+ mov arg5 %+ d, arg(5)
+%else
+ push r12
+%endif
+%endm
+
+%macro FUNC_RESTORE 0
+%ifidn __OUTPUT_FORMAT__, win64
+ pop r12
+ pop rdi
+ pop rsi
+%else
+ pop r12
+%endif
+%endm
+
+global isal_deflate_hash_crc_01
+isal_deflate_hash_crc_01:
+ FUNC_SAVE
+
+ neg f_i
+ add f_i, f_i_end
+
+ sub dict_offset, f_i
+
+ sub f_i_end, DICT_SLOP
+ cmp f_i, f_i_end
+ jg end_main
+
+main_loop:
+ lea f_i_tmp, [f_i + 2]
+
+ xor hash, hash
+ crc32 hash %+ d, dword [f_i + dict_offset]
+
+ xor hash2, hash2
+ crc32 hash2 %+ d, dword [f_i + dict_offset + 1]
+
+ xor hash3, hash3
+ crc32 hash3 %+ d, dword [f_i_tmp + dict_offset]
+
+ xor hash4, hash4
+ crc32 hash4 %+ d, dword [f_i_tmp + dict_offset + 1]
+
+ and hash, hash_mask
+ and hash2, hash_mask
+ and hash3, hash_mask
+ and hash4, hash_mask
+
+ mov [hash_table + 2 * hash], f_i %+ w
+ add f_i, 1
+
+ mov [hash_table + 2 * hash2], f_i %+ w
+ add f_i, 3
+
+ mov [hash_table + 2 * hash3], f_i_tmp %+ w
+ add f_i_tmp, 1
+
+ mov [hash_table + 2 * hash4], f_i_tmp %+ w
+
+ cmp f_i, f_i_end
+ jle main_loop
+
+end_main:
+ add f_i_end, DICT_SLOP - DICT_END_SLOP
+ cmp f_i, f_i_end
+ jg end
+
+end_loop:
+ xor hash, hash
+ crc32 hash %+ d, dword [f_i + dict_offset]
+
+ and hash, hash_mask
+ mov [hash_table + 2 * hash], f_i %+ w
+
+ add f_i, 1
+ cmp f_i, f_i_end
+ jle end_loop
+end:
+ FUNC_RESTORE
+ ret