148156Sjlemon// SPDX-License-Identifier: 0BSD 257828Sjlemon 348156Sjlemon/////////////////////////////////////////////////////////////////////////////// 448156Sjlemon// 548156Sjlemon/// \file lz_encoder_hash.h 648156Sjlemon/// \brief Hash macros for match finders 748156Sjlemon// 848156Sjlemon// Author: Igor Pavlov 948156Sjlemon// 1048156Sjlemon/////////////////////////////////////////////////////////////////////////////// 1148156Sjlemon 1248156Sjlemon#ifndef LZMA_LZ_ENCODER_HASH_H 1348156Sjlemon#define LZMA_LZ_ENCODER_HASH_H 1448156Sjlemon 1548156Sjlemon#if defined(WORDS_BIGENDIAN) && !defined(HAVE_SMALL) 1648156Sjlemon // This is to make liblzma produce the same output on big endian 1748156Sjlemon // systems that it does on little endian systems. lz_encoder.c 1848156Sjlemon // takes care of including the actual table. 1948156Sjlemon lzma_attr_visibility_hidden 2048156Sjlemon extern const uint32_t lzma_lz_hash_table[256]; 2148156Sjlemon# define hash_table lzma_lz_hash_table 2248156Sjlemon#else 2348156Sjlemon# include "check.h" 2448156Sjlemon# define hash_table lzma_crc32_table[0] 2548156Sjlemon#endif 2648156Sjlemon 27119418Sobrien#define HASH_2_SIZE (UINT32_C(1) << 10) 28119418Sobrien#define HASH_3_SIZE (UINT32_C(1) << 16) 29119418Sobrien#define HASH_4_SIZE (UINT32_C(1) << 20) 3048156Sjlemon 3148156Sjlemon#define HASH_2_MASK (HASH_2_SIZE - 1) 3248156Sjlemon#define HASH_3_MASK (HASH_3_SIZE - 1) 33129879Sphk#define HASH_4_MASK (HASH_4_SIZE - 1) 3448156Sjlemon 3560041Sphk#define FIX_3_HASH_SIZE (HASH_2_SIZE) 3648156Sjlemon#define FIX_4_HASH_SIZE (HASH_2_SIZE + HASH_3_SIZE) 37111337Sphk#define FIX_5_HASH_SIZE (HASH_2_SIZE + HASH_3_SIZE + HASH_4_SIZE) 3848156Sjlemon 3948156Sjlemon// Endianness doesn't matter in hash_2_calc() (no effect on the output). 4048156Sjlemon#ifdef TUKLIB_FAST_UNALIGNED_ACCESS 4148156Sjlemon# define hash_2_calc() \ 4248156Sjlemon const uint32_t hash_value = read16ne(cur) 43119280Simp#else 44119280Simp# define hash_2_calc() \ 4548156Sjlemon const uint32_t hash_value \ 46112946Sphk = (uint32_t)(cur[0]) | ((uint32_t)(cur[1]) << 8) 47112946Sphk#endif 4848156Sjlemon 4957828Sjlemon#define hash_3_calc() \ 5048156Sjlemon const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ 51124471Smdodd const uint32_t hash_2_value = temp & HASH_2_MASK; \ 52124471Smdodd const uint32_t hash_value \ 5348156Sjlemon = (temp ^ ((uint32_t)(cur[2]) << 8)) & mf->hash_mask 54124471Smdodd 5548156Sjlemon#define hash_4_calc() \ 56124471Smdodd const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ 57124471Smdodd const uint32_t hash_2_value = temp & HASH_2_MASK; \ 58124471Smdodd const uint32_t hash_3_value \ 5948156Sjlemon = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK; \ 6057828Sjlemon const uint32_t hash_value = (temp ^ ((uint32_t)(cur[2]) << 8) \ 6157828Sjlemon ^ (hash_table[cur[3]] << 5)) & mf->hash_mask 6257828Sjlemon 6357828Sjlemon 6457828Sjlemon// The following are not currently used. 6548156Sjlemon 6657828Sjlemon#define hash_5_calc() \ 6757828Sjlemon const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ 6857828Sjlemon const uint32_t hash_2_value = temp & HASH_2_MASK; \ 6957828Sjlemon const uint32_t hash_3_value \ 7057828Sjlemon = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK; \ 7157828Sjlemon uint32_t hash_4_value = (temp ^ ((uint32_t)(cur[2]) << 8) ^ \ 7257828Sjlemon ^ hash_table[cur[3]] << 5); \ 7357828Sjlemon const uint32_t hash_value \ 7457828Sjlemon = (hash_4_value ^ (hash_table[cur[4]] << 3)) \ 75138852Smdodd & mf->hash_mask; \ 76138852Smdodd hash_4_value &= HASH_4_MASK 77138852Smdodd 78138852Smdodd/* 79138852Smdodd#define hash_zip_calc() \ 80138852Smdodd const uint32_t hash_value \ 81138852Smdodd = (((uint32_t)(cur[0]) | ((uint32_t)(cur[1]) << 8)) \ 8257828Sjlemon ^ hash_table[cur[2]]) & 0xFFFF 8357828Sjlemon*/ 8457828Sjlemon 8557828Sjlemon#define hash_zip_calc() \ 8657828Sjlemon const uint32_t hash_value \ 8757828Sjlemon = (((uint32_t)(cur[2]) | ((uint32_t)(cur[0]) << 8)) \ 8857828Sjlemon ^ hash_table[cur[1]]) & 0xFFFF 8957828Sjlemon 9057828Sjlemon#define mt_hash_2_calc() \ 9157828Sjlemon const uint32_t hash_2_value \ 9257828Sjlemon = (hash_table[cur[0]] ^ cur[1]) & HASH_2_MASK 9373113Sjlemon 9473113Sjlemon#define mt_hash_3_calc() \ 9573113Sjlemon const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ 9673113Sjlemon const uint32_t hash_2_value = temp & HASH_2_MASK; \ 9757828Sjlemon const uint32_t hash_3_value \ 9857828Sjlemon = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK 9957828Sjlemon 10057828Sjlemon#define mt_hash_4_calc() \ 10157828Sjlemon const uint32_t temp = hash_table[cur[0]] ^ cur[1]; \ 10257828Sjlemon const uint32_t hash_2_value = temp & HASH_2_MASK; \ 10357828Sjlemon const uint32_t hash_3_value \ 10457828Sjlemon = (temp ^ ((uint32_t)(cur[2]) << 8)) & HASH_3_MASK; \ 10557828Sjlemon const uint32_t hash_4_value = (temp ^ ((uint32_t)(cur[2]) << 8) ^ \ 10657828Sjlemon (hash_table[cur[3]] << 5)) & HASH_4_MASK 10757828Sjlemon 10857828Sjlemon#endif 10957828Sjlemon