Edit

kc3-lang/brotli/c/enc/backward_references.c

Branch :

  • Show log

    Commit

  • Author : Evgenii Kliuchnikov
    Date : 2023-08-02 03:04:52
    Hash : 117b68b7
    Message : speedup encoder on q5-9 / 1MB+ files PiperOrigin-RevId: 553087469

  • c/enc/backward_references.c
  • /* Copyright 2013 Google Inc. All Rights Reserved.
    
       Distributed under MIT license.
       See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
    */
    
    /* Function to find backward reference copies. */
    
    #include "backward_references.h"
    
    #include <brotli/types.h>
    
    #include "../common/constants.h"
    #include "../common/dictionary.h"
    #include "../common/platform.h"
    #include "command.h"
    #include "compound_dictionary.h"
    #include "dictionary_hash.h"
    #include "encoder_dict.h"
    #include "memory.h"
    #include "quality.h"
    
    #if defined(__cplusplus) || defined(c_plusplus)
    extern "C" {
    #endif
    
    static BROTLI_INLINE size_t ComputeDistanceCode(size_t distance,
                                                    size_t max_distance,
                                                    const int* dist_cache) {
      if (distance <= max_distance) {
        size_t distance_plus_3 = distance + 3;
        size_t offset0 = distance_plus_3 - (size_t)dist_cache[0];
        size_t offset1 = distance_plus_3 - (size_t)dist_cache[1];
        if (distance == (size_t)dist_cache[0]) {
          return 0;
        } else if (distance == (size_t)dist_cache[1]) {
          return 1;
        } else if (offset0 < 7) {
          return (0x9750468 >> (4 * offset0)) & 0xF;
        } else if (offset1 < 7) {
          return (0xFDB1ACE >> (4 * offset1)) & 0xF;
        } else if (distance == (size_t)dist_cache[2]) {
          return 2;
        } else if (distance == (size_t)dist_cache[3]) {
          return 3;
        }
      }
      return distance + BROTLI_NUM_DISTANCE_SHORT_CODES - 1;
    }
    
    #define EXPAND_CAT(a, b) CAT(a, b)
    #define CAT(a, b) a ## b
    #define FN(X) EXPAND_CAT(X, HASHER())
    #define EXPORT_FN(X) EXPAND_CAT(X, EXPAND_CAT(PREFIX(), HASHER()))
    
    #define PREFIX() N
    #define ENABLE_COMPOUND_DICTIONARY 0
    
    #define HASHER() H2
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #define HASHER() H3
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #define HASHER() H4
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #define HASHER() H5
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #define HASHER() H6
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #define HASHER() H40
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #define HASHER() H41
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #define HASHER() H42
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #define HASHER() H54
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #define HASHER() H35
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #define HASHER() H55
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #define HASHER() H65
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #undef ENABLE_COMPOUND_DICTIONARY
    #undef PREFIX
    #define PREFIX() D
    #define ENABLE_COMPOUND_DICTIONARY 1
    
    #define HASHER() H5
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    #define HASHER() H6
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    #define HASHER() H40
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    #define HASHER() H41
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    #define HASHER() H42
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    #define HASHER() H55
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    #define HASHER() H65
    /* NOLINTNEXTLINE(build/include) */
    #include "backward_references_inc.h"
    #undef HASHER
    
    #undef ENABLE_COMPOUND_DICTIONARY
    #undef PREFIX
    
    #undef EXPORT_FN
    #undef FN
    #undef CAT
    #undef EXPAND_CAT
    
    void BrotliCreateBackwardReferences(size_t num_bytes,
        size_t position, const uint8_t* ringbuffer, size_t ringbuffer_mask,
        ContextLut literal_context_lut, const BrotliEncoderParams* params,
        Hasher* hasher, int* dist_cache, size_t* last_insert_len,
        Command* commands, size_t* num_commands, size_t* num_literals) {
      if (params->dictionary.compound.num_chunks != 0) {
        switch (params->hasher.type) {
    #define CASE_(N)                                                    \
          case N:                                                       \
            CreateBackwardReferencesDH ## N(num_bytes,                  \
                position, ringbuffer, ringbuffer_mask,                  \
                literal_context_lut, params, hasher, dist_cache,        \
                last_insert_len, commands, num_commands, num_literals); \
            return;
          CASE_(5)
          CASE_(6)
          CASE_(40)
          CASE_(41)
          CASE_(42)
          CASE_(55)
          CASE_(65)
    #undef CASE_
          default:
            BROTLI_DCHECK(false);
            break;
        }
      }
    
      switch (params->hasher.type) {
    #define CASE_(N)                                                  \
        case N:                                                       \
          CreateBackwardReferencesNH ## N(num_bytes,                  \
              position, ringbuffer, ringbuffer_mask,                  \
              literal_context_lut, params, hasher, dist_cache,        \
              last_insert_len, commands, num_commands, num_literals); \
          return;
        FOR_GENERIC_HASHERS(CASE_)
    #undef CASE_
        default:
          BROTLI_DCHECK(false);
          break;
      }
    }
    
    #if defined(__cplusplus) || defined(c_plusplus)
    }  /* extern "C" */
    #endif