xref: /minix3/external/public-domain/xz/dist/src/liblzma/rangecoder/price_tablegen.c (revision 5a645f22a86f086849945a5dd6acbf59f38c913a)
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 Gras init_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 Gras print_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 Gras main(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