Path: blob/master/Utilities/cmliblzma/liblzma/rangecoder/price_tablegen.c
3156 views
// SPDX-License-Identifier: 0BSD12///////////////////////////////////////////////////////////////////////////////3//4/// \file price_tablegen.c5/// \brief Probability price table generator6///7/// Compiling: gcc -std=c99 -o price_tablegen price_tablegen.c8///9// Authors: Igor Pavlov10// Lasse Collin11//12///////////////////////////////////////////////////////////////////////////////1314#include <inttypes.h>15#include <stdio.h>1617// Make it compile without common.h.18#define BUILDING_PRICE_TABLEGEN19#define lzma_attr_visibility_hidden2021#include "range_common.h"22#include "price.h"232425static uint32_t rc_prices[RC_PRICE_TABLE_SIZE];262728static void29init_price_table(void)30{31for (uint32_t i = (UINT32_C(1) << RC_MOVE_REDUCING_BITS) / 2;32i < RC_BIT_MODEL_TOTAL;33i += (UINT32_C(1) << RC_MOVE_REDUCING_BITS)) {34const uint32_t cycles_bits = RC_BIT_PRICE_SHIFT_BITS;35uint32_t w = i;36uint32_t bit_count = 0;3738for (uint32_t j = 0; j < cycles_bits; ++j) {39w *= w;40bit_count <<= 1;4142while (w >= (UINT32_C(1) << 16)) {43w >>= 1;44++bit_count;45}46}4748rc_prices[i >> RC_MOVE_REDUCING_BITS]49= (RC_BIT_MODEL_TOTAL_BITS << cycles_bits)50- 15 - bit_count;51}5253return;54}555657static void58print_price_table(void)59{60// Split the SPDX string so that it won't accidentally match61// when tools search for the string.62printf("// SPDX" "-License-Identifier" ": 0BSD\n\n"63"// This file has been generated by price_tablegen.c.\n\n"64"#include \"range_encoder.h\"\n\n"65"const uint8_t lzma_rc_prices["66"RC_PRICE_TABLE_SIZE] = {");6768const size_t array_size = sizeof(lzma_rc_prices)69/ sizeof(lzma_rc_prices[0]);70for (size_t i = 0; i < array_size; ++i) {71if (i % 8 == 0)72printf("\n\t");7374printf("%4" PRIu32, rc_prices[i]);7576if (i != array_size - 1)77printf(",");78}7980printf("\n};\n");8182return;83}848586int87main(void)88{89init_price_table();90print_price_table();91return 0;92}939495