1 // SPDX-License-Identifier: 0BSD 2 3 /////////////////////////////////////////////////////////////////////////////// 4 // 5 /// \file price_tablegen.c 6 /// \brief Probability price table generator 7 /// 8 /// Compiling: gcc -std=c99 -o price_tablegen price_tablegen.c 9 /// 10 // Authors: Igor Pavlov 11 // Lasse Collin 12 // 13 /////////////////////////////////////////////////////////////////////////////// 14 15 #include <inttypes.h> 16 #include <stdio.h> 17 18 // Make it compile without common.h. 19 #define BUILDING_PRICE_TABLEGEN 20 #define lzma_attr_visibility_hidden 21 22 #include "range_common.h" 23 #include "price.h" 24 25 26 static uint32_t rc_prices[RC_PRICE_TABLE_SIZE]; 27 28 29 static void 30 init_price_table(void) 31 { 32 for (uint32_t i = (UINT32_C(1) << RC_MOVE_REDUCING_BITS) / 2; 33 i < RC_BIT_MODEL_TOTAL; 34 i += (UINT32_C(1) << RC_MOVE_REDUCING_BITS)) { 35 const uint32_t cycles_bits = RC_BIT_PRICE_SHIFT_BITS; 36 uint32_t w = i; 37 uint32_t bit_count = 0; 38 39 for (uint32_t j = 0; j < cycles_bits; ++j) { 40 w *= w; 41 bit_count <<= 1; 42 43 while (w >= (UINT32_C(1) << 16)) { 44 w >>= 1; 45 ++bit_count; 46 } 47 } 48 49 rc_prices[i >> RC_MOVE_REDUCING_BITS] 50 = (RC_BIT_MODEL_TOTAL_BITS << cycles_bits) 51 - 15 - bit_count; 52 } 53 54 return; 55 } 56 57 58 static void 59 print_price_table(void) 60 { 61 // Split the SPDX string so that it won't accidentally match 62 // when tools search for the string. 63 printf("// SPDX" "-License-Identifier" ": 0BSD\n\n" 64 "// This file has been generated by price_tablegen.c.\n\n" 65 "#include \"range_encoder.h\"\n\n" 66 "const uint8_t lzma_rc_prices[" 67 "RC_PRICE_TABLE_SIZE] = {"); 68 69 const size_t array_size = sizeof(lzma_rc_prices) 70 / sizeof(lzma_rc_prices[0]); 71 for (size_t i = 0; i < array_size; ++i) { 72 if (i % 8 == 0) 73 printf("\n\t"); 74 75 printf("%4" PRIu32, rc_prices[i]); 76 77 if (i != array_size - 1) 78 printf(","); 79 } 80 81 printf("\n};\n"); 82 83 return; 84 } 85 86 87 int 88 main(void) 89 { 90 init_price_table(); 91 print_price_table(); 92 return 0; 93 } 94