* details.
*
* You should have received a copy of the GNU Lesser General Public License
- * along with this file; if not, see http://www.gnu.org/licenses/.
+ * along with this file; if not, see https://www.gnu.org/licenses/.
*/
#ifdef HAVE_CONFIG_H
/* Pointer to the start of the output buffer. */
u8 *start;
- /* Pointer to the location in the ouput buffer at which to write the
+ /* Pointer to the location in the output buffer at which to write the
* next 16 bits. */
u8 *next_bits;
* If the output buffer space is exhausted, then the bits will be ignored, and
* xpress_flush_output() will return 0 when it gets called.
*/
-static inline void
+static forceinline void
xpress_write_bits(struct xpress_output_bitstream *os,
const u32 bits, const unsigned num_bits)
{
if (os->bitcount > 16) {
os->bitcount -= 16;
if (os->end - os->next_byte >= 2) {
- put_unaligned_u16_le(os->bitbuf >> os->bitcount, os->next_bits);
+ put_unaligned_le16(os->bitbuf >> os->bitcount, os->next_bits);
os->next_bits = os->next_bits2;
os->next_bits2 = os->next_byte;
os->next_byte += 2;
/*
* Interweave a literal byte into the output bitstream.
*/
-static inline void
+static forceinline void
xpress_write_byte(struct xpress_output_bitstream *os, u8 byte)
{
if (os->next_byte < os->end)
/*
* Interweave two literal bytes into the output bitstream.
*/
-static inline void
+static forceinline void
xpress_write_u16(struct xpress_output_bitstream *os, u16 v)
{
if (os->end - os->next_byte >= 2) {
- put_unaligned_u16_le(v, os->next_byte);
+ put_unaligned_le16(v, os->next_byte);
os->next_byte += 2;
}
}
if (os->end - os->next_byte < 2)
return 0;
- put_unaligned_u16_le(os->bitbuf << (16 - os->bitcount), os->next_bits);
- put_unaligned_u16_le(0, os->next_bits2);
+ put_unaligned_le16(os->bitbuf << (16 - os->bitcount), os->next_bits);
+ put_unaligned_le16(0, os->next_bits2);
return os->next_byte - os->start;
}
-static inline void
+static forceinline void
xpress_write_extra_length_bytes(struct xpress_output_bitstream *os,
unsigned adjusted_len)
{
}
/* Output a match or literal. */
-static inline void
+static forceinline void
xpress_write_item(struct xpress_item item, struct xpress_output_bitstream *os,
const u32 codewords[], const u8 lens[])
{
unsigned sym;
adjusted_len = length - XPRESS_MIN_MATCH_LEN;
- log2_offset = fls32(offset);
+ log2_offset = bsr32(offset);
len_hdr = min(0xF, adjusted_len);
sym = XPRESS_NUM_CHARS + ((log2_offset << 4) | len_hdr);
/* Tally the Huffman symbol for a literal and return the intermediate
* representation of that literal. */
-static inline struct xpress_item
+static forceinline struct xpress_item
xpress_record_literal(struct xpress_compressor *c, unsigned literal)
{
c->freqs[literal]++;
/* Tally the Huffman symbol for a match and return the intermediate
* representation of that match. */
-static inline struct xpress_item
+static forceinline struct xpress_item
xpress_record_match(struct xpress_compressor *c, unsigned length, unsigned offset)
{
unsigned adjusted_len = length - XPRESS_MIN_MATCH_LEN;
unsigned len_hdr = min(adjusted_len, 0xF);
- unsigned log2_offset = fls32(offset);
+ unsigned log2_offset = bsr32(offset);
unsigned sym = XPRESS_NUM_CHARS + ((log2_offset << 4) | len_hdr);
c->freqs[sym]++;
length = hc_matchfinder_longest_match(&c->hc_mf,
in_begin,
- in_next - in_begin,
+ in_next,
XPRESS_MIN_MATCH_LEN - 1,
in_end - in_next,
min(in_end - in_next, c->nice_match_length),
*next_chosen_item++ =
xpress_record_match(c, length, offset);
in_next += 1;
- hc_matchfinder_skip_positions(&c->hc_mf,
- in_begin,
- in_next - in_begin,
- in_end - in_begin,
- length - 1,
- next_hashes);
+ hc_matchfinder_skip_bytes(&c->hc_mf,
+ in_begin,
+ in_next,
+ in_end,
+ length - 1,
+ next_hashes);
in_next += length - 1;
} else {
/* No match found */
/* Find the longest match at the current position. */
cur_len = hc_matchfinder_longest_match(&c->hc_mf,
in_begin,
- in_next - in_begin,
+ in_next,
XPRESS_MIN_MATCH_LEN - 1,
in_end - in_next,
min(in_end - in_next, c->nice_match_length),
*next_chosen_item++ =
xpress_record_match(c, cur_len, cur_offset);
- hc_matchfinder_skip_positions(&c->hc_mf,
- in_begin,
- in_next - in_begin,
- in_end - in_begin,
- cur_len - 1,
- next_hashes);
+ hc_matchfinder_skip_bytes(&c->hc_mf,
+ in_begin,
+ in_next,
+ in_end,
+ cur_len - 1,
+ next_hashes);
in_next += cur_len - 1;
continue;
}
*/
next_len = hc_matchfinder_longest_match(&c->hc_mf,
in_begin,
- in_next - in_begin,
+ in_next,
cur_len,
in_end - in_next,
min(in_end - in_next, c->nice_match_length),
* output the current match. */
*next_chosen_item++ =
xpress_record_match(c, cur_len, cur_offset);
- hc_matchfinder_skip_positions(&c->hc_mf,
- in_begin,
- in_next - in_begin,
- in_end - in_begin,
- cur_len - 2,
- next_hashes);
+ hc_matchfinder_skip_bytes(&c->hc_mf,
+ in_begin,
+ in_next,
+ in_end,
+ cur_len - 2,
+ next_hashes);
in_next += cur_len - 2;
continue;
}
unsigned sym;
adjusted_len = length - XPRESS_MIN_MATCH_LEN;
- log2_offset = fls32(offset);
+ log2_offset = bsr32(offset);
len_hdr = min(0xF, adjusted_len);
sym = XPRESS_NUM_CHARS + ((log2_offset << 4) | len_hdr);
u32 offset_cost;
offset = match->offset;
- log2_offset = fls32(offset);
+ log2_offset = bsr32(offset);
offset_cost = log2_offset;
do {
unsigned len_hdr;
u32 offset_cost;
offset = match->offset;
- log2_offset = fls32(offset);
+ log2_offset = bsr32(offset);
offset_cost = log2_offset;
do {
unsigned adjusted_len;
break;
--best_len;
do {
- bt_matchfinder_skip_position(&c->bt_mf,
- in_begin,
- in_next - in_begin,
- max_len,
- nice_len,
- c->max_search_depth,
- next_hashes);
+ bt_matchfinder_skip_byte(&c->bt_mf,
+ in_begin,
+ in_next - in_begin,
+ nice_len,
+ c->max_search_depth,
+ next_hashes);
cache_ptr->length = 0;
cache_ptr->offset = *in_next++;
cache_ptr++;