1*5a645f22SBen Gras /////////////////////////////////////////////////////////////////////////////// 2*5a645f22SBen Gras // 3*5a645f22SBen Gras /// \file price_tablegen.c 4*5a645f22SBen Gras /// \brief Probability price table generator 5*5a645f22SBen Gras /// 6*5a645f22SBen Gras /// Compiling: gcc -std=c99 -o price_tablegen price_tablegen.c 7*5a645f22SBen Gras /// 8*5a645f22SBen Gras // Authors: Igor Pavlov 9*5a645f22SBen Gras // Lasse Collin 10*5a645f22SBen Gras // 11*5a645f22SBen Gras // This file has been put into the public domain. 12*5a645f22SBen Gras // You can do whatever you want with this file. 13*5a645f22SBen Gras // 14*5a645f22SBen Gras /////////////////////////////////////////////////////////////////////////////// 15*5a645f22SBen Gras 16*5a645f22SBen Gras #include <inttypes.h> 17*5a645f22SBen Gras #include <stdio.h> 18*5a645f22SBen Gras #include "range_common.h" 19*5a645f22SBen Gras #include "price.h" 20*5a645f22SBen Gras 21*5a645f22SBen Gras 22*5a645f22SBen Gras static uint32_t rc_prices[RC_PRICE_TABLE_SIZE]; 23*5a645f22SBen Gras 24*5a645f22SBen Gras 25*5a645f22SBen Gras static void init_price_table(void)26*5a645f22SBen Grasinit_price_table(void) 27*5a645f22SBen Gras { 28*5a645f22SBen Gras for (uint32_t i = (UINT32_C(1) << RC_MOVE_REDUCING_BITS) / 2; 29*5a645f22SBen Gras i < RC_BIT_MODEL_TOTAL; 30*5a645f22SBen Gras i += (UINT32_C(1) << RC_MOVE_REDUCING_BITS)) { 31*5a645f22SBen Gras const uint32_t cycles_bits = RC_BIT_PRICE_SHIFT_BITS; 32*5a645f22SBen Gras uint32_t w = i; 33*5a645f22SBen Gras uint32_t bit_count = 0; 34*5a645f22SBen Gras 35*5a645f22SBen Gras for (uint32_t j = 0; j < cycles_bits; ++j) { 36*5a645f22SBen Gras w *= w; 37*5a645f22SBen Gras bit_count <<= 1; 38*5a645f22SBen Gras 39*5a645f22SBen Gras while (w >= (UINT32_C(1) << 16)) { 40*5a645f22SBen Gras w >>= 1; 41*5a645f22SBen Gras ++bit_count; 42*5a645f22SBen Gras } 43*5a645f22SBen Gras } 44*5a645f22SBen Gras 45*5a645f22SBen Gras rc_prices[i >> RC_MOVE_REDUCING_BITS] 46*5a645f22SBen Gras = (RC_BIT_MODEL_TOTAL_BITS << cycles_bits) 47*5a645f22SBen Gras - 15 - bit_count; 48*5a645f22SBen Gras } 49*5a645f22SBen Gras 50*5a645f22SBen Gras return; 51*5a645f22SBen Gras } 52*5a645f22SBen Gras 53*5a645f22SBen Gras 54*5a645f22SBen Gras static void print_price_table(void)55*5a645f22SBen Grasprint_price_table(void) 56*5a645f22SBen Gras { 57*5a645f22SBen Gras printf("/* This file has been automatically generated by " 58*5a645f22SBen Gras "price_tablegen.c. */\n\n" 59*5a645f22SBen Gras "#include \"range_encoder.h\"\n\n" 60*5a645f22SBen Gras "const uint8_t lzma_rc_prices[" 61*5a645f22SBen Gras "RC_PRICE_TABLE_SIZE] = {"); 62*5a645f22SBen Gras 63*5a645f22SBen Gras const size_t array_size = sizeof(lzma_rc_prices) 64*5a645f22SBen Gras / sizeof(lzma_rc_prices[0]); 65*5a645f22SBen Gras for (size_t i = 0; i < array_size; ++i) { 66*5a645f22SBen Gras if (i % 8 == 0) 67*5a645f22SBen Gras printf("\n\t"); 68*5a645f22SBen Gras 69*5a645f22SBen Gras printf("%4" PRIu32, rc_prices[i]); 70*5a645f22SBen Gras 71*5a645f22SBen Gras if (i != array_size - 1) 72*5a645f22SBen Gras printf(","); 73*5a645f22SBen Gras } 74*5a645f22SBen Gras 75*5a645f22SBen Gras printf("\n};\n"); 76*5a645f22SBen Gras 77*5a645f22SBen Gras return; 78*5a645f22SBen Gras } 79*5a645f22SBen Gras 80*5a645f22SBen Gras 81*5a645f22SBen Gras int main(void)82*5a645f22SBen Grasmain(void) 83*5a645f22SBen Gras { 84*5a645f22SBen Gras init_price_table(); 85*5a645f22SBen Gras print_price_table(); 86*5a645f22SBen Gras return 0; 87*5a645f22SBen Gras } 88