1*3b35e7eeSXin LI // SPDX-License-Identifier: 0BSD 2*3b35e7eeSXin LI 381ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 481ad8388SMartin Matuska // 581ad8388SMartin Matuska /// \file price_tablegen.c 681ad8388SMartin Matuska /// \brief Probability price table generator 781ad8388SMartin Matuska /// 881ad8388SMartin Matuska /// Compiling: gcc -std=c99 -o price_tablegen price_tablegen.c 981ad8388SMartin Matuska /// 1081ad8388SMartin Matuska // Authors: Igor Pavlov 1181ad8388SMartin Matuska // Lasse Collin 1281ad8388SMartin Matuska // 1381ad8388SMartin Matuska /////////////////////////////////////////////////////////////////////////////// 1481ad8388SMartin Matuska 1581ad8388SMartin Matuska #include <inttypes.h> 1681ad8388SMartin Matuska #include <stdio.h> 17*3b35e7eeSXin LI 18*3b35e7eeSXin LI // Make it compile without common.h. 19*3b35e7eeSXin LI #define BUILDING_PRICE_TABLEGEN 20*3b35e7eeSXin LI #define lzma_attr_visibility_hidden 21*3b35e7eeSXin LI 2281ad8388SMartin Matuska #include "range_common.h" 2381ad8388SMartin Matuska #include "price.h" 2481ad8388SMartin Matuska 2581ad8388SMartin Matuska 2681ad8388SMartin Matuska static uint32_t rc_prices[RC_PRICE_TABLE_SIZE]; 2781ad8388SMartin Matuska 2881ad8388SMartin Matuska 2981ad8388SMartin Matuska static void 3081ad8388SMartin Matuska init_price_table(void) 3181ad8388SMartin Matuska { 3281ad8388SMartin Matuska for (uint32_t i = (UINT32_C(1) << RC_MOVE_REDUCING_BITS) / 2; 3381ad8388SMartin Matuska i < RC_BIT_MODEL_TOTAL; 3481ad8388SMartin Matuska i += (UINT32_C(1) << RC_MOVE_REDUCING_BITS)) { 3581ad8388SMartin Matuska const uint32_t cycles_bits = RC_BIT_PRICE_SHIFT_BITS; 3681ad8388SMartin Matuska uint32_t w = i; 3781ad8388SMartin Matuska uint32_t bit_count = 0; 3881ad8388SMartin Matuska 3981ad8388SMartin Matuska for (uint32_t j = 0; j < cycles_bits; ++j) { 4081ad8388SMartin Matuska w *= w; 4181ad8388SMartin Matuska bit_count <<= 1; 4281ad8388SMartin Matuska 4381ad8388SMartin Matuska while (w >= (UINT32_C(1) << 16)) { 4481ad8388SMartin Matuska w >>= 1; 4581ad8388SMartin Matuska ++bit_count; 4681ad8388SMartin Matuska } 4781ad8388SMartin Matuska } 4881ad8388SMartin Matuska 4981ad8388SMartin Matuska rc_prices[i >> RC_MOVE_REDUCING_BITS] 5081ad8388SMartin Matuska = (RC_BIT_MODEL_TOTAL_BITS << cycles_bits) 5181ad8388SMartin Matuska - 15 - bit_count; 5281ad8388SMartin Matuska } 5381ad8388SMartin Matuska 5481ad8388SMartin Matuska return; 5581ad8388SMartin Matuska } 5681ad8388SMartin Matuska 5781ad8388SMartin Matuska 5881ad8388SMartin Matuska static void 5981ad8388SMartin Matuska print_price_table(void) 6081ad8388SMartin Matuska { 61*3b35e7eeSXin LI // Split the SPDX string so that it won't accidentally match 62*3b35e7eeSXin LI // when tools search for the string. 63*3b35e7eeSXin LI printf("// SPDX" "-License-Identifier" ": 0BSD\n\n" 64*3b35e7eeSXin LI "// This file has been generated by price_tablegen.c.\n\n" 6581ad8388SMartin Matuska "#include \"range_encoder.h\"\n\n" 6681ad8388SMartin Matuska "const uint8_t lzma_rc_prices[" 6781ad8388SMartin Matuska "RC_PRICE_TABLE_SIZE] = {"); 6881ad8388SMartin Matuska 6981ad8388SMartin Matuska const size_t array_size = sizeof(lzma_rc_prices) 7081ad8388SMartin Matuska / sizeof(lzma_rc_prices[0]); 7181ad8388SMartin Matuska for (size_t i = 0; i < array_size; ++i) { 7281ad8388SMartin Matuska if (i % 8 == 0) 7381ad8388SMartin Matuska printf("\n\t"); 7481ad8388SMartin Matuska 7581ad8388SMartin Matuska printf("%4" PRIu32, rc_prices[i]); 7681ad8388SMartin Matuska 7781ad8388SMartin Matuska if (i != array_size - 1) 7881ad8388SMartin Matuska printf(","); 7981ad8388SMartin Matuska } 8081ad8388SMartin Matuska 8181ad8388SMartin Matuska printf("\n};\n"); 8281ad8388SMartin Matuska 8381ad8388SMartin Matuska return; 8481ad8388SMartin Matuska } 8581ad8388SMartin Matuska 8681ad8388SMartin Matuska 8781ad8388SMartin Matuska int 8881ad8388SMartin Matuska main(void) 8981ad8388SMartin Matuska { 9081ad8388SMartin Matuska init_price_table(); 9181ad8388SMartin Matuska print_price_table(); 9281ad8388SMartin Matuska return 0; 9381ad8388SMartin Matuska } 94