From 9f4f6b038c04f5090d5100db5840bedbaa530787 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 20 Sep 2022 07:27:15 +0200 Subject: [PATCH] OPTIM: hpack-huff: reduce the cache footprint of the huffman decoder Some tables are currently used to decode bit blocks and lengths. We do see such lookups in perf top. We have 4 512-byte tables and one 64-byte one. Looking closer, the second half of the table (length) has so few variations that most of the time it will be computed in a single "if", and never more than 3. This alone allows to cut the tables in half. In addition, one table (bits 15-11) is only 32-element long, while another one (bits 11-4) starts at 0x60, so we can merge the two as they do not overlap, and further save size. We're now down to 4 256-entries tables. This is visible in h3 and h2 where the max request rate is slightly higher (e.g. +1.6% for h2). The huff_dec() function got slightly larger but the overall code size shrunk: $ nm --size haproxy-before | grep huff_dec 000000000000029e T huff_dec $ nm --size haproxy-after | grep huff_dec 0000000000000345 T huff_dec $ size haproxy-before haproxy-after text data bss dec hex filename 7591126 569268 2761348 10921742 a6a70e haproxy-before 7591082 568180 2761348 10920610 a6a2a2 haproxy-after --- src/hpack-huff.c | 1277 +++++++++++----------------------------------- 1 file changed, 302 insertions(+), 975 deletions(-) diff --git a/src/hpack-huff.c b/src/hpack-huff.c index 35fa52d59..2d9513410 100644 --- a/src/hpack-huff.c +++ b/src/hpack-huff.c @@ -38,11 +38,6 @@ struct huff { int b; /* bits */ }; -struct rht { - uint8_t c; // code or 0 if length > 8 + position*8 - uint8_t l; // length in bits -}; - /* huffman table as per RFC7541 appendix B */ static const struct huff ht[257] = { [ 0] = { .c = 0x00001ff8, .b = 13 }, @@ -306,7 +301,8 @@ static const struct huff ht[257] = { /* Reversed huffman codes, generated by dev/hpack/gen-rht.c from the table - * above. + * above, then simplified by hand by extracting the few different length + * values and writing code to produce them instead. * * The codes are aligned on the MSB since that's how they appear in the stream. * @@ -424,967 +420,283 @@ static const struct huff ht[257] = { * ... */ -struct rht rht_bit31_24[256] = { - [0x00] = { .c = 0x30, .l = 5 }, - [0x01] = { .c = 0x30, .l = 5 }, - [0x02] = { .c = 0x30, .l = 5 }, - [0x03] = { .c = 0x30, .l = 5 }, - [0x04] = { .c = 0x30, .l = 5 }, - [0x05] = { .c = 0x30, .l = 5 }, - [0x06] = { .c = 0x30, .l = 5 }, - [0x07] = { .c = 0x30, .l = 5 }, - [0x08] = { .c = 0x31, .l = 5 }, - [0x09] = { .c = 0x31, .l = 5 }, - [0x0a] = { .c = 0x31, .l = 5 }, - [0x0b] = { .c = 0x31, .l = 5 }, - [0x0c] = { .c = 0x31, .l = 5 }, - [0x0d] = { .c = 0x31, .l = 5 }, - [0x0e] = { .c = 0x31, .l = 5 }, - [0x0f] = { .c = 0x31, .l = 5 }, - [0x10] = { .c = 0x32, .l = 5 }, - [0x11] = { .c = 0x32, .l = 5 }, - [0x12] = { .c = 0x32, .l = 5 }, - [0x13] = { .c = 0x32, .l = 5 }, - [0x14] = { .c = 0x32, .l = 5 }, - [0x15] = { .c = 0x32, .l = 5 }, - [0x16] = { .c = 0x32, .l = 5 }, - [0x17] = { .c = 0x32, .l = 5 }, - [0x18] = { .c = 0x61, .l = 5 }, - [0x19] = { .c = 0x61, .l = 5 }, - [0x1a] = { .c = 0x61, .l = 5 }, - [0x1b] = { .c = 0x61, .l = 5 }, - [0x1c] = { .c = 0x61, .l = 5 }, - [0x1d] = { .c = 0x61, .l = 5 }, - [0x1e] = { .c = 0x61, .l = 5 }, - [0x1f] = { .c = 0x61, .l = 5 }, - [0x20] = { .c = 0x63, .l = 5 }, - [0x21] = { .c = 0x63, .l = 5 }, - [0x22] = { .c = 0x63, .l = 5 }, - [0x23] = { .c = 0x63, .l = 5 }, - [0x24] = { .c = 0x63, .l = 5 }, - [0x25] = { .c = 0x63, .l = 5 }, - [0x26] = { .c = 0x63, .l = 5 }, - [0x27] = { .c = 0x63, .l = 5 }, - [0x28] = { .c = 0x65, .l = 5 }, - [0x29] = { .c = 0x65, .l = 5 }, - [0x2a] = { .c = 0x65, .l = 5 }, - [0x2b] = { .c = 0x65, .l = 5 }, - [0x2c] = { .c = 0x65, .l = 5 }, - [0x2d] = { .c = 0x65, .l = 5 }, - [0x2e] = { .c = 0x65, .l = 5 }, - [0x2f] = { .c = 0x65, .l = 5 }, - [0x30] = { .c = 0x69, .l = 5 }, - [0x31] = { .c = 0x69, .l = 5 }, - [0x32] = { .c = 0x69, .l = 5 }, - [0x33] = { .c = 0x69, .l = 5 }, - [0x34] = { .c = 0x69, .l = 5 }, - [0x35] = { .c = 0x69, .l = 5 }, - [0x36] = { .c = 0x69, .l = 5 }, - [0x37] = { .c = 0x69, .l = 5 }, - [0x38] = { .c = 0x6f, .l = 5 }, - [0x39] = { .c = 0x6f, .l = 5 }, - [0x3a] = { .c = 0x6f, .l = 5 }, - [0x3b] = { .c = 0x6f, .l = 5 }, - [0x3c] = { .c = 0x6f, .l = 5 }, - [0x3d] = { .c = 0x6f, .l = 5 }, - [0x3e] = { .c = 0x6f, .l = 5 }, - [0x3f] = { .c = 0x6f, .l = 5 }, - [0x40] = { .c = 0x73, .l = 5 }, - [0x41] = { .c = 0x73, .l = 5 }, - [0x42] = { .c = 0x73, .l = 5 }, - [0x43] = { .c = 0x73, .l = 5 }, - [0x44] = { .c = 0x73, .l = 5 }, - [0x45] = { .c = 0x73, .l = 5 }, - [0x46] = { .c = 0x73, .l = 5 }, - [0x47] = { .c = 0x73, .l = 5 }, - [0x48] = { .c = 0x74, .l = 5 }, - [0x49] = { .c = 0x74, .l = 5 }, - [0x4a] = { .c = 0x74, .l = 5 }, - [0x4b] = { .c = 0x74, .l = 5 }, - [0x4c] = { .c = 0x74, .l = 5 }, - [0x4d] = { .c = 0x74, .l = 5 }, - [0x4e] = { .c = 0x74, .l = 5 }, - [0x4f] = { .c = 0x74, .l = 5 }, - [0x50] = { .c = 0x20, .l = 6 }, - [0x51] = { .c = 0x20, .l = 6 }, - [0x52] = { .c = 0x20, .l = 6 }, - [0x53] = { .c = 0x20, .l = 6 }, - [0x54] = { .c = 0x25, .l = 6 }, - [0x55] = { .c = 0x25, .l = 6 }, - [0x56] = { .c = 0x25, .l = 6 }, - [0x57] = { .c = 0x25, .l = 6 }, - [0x58] = { .c = 0x2d, .l = 6 }, - [0x59] = { .c = 0x2d, .l = 6 }, - [0x5a] = { .c = 0x2d, .l = 6 }, - [0x5b] = { .c = 0x2d, .l = 6 }, - [0x5c] = { .c = 0x2e, .l = 6 }, - [0x5d] = { .c = 0x2e, .l = 6 }, - [0x5e] = { .c = 0x2e, .l = 6 }, - [0x5f] = { .c = 0x2e, .l = 6 }, - [0x60] = { .c = 0x2f, .l = 6 }, - [0x61] = { .c = 0x2f, .l = 6 }, - [0x62] = { .c = 0x2f, .l = 6 }, - [0x63] = { .c = 0x2f, .l = 6 }, - [0x64] = { .c = 0x33, .l = 6 }, - [0x65] = { .c = 0x33, .l = 6 }, - [0x66] = { .c = 0x33, .l = 6 }, - [0x67] = { .c = 0x33, .l = 6 }, - [0x68] = { .c = 0x34, .l = 6 }, - [0x69] = { .c = 0x34, .l = 6 }, - [0x6a] = { .c = 0x34, .l = 6 }, - [0x6b] = { .c = 0x34, .l = 6 }, - [0x6c] = { .c = 0x35, .l = 6 }, - [0x6d] = { .c = 0x35, .l = 6 }, - [0x6e] = { .c = 0x35, .l = 6 }, - [0x6f] = { .c = 0x35, .l = 6 }, - [0x70] = { .c = 0x36, .l = 6 }, - [0x71] = { .c = 0x36, .l = 6 }, - [0x72] = { .c = 0x36, .l = 6 }, - [0x73] = { .c = 0x36, .l = 6 }, - [0x74] = { .c = 0x37, .l = 6 }, - [0x75] = { .c = 0x37, .l = 6 }, - [0x76] = { .c = 0x37, .l = 6 }, - [0x77] = { .c = 0x37, .l = 6 }, - [0x78] = { .c = 0x38, .l = 6 }, - [0x79] = { .c = 0x38, .l = 6 }, - [0x7a] = { .c = 0x38, .l = 6 }, - [0x7b] = { .c = 0x38, .l = 6 }, - [0x7c] = { .c = 0x39, .l = 6 }, - [0x7d] = { .c = 0x39, .l = 6 }, - [0x7e] = { .c = 0x39, .l = 6 }, - [0x7f] = { .c = 0x39, .l = 6 }, - [0x80] = { .c = 0x3d, .l = 6 }, - [0x81] = { .c = 0x3d, .l = 6 }, - [0x82] = { .c = 0x3d, .l = 6 }, - [0x83] = { .c = 0x3d, .l = 6 }, - [0x84] = { .c = 0x41, .l = 6 }, - [0x85] = { .c = 0x41, .l = 6 }, - [0x86] = { .c = 0x41, .l = 6 }, - [0x87] = { .c = 0x41, .l = 6 }, - [0x88] = { .c = 0x5f, .l = 6 }, - [0x89] = { .c = 0x5f, .l = 6 }, - [0x8a] = { .c = 0x5f, .l = 6 }, - [0x8b] = { .c = 0x5f, .l = 6 }, - [0x8c] = { .c = 0x62, .l = 6 }, - [0x8d] = { .c = 0x62, .l = 6 }, - [0x8e] = { .c = 0x62, .l = 6 }, - [0x8f] = { .c = 0x62, .l = 6 }, - [0x90] = { .c = 0x64, .l = 6 }, - [0x91] = { .c = 0x64, .l = 6 }, - [0x92] = { .c = 0x64, .l = 6 }, - [0x93] = { .c = 0x64, .l = 6 }, - [0x94] = { .c = 0x66, .l = 6 }, - [0x95] = { .c = 0x66, .l = 6 }, - [0x96] = { .c = 0x66, .l = 6 }, - [0x97] = { .c = 0x66, .l = 6 }, - [0x98] = { .c = 0x67, .l = 6 }, - [0x99] = { .c = 0x67, .l = 6 }, - [0x9a] = { .c = 0x67, .l = 6 }, - [0x9b] = { .c = 0x67, .l = 6 }, - [0x9c] = { .c = 0x68, .l = 6 }, - [0x9d] = { .c = 0x68, .l = 6 }, - [0x9e] = { .c = 0x68, .l = 6 }, - [0x9f] = { .c = 0x68, .l = 6 }, - [0xa0] = { .c = 0x6c, .l = 6 }, - [0xa1] = { .c = 0x6c, .l = 6 }, - [0xa2] = { .c = 0x6c, .l = 6 }, - [0xa3] = { .c = 0x6c, .l = 6 }, - [0xa4] = { .c = 0x6d, .l = 6 }, - [0xa5] = { .c = 0x6d, .l = 6 }, - [0xa6] = { .c = 0x6d, .l = 6 }, - [0xa7] = { .c = 0x6d, .l = 6 }, - [0xa8] = { .c = 0x6e, .l = 6 }, - [0xa9] = { .c = 0x6e, .l = 6 }, - [0xaa] = { .c = 0x6e, .l = 6 }, - [0xab] = { .c = 0x6e, .l = 6 }, - [0xac] = { .c = 0x70, .l = 6 }, - [0xad] = { .c = 0x70, .l = 6 }, - [0xae] = { .c = 0x70, .l = 6 }, - [0xaf] = { .c = 0x70, .l = 6 }, - [0xb0] = { .c = 0x72, .l = 6 }, - [0xb1] = { .c = 0x72, .l = 6 }, - [0xb2] = { .c = 0x72, .l = 6 }, - [0xb3] = { .c = 0x72, .l = 6 }, - [0xb4] = { .c = 0x75, .l = 6 }, - [0xb5] = { .c = 0x75, .l = 6 }, - [0xb6] = { .c = 0x75, .l = 6 }, - [0xb7] = { .c = 0x75, .l = 6 }, - [0xb8] = { .c = 0x3a, .l = 7 }, - [0xb9] = { .c = 0x3a, .l = 7 }, - [0xba] = { .c = 0x42, .l = 7 }, - [0xbb] = { .c = 0x42, .l = 7 }, - [0xbc] = { .c = 0x43, .l = 7 }, - [0xbd] = { .c = 0x43, .l = 7 }, - [0xbe] = { .c = 0x44, .l = 7 }, - [0xbf] = { .c = 0x44, .l = 7 }, - [0xc0] = { .c = 0x45, .l = 7 }, - [0xc1] = { .c = 0x45, .l = 7 }, - [0xc2] = { .c = 0x46, .l = 7 }, - [0xc3] = { .c = 0x46, .l = 7 }, - [0xc4] = { .c = 0x47, .l = 7 }, - [0xc5] = { .c = 0x47, .l = 7 }, - [0xc6] = { .c = 0x48, .l = 7 }, - [0xc7] = { .c = 0x48, .l = 7 }, - [0xc8] = { .c = 0x49, .l = 7 }, - [0xc9] = { .c = 0x49, .l = 7 }, - [0xca] = { .c = 0x4a, .l = 7 }, - [0xcb] = { .c = 0x4a, .l = 7 }, - [0xcc] = { .c = 0x4b, .l = 7 }, - [0xcd] = { .c = 0x4b, .l = 7 }, - [0xce] = { .c = 0x4c, .l = 7 }, - [0xcf] = { .c = 0x4c, .l = 7 }, - [0xd0] = { .c = 0x4d, .l = 7 }, - [0xd1] = { .c = 0x4d, .l = 7 }, - [0xd2] = { .c = 0x4e, .l = 7 }, - [0xd3] = { .c = 0x4e, .l = 7 }, - [0xd4] = { .c = 0x4f, .l = 7 }, - [0xd5] = { .c = 0x4f, .l = 7 }, - [0xd6] = { .c = 0x50, .l = 7 }, - [0xd7] = { .c = 0x50, .l = 7 }, - [0xd8] = { .c = 0x51, .l = 7 }, - [0xd9] = { .c = 0x51, .l = 7 }, - [0xda] = { .c = 0x52, .l = 7 }, - [0xdb] = { .c = 0x52, .l = 7 }, - [0xdc] = { .c = 0x53, .l = 7 }, - [0xdd] = { .c = 0x53, .l = 7 }, - [0xde] = { .c = 0x54, .l = 7 }, - [0xdf] = { .c = 0x54, .l = 7 }, - [0xe0] = { .c = 0x55, .l = 7 }, - [0xe1] = { .c = 0x55, .l = 7 }, - [0xe2] = { .c = 0x56, .l = 7 }, - [0xe3] = { .c = 0x56, .l = 7 }, - [0xe4] = { .c = 0x57, .l = 7 }, - [0xe5] = { .c = 0x57, .l = 7 }, - [0xe6] = { .c = 0x59, .l = 7 }, - [0xe7] = { .c = 0x59, .l = 7 }, - [0xe8] = { .c = 0x6a, .l = 7 }, - [0xe9] = { .c = 0x6a, .l = 7 }, - [0xea] = { .c = 0x6b, .l = 7 }, - [0xeb] = { .c = 0x6b, .l = 7 }, - [0xec] = { .c = 0x71, .l = 7 }, - [0xed] = { .c = 0x71, .l = 7 }, - [0xee] = { .c = 0x76, .l = 7 }, - [0xef] = { .c = 0x76, .l = 7 }, - [0xf0] = { .c = 0x77, .l = 7 }, - [0xf1] = { .c = 0x77, .l = 7 }, - [0xf2] = { .c = 0x78, .l = 7 }, - [0xf3] = { .c = 0x78, .l = 7 }, - [0xf4] = { .c = 0x79, .l = 7 }, - [0xf5] = { .c = 0x79, .l = 7 }, - [0xf6] = { .c = 0x7a, .l = 7 }, - [0xf7] = { .c = 0x7a, .l = 7 }, - [0xf8] = { .c = 0x26, .l = 8 }, - [0xf9] = { .c = 0x2a, .l = 8 }, - [0xfa] = { .c = 0x2c, .l = 8 }, - [0xfb] = { .c = 0x3b, .l = 8 }, - [0xfc] = { .c = 0x58, .l = 8 }, - [0xfd] = { .c = 0x5a, .l = 8 }, +uint8_t rht_bit31_24[256] = { + /* 0x00 */ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + /* 0x08 */ 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + /* 0x10 */ 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, + /* 0x18 */ 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, + /* 0x20 */ 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, + /* 0x28 */ 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, + /* 0x30 */ 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, 0x69, + /* 0x38 */ 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, 0x6f, + /* 0x40 */ 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, + /* 0x48 */ 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, 0x74, + /* 0x50 */ 0x20, 0x20, 0x20, 0x20, + /* 0x54 */ 0x25, 0x25, 0x25, 0x25, + /* 0x58 */ 0x2d, 0x2d, 0x2d, 0x2d, + /* 0x5c */ 0x2e, 0x2e, 0x2e, 0x2e, + /* 0x60 */ 0x2f, 0x2f, 0x2f, 0x2f, + /* 0x64 */ 0x33, 0x33, 0x33, 0x33, + /* 0x68 */ 0x34, 0x34, 0x34, 0x34, + /* 0x6c */ 0x35, 0x35, 0x35, 0x35, + /* 0x70 */ 0x36, 0x36, 0x36, 0x36, + /* 0x74 */ 0x37, 0x37, 0x37, 0x37, + /* 0x78 */ 0x38, 0x38, 0x38, 0x38, + /* 0x7c */ 0x39, 0x39, 0x39, 0x39, + /* 0x80 */ 0x3d, 0x3d, 0x3d, 0x3d, + /* 0x84 */ 0x41, 0x41, 0x41, 0x41, + /* 0x88 */ 0x5f, 0x5f, 0x5f, 0x5f, + /* 0x8c */ 0x62, 0x62, 0x62, 0x62, + /* 0x90 */ 0x64, 0x64, 0x64, 0x64, + /* 0x94 */ 0x66, 0x66, 0x66, 0x66, + /* 0x98 */ 0x67, 0x67, 0x67, 0x67, + /* 0x9c */ 0x68, 0x68, 0x68, 0x68, + /* 0xa0 */ 0x6c, 0x6c, 0x6c, 0x6c, + /* 0xa4 */ 0x6d, 0x6d, 0x6d, 0x6d, + /* 0xa8 */ 0x6e, 0x6e, 0x6e, 0x6e, + /* 0xac */ 0x70, 0x70, 0x70, 0x70, + /* 0xb0 */ 0x72, 0x72, 0x72, 0x72, + /* 0xb4 */ 0x75, 0x75, 0x75, 0x75, + /* 0xb8 */ 0x3a, 0x3a, + /* 0xba */ 0x42, 0x42, + /* 0xbc */ 0x43, 0x43, + /* 0xbe */ 0x44, 0x44, + /* 0xc0 */ 0x45, 0x45, + /* 0xc2 */ 0x46, 0x46, + /* 0xc4 */ 0x47, 0x47, + /* 0xc6 */ 0x48, 0x48, + /* 0xc8 */ 0x49, 0x49, + /* 0xca */ 0x4a, 0x4a, + /* 0xcc */ 0x4b, 0x4b, + /* 0xce */ 0x4c, 0x4c, + /* 0xd0 */ 0x4d, 0x4d, + /* 0xd2 */ 0x4e, 0x4e, + /* 0xd4 */ 0x4f, 0x4f, + /* 0xd6 */ 0x50, 0x50, + /* 0xd8 */ 0x51, 0x51, + /* 0xda */ 0x52, 0x52, + /* 0xdc */ 0x53, 0x53, + /* 0xde */ 0x54, 0x54, + /* 0xe0 */ 0x55, 0x55, + /* 0xe2 */ 0x56, 0x56, + /* 0xe4 */ 0x57, 0x57, + /* 0xe6 */ 0x59, 0x59, + /* 0xe8 */ 0x6a, 0x6a, + /* 0xea */ 0x6b, 0x6b, + /* 0xec */ 0x71, 0x71, + /* 0xee */ 0x76, 0x76, + /* 0xf0 */ 0x77, 0x77, + /* 0xf2 */ 0x78, 0x78, + /* 0xf4 */ 0x79, 0x79, + /* 0xf6 */ 0x7a, 0x7a, + /* 0xf8 */ 0x26, + /* 0xf9 */ 0x2a, + /* 0xfa */ 0x2c, + /* 0xfb */ 0x3b, + /* 0xfc */ 0x58, + /* 0xfd */ 0x5a, }; -struct rht rht_bit24_17[256] = { - [0x00] = { .c = 0x21, .l = 10 }, - [0x01] = { .c = 0x21, .l = 10 }, - [0x02] = { .c = 0x21, .l = 10 }, - [0x03] = { .c = 0x21, .l = 10 }, - [0x04] = { .c = 0x21, .l = 10 }, - [0x05] = { .c = 0x21, .l = 10 }, - [0x06] = { .c = 0x21, .l = 10 }, - [0x07] = { .c = 0x21, .l = 10 }, - [0x08] = { .c = 0x21, .l = 10 }, - [0x09] = { .c = 0x21, .l = 10 }, - [0x0a] = { .c = 0x21, .l = 10 }, - [0x0b] = { .c = 0x21, .l = 10 }, - [0x0c] = { .c = 0x21, .l = 10 }, - [0x0d] = { .c = 0x21, .l = 10 }, - [0x0e] = { .c = 0x21, .l = 10 }, - [0x0f] = { .c = 0x21, .l = 10 }, - [0x10] = { .c = 0x21, .l = 10 }, - [0x11] = { .c = 0x21, .l = 10 }, - [0x12] = { .c = 0x21, .l = 10 }, - [0x13] = { .c = 0x21, .l = 10 }, - [0x14] = { .c = 0x21, .l = 10 }, - [0x15] = { .c = 0x21, .l = 10 }, - [0x16] = { .c = 0x21, .l = 10 }, - [0x17] = { .c = 0x21, .l = 10 }, - [0x18] = { .c = 0x21, .l = 10 }, - [0x19] = { .c = 0x21, .l = 10 }, - [0x1a] = { .c = 0x21, .l = 10 }, - [0x1b] = { .c = 0x21, .l = 10 }, - [0x1c] = { .c = 0x21, .l = 10 }, - [0x1d] = { .c = 0x21, .l = 10 }, - [0x1e] = { .c = 0x21, .l = 10 }, - [0x1f] = { .c = 0x21, .l = 10 }, - [0x20] = { .c = 0x22, .l = 10 }, - [0x21] = { .c = 0x22, .l = 10 }, - [0x22] = { .c = 0x22, .l = 10 }, - [0x23] = { .c = 0x22, .l = 10 }, - [0x24] = { .c = 0x22, .l = 10 }, - [0x25] = { .c = 0x22, .l = 10 }, - [0x26] = { .c = 0x22, .l = 10 }, - [0x27] = { .c = 0x22, .l = 10 }, - [0x28] = { .c = 0x22, .l = 10 }, - [0x29] = { .c = 0x22, .l = 10 }, - [0x2a] = { .c = 0x22, .l = 10 }, - [0x2b] = { .c = 0x22, .l = 10 }, - [0x2c] = { .c = 0x22, .l = 10 }, - [0x2d] = { .c = 0x22, .l = 10 }, - [0x2e] = { .c = 0x22, .l = 10 }, - [0x2f] = { .c = 0x22, .l = 10 }, - [0x30] = { .c = 0x22, .l = 10 }, - [0x31] = { .c = 0x22, .l = 10 }, - [0x32] = { .c = 0x22, .l = 10 }, - [0x33] = { .c = 0x22, .l = 10 }, - [0x34] = { .c = 0x22, .l = 10 }, - [0x35] = { .c = 0x22, .l = 10 }, - [0x36] = { .c = 0x22, .l = 10 }, - [0x37] = { .c = 0x22, .l = 10 }, - [0x38] = { .c = 0x22, .l = 10 }, - [0x39] = { .c = 0x22, .l = 10 }, - [0x3a] = { .c = 0x22, .l = 10 }, - [0x3b] = { .c = 0x22, .l = 10 }, - [0x3c] = { .c = 0x22, .l = 10 }, - [0x3d] = { .c = 0x22, .l = 10 }, - [0x3e] = { .c = 0x22, .l = 10 }, - [0x3f] = { .c = 0x22, .l = 10 }, - [0x40] = { .c = 0x28, .l = 10 }, - [0x41] = { .c = 0x28, .l = 10 }, - [0x42] = { .c = 0x28, .l = 10 }, - [0x43] = { .c = 0x28, .l = 10 }, - [0x44] = { .c = 0x28, .l = 10 }, - [0x45] = { .c = 0x28, .l = 10 }, - [0x46] = { .c = 0x28, .l = 10 }, - [0x47] = { .c = 0x28, .l = 10 }, - [0x48] = { .c = 0x28, .l = 10 }, - [0x49] = { .c = 0x28, .l = 10 }, - [0x4a] = { .c = 0x28, .l = 10 }, - [0x4b] = { .c = 0x28, .l = 10 }, - [0x4c] = { .c = 0x28, .l = 10 }, - [0x4d] = { .c = 0x28, .l = 10 }, - [0x4e] = { .c = 0x28, .l = 10 }, - [0x4f] = { .c = 0x28, .l = 10 }, - [0x50] = { .c = 0x28, .l = 10 }, - [0x51] = { .c = 0x28, .l = 10 }, - [0x52] = { .c = 0x28, .l = 10 }, - [0x53] = { .c = 0x28, .l = 10 }, - [0x54] = { .c = 0x28, .l = 10 }, - [0x55] = { .c = 0x28, .l = 10 }, - [0x56] = { .c = 0x28, .l = 10 }, - [0x57] = { .c = 0x28, .l = 10 }, - [0x58] = { .c = 0x28, .l = 10 }, - [0x59] = { .c = 0x28, .l = 10 }, - [0x5a] = { .c = 0x28, .l = 10 }, - [0x5b] = { .c = 0x28, .l = 10 }, - [0x5c] = { .c = 0x28, .l = 10 }, - [0x5d] = { .c = 0x28, .l = 10 }, - [0x5e] = { .c = 0x28, .l = 10 }, - [0x5f] = { .c = 0x28, .l = 10 }, - [0x60] = { .c = 0x29, .l = 10 }, - [0x61] = { .c = 0x29, .l = 10 }, - [0x62] = { .c = 0x29, .l = 10 }, - [0x63] = { .c = 0x29, .l = 10 }, - [0x64] = { .c = 0x29, .l = 10 }, - [0x65] = { .c = 0x29, .l = 10 }, - [0x66] = { .c = 0x29, .l = 10 }, - [0x67] = { .c = 0x29, .l = 10 }, - [0x68] = { .c = 0x29, .l = 10 }, - [0x69] = { .c = 0x29, .l = 10 }, - [0x6a] = { .c = 0x29, .l = 10 }, - [0x6b] = { .c = 0x29, .l = 10 }, - [0x6c] = { .c = 0x29, .l = 10 }, - [0x6d] = { .c = 0x29, .l = 10 }, - [0x6e] = { .c = 0x29, .l = 10 }, - [0x6f] = { .c = 0x29, .l = 10 }, - [0x70] = { .c = 0x29, .l = 10 }, - [0x71] = { .c = 0x29, .l = 10 }, - [0x72] = { .c = 0x29, .l = 10 }, - [0x73] = { .c = 0x29, .l = 10 }, - [0x74] = { .c = 0x29, .l = 10 }, - [0x75] = { .c = 0x29, .l = 10 }, - [0x76] = { .c = 0x29, .l = 10 }, - [0x77] = { .c = 0x29, .l = 10 }, - [0x78] = { .c = 0x29, .l = 10 }, - [0x79] = { .c = 0x29, .l = 10 }, - [0x7a] = { .c = 0x29, .l = 10 }, - [0x7b] = { .c = 0x29, .l = 10 }, - [0x7c] = { .c = 0x29, .l = 10 }, - [0x7d] = { .c = 0x29, .l = 10 }, - [0x7e] = { .c = 0x29, .l = 10 }, - [0x7f] = { .c = 0x29, .l = 10 }, - [0x80] = { .c = 0x3f, .l = 10 }, - [0x81] = { .c = 0x3f, .l = 10 }, - [0x82] = { .c = 0x3f, .l = 10 }, - [0x83] = { .c = 0x3f, .l = 10 }, - [0x84] = { .c = 0x3f, .l = 10 }, - [0x85] = { .c = 0x3f, .l = 10 }, - [0x86] = { .c = 0x3f, .l = 10 }, - [0x87] = { .c = 0x3f, .l = 10 }, - [0x88] = { .c = 0x3f, .l = 10 }, - [0x89] = { .c = 0x3f, .l = 10 }, - [0x8a] = { .c = 0x3f, .l = 10 }, - [0x8b] = { .c = 0x3f, .l = 10 }, - [0x8c] = { .c = 0x3f, .l = 10 }, - [0x8d] = { .c = 0x3f, .l = 10 }, - [0x8e] = { .c = 0x3f, .l = 10 }, - [0x8f] = { .c = 0x3f, .l = 10 }, - [0x90] = { .c = 0x3f, .l = 10 }, - [0x91] = { .c = 0x3f, .l = 10 }, - [0x92] = { .c = 0x3f, .l = 10 }, - [0x93] = { .c = 0x3f, .l = 10 }, - [0x94] = { .c = 0x3f, .l = 10 }, - [0x95] = { .c = 0x3f, .l = 10 }, - [0x96] = { .c = 0x3f, .l = 10 }, - [0x97] = { .c = 0x3f, .l = 10 }, - [0x98] = { .c = 0x3f, .l = 10 }, - [0x99] = { .c = 0x3f, .l = 10 }, - [0x9a] = { .c = 0x3f, .l = 10 }, - [0x9b] = { .c = 0x3f, .l = 10 }, - [0x9c] = { .c = 0x3f, .l = 10 }, - [0x9d] = { .c = 0x3f, .l = 10 }, - [0x9e] = { .c = 0x3f, .l = 10 }, - [0x9f] = { .c = 0x3f, .l = 10 }, - [0xa0] = { .c = 0x27, .l = 11 }, - [0xa1] = { .c = 0x27, .l = 11 }, - [0xa2] = { .c = 0x27, .l = 11 }, - [0xa3] = { .c = 0x27, .l = 11 }, - [0xa4] = { .c = 0x27, .l = 11 }, - [0xa5] = { .c = 0x27, .l = 11 }, - [0xa6] = { .c = 0x27, .l = 11 }, - [0xa7] = { .c = 0x27, .l = 11 }, - [0xa8] = { .c = 0x27, .l = 11 }, - [0xa9] = { .c = 0x27, .l = 11 }, - [0xaa] = { .c = 0x27, .l = 11 }, - [0xab] = { .c = 0x27, .l = 11 }, - [0xac] = { .c = 0x27, .l = 11 }, - [0xad] = { .c = 0x27, .l = 11 }, - [0xae] = { .c = 0x27, .l = 11 }, - [0xaf] = { .c = 0x27, .l = 11 }, - [0xb0] = { .c = 0x2b, .l = 11 }, - [0xb1] = { .c = 0x2b, .l = 11 }, - [0xb2] = { .c = 0x2b, .l = 11 }, - [0xb3] = { .c = 0x2b, .l = 11 }, - [0xb4] = { .c = 0x2b, .l = 11 }, - [0xb5] = { .c = 0x2b, .l = 11 }, - [0xb6] = { .c = 0x2b, .l = 11 }, - [0xb7] = { .c = 0x2b, .l = 11 }, - [0xb8] = { .c = 0x2b, .l = 11 }, - [0xb9] = { .c = 0x2b, .l = 11 }, - [0xba] = { .c = 0x2b, .l = 11 }, - [0xbb] = { .c = 0x2b, .l = 11 }, - [0xbc] = { .c = 0x2b, .l = 11 }, - [0xbd] = { .c = 0x2b, .l = 11 }, - [0xbe] = { .c = 0x2b, .l = 11 }, - [0xbf] = { .c = 0x2b, .l = 11 }, - [0xc0] = { .c = 0x7c, .l = 11 }, - [0xc1] = { .c = 0x7c, .l = 11 }, - [0xc2] = { .c = 0x7c, .l = 11 }, - [0xc3] = { .c = 0x7c, .l = 11 }, - [0xc4] = { .c = 0x7c, .l = 11 }, - [0xc5] = { .c = 0x7c, .l = 11 }, - [0xc6] = { .c = 0x7c, .l = 11 }, - [0xc7] = { .c = 0x7c, .l = 11 }, - [0xc8] = { .c = 0x7c, .l = 11 }, - [0xc9] = { .c = 0x7c, .l = 11 }, - [0xca] = { .c = 0x7c, .l = 11 }, - [0xcb] = { .c = 0x7c, .l = 11 }, - [0xcc] = { .c = 0x7c, .l = 11 }, - [0xcd] = { .c = 0x7c, .l = 11 }, - [0xce] = { .c = 0x7c, .l = 11 }, - [0xcf] = { .c = 0x7c, .l = 11 }, - [0xd0] = { .c = 0x23, .l = 12 }, - [0xd1] = { .c = 0x23, .l = 12 }, - [0xd2] = { .c = 0x23, .l = 12 }, - [0xd3] = { .c = 0x23, .l = 12 }, - [0xd4] = { .c = 0x23, .l = 12 }, - [0xd5] = { .c = 0x23, .l = 12 }, - [0xd6] = { .c = 0x23, .l = 12 }, - [0xd7] = { .c = 0x23, .l = 12 }, - [0xd8] = { .c = 0x3e, .l = 12 }, - [0xd9] = { .c = 0x3e, .l = 12 }, - [0xda] = { .c = 0x3e, .l = 12 }, - [0xdb] = { .c = 0x3e, .l = 12 }, - [0xdc] = { .c = 0x3e, .l = 12 }, - [0xdd] = { .c = 0x3e, .l = 12 }, - [0xde] = { .c = 0x3e, .l = 12 }, - [0xdf] = { .c = 0x3e, .l = 12 }, - [0xe0] = { .c = 0x00, .l = 13 }, - [0xe1] = { .c = 0x00, .l = 13 }, - [0xe2] = { .c = 0x00, .l = 13 }, - [0xe3] = { .c = 0x00, .l = 13 }, - [0xe4] = { .c = 0x24, .l = 13 }, - [0xe5] = { .c = 0x24, .l = 13 }, - [0xe6] = { .c = 0x24, .l = 13 }, - [0xe7] = { .c = 0x24, .l = 13 }, - [0xe8] = { .c = 0x40, .l = 13 }, - [0xe9] = { .c = 0x40, .l = 13 }, - [0xea] = { .c = 0x40, .l = 13 }, - [0xeb] = { .c = 0x40, .l = 13 }, - [0xec] = { .c = 0x5b, .l = 13 }, - [0xed] = { .c = 0x5b, .l = 13 }, - [0xee] = { .c = 0x5b, .l = 13 }, - [0xef] = { .c = 0x5b, .l = 13 }, - [0xf0] = { .c = 0x5d, .l = 13 }, - [0xf1] = { .c = 0x5d, .l = 13 }, - [0xf2] = { .c = 0x5d, .l = 13 }, - [0xf3] = { .c = 0x5d, .l = 13 }, - [0xf4] = { .c = 0x7e, .l = 13 }, - [0xf5] = { .c = 0x7e, .l = 13 }, - [0xf6] = { .c = 0x7e, .l = 13 }, - [0xf7] = { .c = 0x7e, .l = 13 }, - [0xf8] = { .c = 0x5e, .l = 14 }, - [0xf9] = { .c = 0x5e, .l = 14 }, - [0xfa] = { .c = 0x7d, .l = 14 }, - [0xfb] = { .c = 0x7d, .l = 14 }, - [0xfc] = { .c = 0x3c, .l = 15 }, - [0xfd] = { .c = 0x60, .l = 15 }, - [0xfe] = { .c = 0x7b, .l = 15 }, +uint8_t rht_bit24_17[256] = { + /* 0x00 */ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + /* 0x10 */ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, + /* 0x20 */ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + /* 0x30 */ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + /* 0x40 */ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + /* 0x50 */ 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + /* 0x60 */ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, + /* 0x70 */ 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, + /* 0x80 */ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + /* 0x90 */ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, + /* 0xa0 */ 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + /* 0xb0 */ 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, + /* 0xc0 */ 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, + /* 0xd0 */ 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, + /* 0xd8 */ 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, + /* 0xe0 */ 0x00, 0x00, 0x00, 0x00, + /* 0xe4 */ 0x24, 0x24, 0x24, 0x24, + /* 0xe8 */ 0x40, 0x40, 0x40, 0x40, + /* 0xec */ 0x5b, 0x5b, 0x5b, 0x5b, + /* 0xf0 */ 0x5d, 0x5d, 0x5d, 0x5d, + /* 0xf4 */ 0x7e, 0x7e, 0x7e, 0x7e, + /* 0xf8 */ 0x5e, 0x5e, + /* 0xfa */ 0x7d, 0x7d, + /* 0xfc */ 0x3c, + /* 0xfd */ 0x60, + /* 0xfe */ 0x7b, }; -struct rht rht_bit15_11_fe[32] = { - [0x00] = { .c = 0x5c, .l = 19 }, - [0x01] = { .c = 0x5c, .l = 19 }, - [0x02] = { .c = 0x5c, .l = 19 }, - [0x03] = { .c = 0x5c, .l = 19 }, - [0x04] = { .c = 0xc3, .l = 19 }, - [0x05] = { .c = 0xc3, .l = 19 }, - [0x06] = { .c = 0xc3, .l = 19 }, - [0x07] = { .c = 0xc3, .l = 19 }, - [0x08] = { .c = 0xd0, .l = 19 }, - [0x09] = { .c = 0xd0, .l = 19 }, - [0x0a] = { .c = 0xd0, .l = 19 }, - [0x0b] = { .c = 0xd0, .l = 19 }, - [0x0c] = { .c = 0x80, .l = 20 }, - [0x0d] = { .c = 0x80, .l = 20 }, - [0x0e] = { .c = 0x82, .l = 20 }, - [0x0f] = { .c = 0x82, .l = 20 }, - [0x10] = { .c = 0x83, .l = 20 }, - [0x11] = { .c = 0x83, .l = 20 }, - [0x12] = { .c = 0xa2, .l = 20 }, - [0x13] = { .c = 0xa2, .l = 20 }, - [0x14] = { .c = 0xb8, .l = 20 }, - [0x15] = { .c = 0xb8, .l = 20 }, - [0x16] = { .c = 0xc2, .l = 20 }, - [0x17] = { .c = 0xc2, .l = 20 }, - [0x18] = { .c = 0xe0, .l = 20 }, - [0x19] = { .c = 0xe0, .l = 20 }, - [0x1a] = { .c = 0xe2, .l = 20 }, - [0x1b] = { .c = 0xe2, .l = 20 }, - [0x1c] = { .c = 0x99, .l = 21 }, - [0x1d] = { .c = 0xa1, .l = 21 }, - [0x1e] = { .c = 0xa7, .l = 21 }, - [0x1f] = { .c = 0xac, .l = 21 }, +uint8_t rht_bit15_8[256] = { + /* 0x00 */ 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + /* 0x08 */ 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, 0xb1, + /* 0x10 */ 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, 0xb3, + /* 0x18 */ 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + /* 0x20 */ 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, + /* 0x28 */ 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, 0xd9, + /* 0x30 */ 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + /* 0x38 */ 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, 0xe5, + /* 0x40 */ 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, 0xe6, + /* 0x48 */ 0x81, 0x81, 0x81, 0x81, + /* 0x4c */ 0x84, 0x84, 0x84, 0x84, + /* 0x50 */ 0x85, 0x85, 0x85, 0x85, + /* 0x54 */ 0x86, 0x86, 0x86, 0x86, + /* 0x58 */ 0x88, 0x88, 0x88, 0x88, + /* 0x5c */ 0x92, 0x92, 0x92, 0x92, + /* 0x60 */ 0x9a, 0x9a, 0x9a, 0x9a, + /* 0x64 */ 0x9c, 0x9c, 0x9c, 0x9c, + /* 0x68 */ 0xa0, 0xa0, 0xa0, 0xa0, + /* 0x6c */ 0xa3, 0xa3, 0xa3, 0xa3, + /* 0x70 */ 0xa4, 0xa4, 0xa4, 0xa4, + /* 0x74 */ 0xa9, 0xa9, 0xa9, 0xa9, + /* 0x78 */ 0xaa, 0xaa, 0xaa, 0xaa, + /* 0x7c */ 0xad, 0xad, 0xad, 0xad, + /* 0x80 */ 0xb2, 0xb2, 0xb2, 0xb2, + /* 0x84 */ 0xb5, 0xb5, 0xb5, 0xb5, + /* 0x88 */ 0xb9, 0xb9, 0xb9, 0xb9, + /* 0x8c */ 0xba, 0xba, 0xba, 0xba, + /* 0x90 */ 0xbb, 0xbb, 0xbb, 0xbb, + /* 0x94 */ 0xbd, 0xbd, 0xbd, 0xbd, + /* 0x98 */ 0xbe, 0xbe, 0xbe, 0xbe, + /* 0x9c */ 0xc4, 0xc4, 0xc4, 0xc4, + /* 0xa0 */ 0xc6, 0xc6, 0xc6, 0xc6, + /* 0xa4 */ 0xe4, 0xe4, 0xe4, 0xe4, + /* 0xa8 */ 0xe8, 0xe8, 0xe8, 0xe8, + /* 0xac */ 0xe9, 0xe9, 0xe9, 0xe9, + /* 0xb0 */ 0x01, 0x01, + /* 0xb2 */ 0x87, 0x87, + /* 0xb4 */ 0x89, 0x89, + /* 0xb6 */ 0x8a, 0x8a, + /* 0xb8 */ 0x8b, 0x8b, + /* 0xba */ 0x8c, 0x8c, + /* 0xbc */ 0x8d, 0x8d, + /* 0xbe */ 0x8f, 0x8f, + /* 0xc0 */ 0x93, 0x93, + /* 0xc2 */ 0x95, 0x95, + /* 0xc4 */ 0x96, 0x96, + /* 0xc6 */ 0x97, 0x97, + /* 0xc8 */ 0x98, 0x98, + /* 0xca */ 0x9b, 0x9b, + /* 0xcc */ 0x9d, 0x9d, + /* 0xce */ 0x9e, 0x9e, + /* 0xd0 */ 0xa5, 0xa5, + /* 0xd2 */ 0xa6, 0xa6, + /* 0xd4 */ 0xa8, 0xa8, + /* 0xd6 */ 0xae, 0xae, + /* 0xd8 */ 0xaf, 0xaf, + /* 0xda */ 0xb4, 0xb4, + /* 0xdc */ 0xb6, 0xb6, + /* 0xde */ 0xb7, 0xb7, + /* 0xe0 */ 0xbc, 0xbc, + /* 0xe2 */ 0xbf, 0xbf, + /* 0xe4 */ 0xc5, 0xc5, + /* 0xe6 */ 0xe7, 0xe7, + /* 0xe8 */ 0xef, 0xef, + /* 0xea */ 0x09, + /* 0xeb */ 0x8e, + /* 0xec */ 0x90, + /* 0xed */ 0x91, + /* 0xee */ 0x94, + /* 0xef */ 0x9f, + /* 0xf0 */ 0xab, + /* 0xf1 */ 0xce, + /* 0xf2 */ 0xd7, + /* 0xf3 */ 0xe1, + /* 0xf4 */ 0xec, + /* 0xf5 */ 0xed, }; -struct rht rht_bit15_8[256] = { - [0x00] = { .c = 0xb0, .l = 21 }, - [0x01] = { .c = 0xb0, .l = 21 }, - [0x02] = { .c = 0xb0, .l = 21 }, - [0x03] = { .c = 0xb0, .l = 21 }, - [0x04] = { .c = 0xb0, .l = 21 }, - [0x05] = { .c = 0xb0, .l = 21 }, - [0x06] = { .c = 0xb0, .l = 21 }, - [0x07] = { .c = 0xb0, .l = 21 }, - [0x08] = { .c = 0xb1, .l = 21 }, - [0x09] = { .c = 0xb1, .l = 21 }, - [0x0a] = { .c = 0xb1, .l = 21 }, - [0x0b] = { .c = 0xb1, .l = 21 }, - [0x0c] = { .c = 0xb1, .l = 21 }, - [0x0d] = { .c = 0xb1, .l = 21 }, - [0x0e] = { .c = 0xb1, .l = 21 }, - [0x0f] = { .c = 0xb1, .l = 21 }, - [0x10] = { .c = 0xb3, .l = 21 }, - [0x11] = { .c = 0xb3, .l = 21 }, - [0x12] = { .c = 0xb3, .l = 21 }, - [0x13] = { .c = 0xb3, .l = 21 }, - [0x14] = { .c = 0xb3, .l = 21 }, - [0x15] = { .c = 0xb3, .l = 21 }, - [0x16] = { .c = 0xb3, .l = 21 }, - [0x17] = { .c = 0xb3, .l = 21 }, - [0x18] = { .c = 0xd1, .l = 21 }, - [0x19] = { .c = 0xd1, .l = 21 }, - [0x1a] = { .c = 0xd1, .l = 21 }, - [0x1b] = { .c = 0xd1, .l = 21 }, - [0x1c] = { .c = 0xd1, .l = 21 }, - [0x1d] = { .c = 0xd1, .l = 21 }, - [0x1e] = { .c = 0xd1, .l = 21 }, - [0x1f] = { .c = 0xd1, .l = 21 }, - [0x20] = { .c = 0xd8, .l = 21 }, - [0x21] = { .c = 0xd8, .l = 21 }, - [0x22] = { .c = 0xd8, .l = 21 }, - [0x23] = { .c = 0xd8, .l = 21 }, - [0x24] = { .c = 0xd8, .l = 21 }, - [0x25] = { .c = 0xd8, .l = 21 }, - [0x26] = { .c = 0xd8, .l = 21 }, - [0x27] = { .c = 0xd8, .l = 21 }, - [0x28] = { .c = 0xd9, .l = 21 }, - [0x29] = { .c = 0xd9, .l = 21 }, - [0x2a] = { .c = 0xd9, .l = 21 }, - [0x2b] = { .c = 0xd9, .l = 21 }, - [0x2c] = { .c = 0xd9, .l = 21 }, - [0x2d] = { .c = 0xd9, .l = 21 }, - [0x2e] = { .c = 0xd9, .l = 21 }, - [0x2f] = { .c = 0xd9, .l = 21 }, - [0x30] = { .c = 0xe3, .l = 21 }, - [0x31] = { .c = 0xe3, .l = 21 }, - [0x32] = { .c = 0xe3, .l = 21 }, - [0x33] = { .c = 0xe3, .l = 21 }, - [0x34] = { .c = 0xe3, .l = 21 }, - [0x35] = { .c = 0xe3, .l = 21 }, - [0x36] = { .c = 0xe3, .l = 21 }, - [0x37] = { .c = 0xe3, .l = 21 }, - [0x38] = { .c = 0xe5, .l = 21 }, - [0x39] = { .c = 0xe5, .l = 21 }, - [0x3a] = { .c = 0xe5, .l = 21 }, - [0x3b] = { .c = 0xe5, .l = 21 }, - [0x3c] = { .c = 0xe5, .l = 21 }, - [0x3d] = { .c = 0xe5, .l = 21 }, - [0x3e] = { .c = 0xe5, .l = 21 }, - [0x3f] = { .c = 0xe5, .l = 21 }, - [0x40] = { .c = 0xe6, .l = 21 }, - [0x41] = { .c = 0xe6, .l = 21 }, - [0x42] = { .c = 0xe6, .l = 21 }, - [0x43] = { .c = 0xe6, .l = 21 }, - [0x44] = { .c = 0xe6, .l = 21 }, - [0x45] = { .c = 0xe6, .l = 21 }, - [0x46] = { .c = 0xe6, .l = 21 }, - [0x47] = { .c = 0xe6, .l = 21 }, - [0x48] = { .c = 0x81, .l = 22 }, - [0x49] = { .c = 0x81, .l = 22 }, - [0x4a] = { .c = 0x81, .l = 22 }, - [0x4b] = { .c = 0x81, .l = 22 }, - [0x4c] = { .c = 0x84, .l = 22 }, - [0x4d] = { .c = 0x84, .l = 22 }, - [0x4e] = { .c = 0x84, .l = 22 }, - [0x4f] = { .c = 0x84, .l = 22 }, - [0x50] = { .c = 0x85, .l = 22 }, - [0x51] = { .c = 0x85, .l = 22 }, - [0x52] = { .c = 0x85, .l = 22 }, - [0x53] = { .c = 0x85, .l = 22 }, - [0x54] = { .c = 0x86, .l = 22 }, - [0x55] = { .c = 0x86, .l = 22 }, - [0x56] = { .c = 0x86, .l = 22 }, - [0x57] = { .c = 0x86, .l = 22 }, - [0x58] = { .c = 0x88, .l = 22 }, - [0x59] = { .c = 0x88, .l = 22 }, - [0x5a] = { .c = 0x88, .l = 22 }, - [0x5b] = { .c = 0x88, .l = 22 }, - [0x5c] = { .c = 0x92, .l = 22 }, - [0x5d] = { .c = 0x92, .l = 22 }, - [0x5e] = { .c = 0x92, .l = 22 }, - [0x5f] = { .c = 0x92, .l = 22 }, - [0x60] = { .c = 0x9a, .l = 22 }, - [0x61] = { .c = 0x9a, .l = 22 }, - [0x62] = { .c = 0x9a, .l = 22 }, - [0x63] = { .c = 0x9a, .l = 22 }, - [0x64] = { .c = 0x9c, .l = 22 }, - [0x65] = { .c = 0x9c, .l = 22 }, - [0x66] = { .c = 0x9c, .l = 22 }, - [0x67] = { .c = 0x9c, .l = 22 }, - [0x68] = { .c = 0xa0, .l = 22 }, - [0x69] = { .c = 0xa0, .l = 22 }, - [0x6a] = { .c = 0xa0, .l = 22 }, - [0x6b] = { .c = 0xa0, .l = 22 }, - [0x6c] = { .c = 0xa3, .l = 22 }, - [0x6d] = { .c = 0xa3, .l = 22 }, - [0x6e] = { .c = 0xa3, .l = 22 }, - [0x6f] = { .c = 0xa3, .l = 22 }, - [0x70] = { .c = 0xa4, .l = 22 }, - [0x71] = { .c = 0xa4, .l = 22 }, - [0x72] = { .c = 0xa4, .l = 22 }, - [0x73] = { .c = 0xa4, .l = 22 }, - [0x74] = { .c = 0xa9, .l = 22 }, - [0x75] = { .c = 0xa9, .l = 22 }, - [0x76] = { .c = 0xa9, .l = 22 }, - [0x77] = { .c = 0xa9, .l = 22 }, - [0x78] = { .c = 0xaa, .l = 22 }, - [0x79] = { .c = 0xaa, .l = 22 }, - [0x7a] = { .c = 0xaa, .l = 22 }, - [0x7b] = { .c = 0xaa, .l = 22 }, - [0x7c] = { .c = 0xad, .l = 22 }, - [0x7d] = { .c = 0xad, .l = 22 }, - [0x7e] = { .c = 0xad, .l = 22 }, - [0x7f] = { .c = 0xad, .l = 22 }, - [0x80] = { .c = 0xb2, .l = 22 }, - [0x81] = { .c = 0xb2, .l = 22 }, - [0x82] = { .c = 0xb2, .l = 22 }, - [0x83] = { .c = 0xb2, .l = 22 }, - [0x84] = { .c = 0xb5, .l = 22 }, - [0x85] = { .c = 0xb5, .l = 22 }, - [0x86] = { .c = 0xb5, .l = 22 }, - [0x87] = { .c = 0xb5, .l = 22 }, - [0x88] = { .c = 0xb9, .l = 22 }, - [0x89] = { .c = 0xb9, .l = 22 }, - [0x8a] = { .c = 0xb9, .l = 22 }, - [0x8b] = { .c = 0xb9, .l = 22 }, - [0x8c] = { .c = 0xba, .l = 22 }, - [0x8d] = { .c = 0xba, .l = 22 }, - [0x8e] = { .c = 0xba, .l = 22 }, - [0x8f] = { .c = 0xba, .l = 22 }, - [0x90] = { .c = 0xbb, .l = 22 }, - [0x91] = { .c = 0xbb, .l = 22 }, - [0x92] = { .c = 0xbb, .l = 22 }, - [0x93] = { .c = 0xbb, .l = 22 }, - [0x94] = { .c = 0xbd, .l = 22 }, - [0x95] = { .c = 0xbd, .l = 22 }, - [0x96] = { .c = 0xbd, .l = 22 }, - [0x97] = { .c = 0xbd, .l = 22 }, - [0x98] = { .c = 0xbe, .l = 22 }, - [0x99] = { .c = 0xbe, .l = 22 }, - [0x9a] = { .c = 0xbe, .l = 22 }, - [0x9b] = { .c = 0xbe, .l = 22 }, - [0x9c] = { .c = 0xc4, .l = 22 }, - [0x9d] = { .c = 0xc4, .l = 22 }, - [0x9e] = { .c = 0xc4, .l = 22 }, - [0x9f] = { .c = 0xc4, .l = 22 }, - [0xa0] = { .c = 0xc6, .l = 22 }, - [0xa1] = { .c = 0xc6, .l = 22 }, - [0xa2] = { .c = 0xc6, .l = 22 }, - [0xa3] = { .c = 0xc6, .l = 22 }, - [0xa4] = { .c = 0xe4, .l = 22 }, - [0xa5] = { .c = 0xe4, .l = 22 }, - [0xa6] = { .c = 0xe4, .l = 22 }, - [0xa7] = { .c = 0xe4, .l = 22 }, - [0xa8] = { .c = 0xe8, .l = 22 }, - [0xa9] = { .c = 0xe8, .l = 22 }, - [0xaa] = { .c = 0xe8, .l = 22 }, - [0xab] = { .c = 0xe8, .l = 22 }, - [0xac] = { .c = 0xe9, .l = 22 }, - [0xad] = { .c = 0xe9, .l = 22 }, - [0xae] = { .c = 0xe9, .l = 22 }, - [0xaf] = { .c = 0xe9, .l = 22 }, - [0xb0] = { .c = 0x01, .l = 23 }, - [0xb1] = { .c = 0x01, .l = 23 }, - [0xb2] = { .c = 0x87, .l = 23 }, - [0xb3] = { .c = 0x87, .l = 23 }, - [0xb4] = { .c = 0x89, .l = 23 }, - [0xb5] = { .c = 0x89, .l = 23 }, - [0xb6] = { .c = 0x8a, .l = 23 }, - [0xb7] = { .c = 0x8a, .l = 23 }, - [0xb8] = { .c = 0x8b, .l = 23 }, - [0xb9] = { .c = 0x8b, .l = 23 }, - [0xba] = { .c = 0x8c, .l = 23 }, - [0xbb] = { .c = 0x8c, .l = 23 }, - [0xbc] = { .c = 0x8d, .l = 23 }, - [0xbd] = { .c = 0x8d, .l = 23 }, - [0xbe] = { .c = 0x8f, .l = 23 }, - [0xbf] = { .c = 0x8f, .l = 23 }, - [0xc0] = { .c = 0x93, .l = 23 }, - [0xc1] = { .c = 0x93, .l = 23 }, - [0xc2] = { .c = 0x95, .l = 23 }, - [0xc3] = { .c = 0x95, .l = 23 }, - [0xc4] = { .c = 0x96, .l = 23 }, - [0xc5] = { .c = 0x96, .l = 23 }, - [0xc6] = { .c = 0x97, .l = 23 }, - [0xc7] = { .c = 0x97, .l = 23 }, - [0xc8] = { .c = 0x98, .l = 23 }, - [0xc9] = { .c = 0x98, .l = 23 }, - [0xca] = { .c = 0x9b, .l = 23 }, - [0xcb] = { .c = 0x9b, .l = 23 }, - [0xcc] = { .c = 0x9d, .l = 23 }, - [0xcd] = { .c = 0x9d, .l = 23 }, - [0xce] = { .c = 0x9e, .l = 23 }, - [0xcf] = { .c = 0x9e, .l = 23 }, - [0xd0] = { .c = 0xa5, .l = 23 }, - [0xd1] = { .c = 0xa5, .l = 23 }, - [0xd2] = { .c = 0xa6, .l = 23 }, - [0xd3] = { .c = 0xa6, .l = 23 }, - [0xd4] = { .c = 0xa8, .l = 23 }, - [0xd5] = { .c = 0xa8, .l = 23 }, - [0xd6] = { .c = 0xae, .l = 23 }, - [0xd7] = { .c = 0xae, .l = 23 }, - [0xd8] = { .c = 0xaf, .l = 23 }, - [0xd9] = { .c = 0xaf, .l = 23 }, - [0xda] = { .c = 0xb4, .l = 23 }, - [0xdb] = { .c = 0xb4, .l = 23 }, - [0xdc] = { .c = 0xb6, .l = 23 }, - [0xdd] = { .c = 0xb6, .l = 23 }, - [0xde] = { .c = 0xb7, .l = 23 }, - [0xdf] = { .c = 0xb7, .l = 23 }, - [0xe0] = { .c = 0xbc, .l = 23 }, - [0xe1] = { .c = 0xbc, .l = 23 }, - [0xe2] = { .c = 0xbf, .l = 23 }, - [0xe3] = { .c = 0xbf, .l = 23 }, - [0xe4] = { .c = 0xc5, .l = 23 }, - [0xe5] = { .c = 0xc5, .l = 23 }, - [0xe6] = { .c = 0xe7, .l = 23 }, - [0xe7] = { .c = 0xe7, .l = 23 }, - [0xe8] = { .c = 0xef, .l = 23 }, - [0xe9] = { .c = 0xef, .l = 23 }, - [0xea] = { .c = 0x09, .l = 24 }, - [0xeb] = { .c = 0x8e, .l = 24 }, - [0xec] = { .c = 0x90, .l = 24 }, - [0xed] = { .c = 0x91, .l = 24 }, - [0xee] = { .c = 0x94, .l = 24 }, - [0xef] = { .c = 0x9f, .l = 24 }, - [0xf0] = { .c = 0xab, .l = 24 }, - [0xf1] = { .c = 0xce, .l = 24 }, - [0xf2] = { .c = 0xd7, .l = 24 }, - [0xf3] = { .c = 0xe1, .l = 24 }, - [0xf4] = { .c = 0xec, .l = 24 }, - [0xf5] = { .c = 0xed, .l = 24 }, -}; +/* below two non-overlapping tables are merged in order to save on L1D: + * - bits 15-11 for values 0x00-0x1f + * - bits 11-4 for values 0x60-0xff + */ +uint8_t rht_bit15_11_11_4[256] = { + /* part used for bits 15-11 (0x00-0x1f) */ + /* 0x00 */ 0x5c, 0x5c, 0x5c, 0x5c, + /* 0x04 */ 0xc3, 0xc3, 0xc3, 0xc3, + /* 0x08 */ 0xd0, 0xd0, 0xd0, 0xd0, + /* 0x0c */ 0x80, 0x80, + /* 0x0e */ 0x82, 0x82, + /* 0x10 */ 0x83, 0x83, + /* 0x12 */ 0xa2, 0xa2, + /* 0x14 */ 0xb8, 0xb8, + /* 0x16 */ 0xc2, 0xc2, + /* 0x18 */ 0xe0, 0xe0, + /* 0x1a */ 0xe2, 0xe2, + /* 0x1c */ 0x99, + /* 0x1d */ 0xa1, + /* 0x1e */ 0xa7, + /* 0x1f */ 0xac, -struct rht rht_bit11_4[256] = { - [0x60] = { .c = 0xc7, .l = 25 }, - [0x61] = { .c = 0xc7, .l = 25 }, - [0x62] = { .c = 0xc7, .l = 25 }, - [0x63] = { .c = 0xc7, .l = 25 }, - [0x64] = { .c = 0xc7, .l = 25 }, - [0x65] = { .c = 0xc7, .l = 25 }, - [0x66] = { .c = 0xc7, .l = 25 }, - [0x67] = { .c = 0xc7, .l = 25 }, - [0x68] = { .c = 0xcf, .l = 25 }, - [0x69] = { .c = 0xcf, .l = 25 }, - [0x6a] = { .c = 0xcf, .l = 25 }, - [0x6b] = { .c = 0xcf, .l = 25 }, - [0x6c] = { .c = 0xcf, .l = 25 }, - [0x6d] = { .c = 0xcf, .l = 25 }, - [0x6e] = { .c = 0xcf, .l = 25 }, - [0x6f] = { .c = 0xcf, .l = 25 }, - [0x70] = { .c = 0xea, .l = 25 }, - [0x71] = { .c = 0xea, .l = 25 }, - [0x72] = { .c = 0xea, .l = 25 }, - [0x73] = { .c = 0xea, .l = 25 }, - [0x74] = { .c = 0xea, .l = 25 }, - [0x75] = { .c = 0xea, .l = 25 }, - [0x76] = { .c = 0xea, .l = 25 }, - [0x77] = { .c = 0xea, .l = 25 }, - [0x78] = { .c = 0xeb, .l = 25 }, - [0x79] = { .c = 0xeb, .l = 25 }, - [0x7a] = { .c = 0xeb, .l = 25 }, - [0x7b] = { .c = 0xeb, .l = 25 }, - [0x7c] = { .c = 0xeb, .l = 25 }, - [0x7d] = { .c = 0xeb, .l = 25 }, - [0x7e] = { .c = 0xeb, .l = 25 }, - [0x7f] = { .c = 0xeb, .l = 25 }, - [0x80] = { .c = 0xc0, .l = 26 }, - [0x81] = { .c = 0xc0, .l = 26 }, - [0x82] = { .c = 0xc0, .l = 26 }, - [0x83] = { .c = 0xc0, .l = 26 }, - [0x84] = { .c = 0xc1, .l = 26 }, - [0x85] = { .c = 0xc1, .l = 26 }, - [0x86] = { .c = 0xc1, .l = 26 }, - [0x87] = { .c = 0xc1, .l = 26 }, - [0x88] = { .c = 0xc8, .l = 26 }, - [0x89] = { .c = 0xc8, .l = 26 }, - [0x8a] = { .c = 0xc8, .l = 26 }, - [0x8b] = { .c = 0xc8, .l = 26 }, - [0x8c] = { .c = 0xc9, .l = 26 }, - [0x8d] = { .c = 0xc9, .l = 26 }, - [0x8e] = { .c = 0xc9, .l = 26 }, - [0x8f] = { .c = 0xc9, .l = 26 }, - [0x90] = { .c = 0xca, .l = 26 }, - [0x91] = { .c = 0xca, .l = 26 }, - [0x92] = { .c = 0xca, .l = 26 }, - [0x93] = { .c = 0xca, .l = 26 }, - [0x94] = { .c = 0xcd, .l = 26 }, - [0x95] = { .c = 0xcd, .l = 26 }, - [0x96] = { .c = 0xcd, .l = 26 }, - [0x97] = { .c = 0xcd, .l = 26 }, - [0x98] = { .c = 0xd2, .l = 26 }, - [0x99] = { .c = 0xd2, .l = 26 }, - [0x9a] = { .c = 0xd2, .l = 26 }, - [0x9b] = { .c = 0xd2, .l = 26 }, - [0x9c] = { .c = 0xd5, .l = 26 }, - [0x9d] = { .c = 0xd5, .l = 26 }, - [0x9e] = { .c = 0xd5, .l = 26 }, - [0x9f] = { .c = 0xd5, .l = 26 }, - [0xa0] = { .c = 0xda, .l = 26 }, - [0xa1] = { .c = 0xda, .l = 26 }, - [0xa2] = { .c = 0xda, .l = 26 }, - [0xa3] = { .c = 0xda, .l = 26 }, - [0xa4] = { .c = 0xdb, .l = 26 }, - [0xa5] = { .c = 0xdb, .l = 26 }, - [0xa6] = { .c = 0xdb, .l = 26 }, - [0xa7] = { .c = 0xdb, .l = 26 }, - [0xa8] = { .c = 0xee, .l = 26 }, - [0xa9] = { .c = 0xee, .l = 26 }, - [0xaa] = { .c = 0xee, .l = 26 }, - [0xab] = { .c = 0xee, .l = 26 }, - [0xac] = { .c = 0xf0, .l = 26 }, - [0xad] = { .c = 0xf0, .l = 26 }, - [0xae] = { .c = 0xf0, .l = 26 }, - [0xaf] = { .c = 0xf0, .l = 26 }, - [0xb0] = { .c = 0xf2, .l = 26 }, - [0xb1] = { .c = 0xf2, .l = 26 }, - [0xb2] = { .c = 0xf2, .l = 26 }, - [0xb3] = { .c = 0xf2, .l = 26 }, - [0xb4] = { .c = 0xf3, .l = 26 }, - [0xb5] = { .c = 0xf3, .l = 26 }, - [0xb6] = { .c = 0xf3, .l = 26 }, - [0xb7] = { .c = 0xf3, .l = 26 }, - [0xb8] = { .c = 0xff, .l = 26 }, - [0xb9] = { .c = 0xff, .l = 26 }, - [0xba] = { .c = 0xff, .l = 26 }, - [0xbb] = { .c = 0xff, .l = 26 }, - [0xbc] = { .c = 0xcb, .l = 27 }, - [0xbd] = { .c = 0xcb, .l = 27 }, - [0xbe] = { .c = 0xcc, .l = 27 }, - [0xbf] = { .c = 0xcc, .l = 27 }, - [0xc0] = { .c = 0xd3, .l = 27 }, - [0xc1] = { .c = 0xd3, .l = 27 }, - [0xc2] = { .c = 0xd4, .l = 27 }, - [0xc3] = { .c = 0xd4, .l = 27 }, - [0xc4] = { .c = 0xd6, .l = 27 }, - [0xc5] = { .c = 0xd6, .l = 27 }, - [0xc6] = { .c = 0xdd, .l = 27 }, - [0xc7] = { .c = 0xdd, .l = 27 }, - [0xc8] = { .c = 0xde, .l = 27 }, - [0xc9] = { .c = 0xde, .l = 27 }, - [0xca] = { .c = 0xdf, .l = 27 }, - [0xcb] = { .c = 0xdf, .l = 27 }, - [0xcc] = { .c = 0xf1, .l = 27 }, - [0xcd] = { .c = 0xf1, .l = 27 }, - [0xce] = { .c = 0xf4, .l = 27 }, - [0xcf] = { .c = 0xf4, .l = 27 }, - [0xd0] = { .c = 0xf5, .l = 27 }, - [0xd1] = { .c = 0xf5, .l = 27 }, - [0xd2] = { .c = 0xf6, .l = 27 }, - [0xd3] = { .c = 0xf6, .l = 27 }, - [0xd4] = { .c = 0xf7, .l = 27 }, - [0xd5] = { .c = 0xf7, .l = 27 }, - [0xd6] = { .c = 0xf8, .l = 27 }, - [0xd7] = { .c = 0xf8, .l = 27 }, - [0xd8] = { .c = 0xfa, .l = 27 }, - [0xd9] = { .c = 0xfa, .l = 27 }, - [0xda] = { .c = 0xfb, .l = 27 }, - [0xdb] = { .c = 0xfb, .l = 27 }, - [0xdc] = { .c = 0xfc, .l = 27 }, - [0xdd] = { .c = 0xfc, .l = 27 }, - [0xde] = { .c = 0xfd, .l = 27 }, - [0xdf] = { .c = 0xfd, .l = 27 }, - [0xe0] = { .c = 0xfe, .l = 27 }, - [0xe1] = { .c = 0xfe, .l = 27 }, - [0xe2] = { .c = 0x02, .l = 28 }, - [0xe3] = { .c = 0x03, .l = 28 }, - [0xe4] = { .c = 0x04, .l = 28 }, - [0xe5] = { .c = 0x05, .l = 28 }, - [0xe6] = { .c = 0x06, .l = 28 }, - [0xe7] = { .c = 0x07, .l = 28 }, - [0xe8] = { .c = 0x08, .l = 28 }, - [0xe9] = { .c = 0x0b, .l = 28 }, - [0xea] = { .c = 0x0c, .l = 28 }, - [0xeb] = { .c = 0x0e, .l = 28 }, - [0xec] = { .c = 0x0f, .l = 28 }, - [0xed] = { .c = 0x10, .l = 28 }, - [0xee] = { .c = 0x11, .l = 28 }, - [0xef] = { .c = 0x12, .l = 28 }, - [0xf0] = { .c = 0x13, .l = 28 }, - [0xf1] = { .c = 0x14, .l = 28 }, - [0xf2] = { .c = 0x15, .l = 28 }, - [0xf3] = { .c = 0x17, .l = 28 }, - [0xf4] = { .c = 0x18, .l = 28 }, - [0xf5] = { .c = 0x19, .l = 28 }, - [0xf6] = { .c = 0x1a, .l = 28 }, - [0xf7] = { .c = 0x1b, .l = 28 }, - [0xf8] = { .c = 0x1c, .l = 28 }, - [0xf9] = { .c = 0x1d, .l = 28 }, - [0xfa] = { .c = 0x1e, .l = 28 }, - [0xfb] = { .c = 0x1f, .l = 28 }, - [0xfc] = { .c = 0x7f, .l = 28 }, - [0xfd] = { .c = 0xdc, .l = 28 }, - [0xfe] = { .c = 0xf9, .l = 28 }, - [0xff] = { .c = 0x0a, .l = 30 }, - /* Note, when l==30, bits 2..3 give 00:0x0a, 01:0x0d, 10:0x16, 11:EOS */ + /* part used for bits 11-4 for 0xf600 (0x60-0xff) */ + /* 0x60 */ 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, 0xc7, + /* 0x68 */ 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, + /* 0x70 */ 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, + /* 0x78 */ 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, + /* 0x80 */ 0xc0, 0xc0, 0xc0, 0xc0, + /* 0x84 */ 0xc1, 0xc1, 0xc1, 0xc1, + /* 0x88 */ 0xc8, 0xc8, 0xc8, 0xc8, + /* 0x8c */ 0xc9, 0xc9, 0xc9, 0xc9, + /* 0x90 */ 0xca, 0xca, 0xca, 0xca, + /* 0x94 */ 0xcd, 0xcd, 0xcd, 0xcd, + /* 0x98 */ 0xd2, 0xd2, 0xd2, 0xd2, + /* 0x9c */ 0xd5, 0xd5, 0xd5, 0xd5, + /* 0xa0 */ 0xda, 0xda, 0xda, 0xda, + /* 0xa4 */ 0xdb, 0xdb, 0xdb, 0xdb, + /* 0xa8 */ 0xee, 0xee, 0xee, 0xee, + /* 0xac */ 0xf0, 0xf0, 0xf0, 0xf0, + /* 0xb0 */ 0xf2, 0xf2, 0xf2, 0xf2, + /* 0xb4 */ 0xf3, 0xf3, 0xf3, 0xf3, + /* 0xb8 */ 0xff, 0xff, 0xff, 0xff, + /* 0xbc */ 0xcb, 0xcb, + /* 0xbe */ 0xcc, 0xcc, + /* 0xc0 */ 0xd3, 0xd3, + /* 0xc2 */ 0xd4, 0xd4, + /* 0xc4 */ 0xd6, 0xd6, + /* 0xc6 */ 0xdd, 0xdd, + /* 0xc8 */ 0xde, 0xde, + /* 0xca */ 0xdf, 0xdf, + /* 0xcc */ 0xf1, 0xf1, + /* 0xce */ 0xf4, 0xf4, + /* 0xd0 */ 0xf5, 0xf5, + /* 0xd2 */ 0xf6, 0xf6, + /* 0xd4 */ 0xf7, 0xf7, + /* 0xd6 */ 0xf8, 0xf8, + /* 0xd8 */ 0xfa, 0xfa, + /* 0xda */ 0xfb, 0xfb, + /* 0xdc */ 0xfc, 0xfc, + /* 0xde */ 0xfd, 0xfd, + /* 0xe0 */ 0xfe, 0xfe, + /* 0xe2 */ 0x02, + /* 0xe3 */ 0x03, + /* 0xe4 */ 0x04, + /* 0xe5 */ 0x05, + /* 0xe6 */ 0x06, + /* 0xe7 */ 0x07, + /* 0xe8 */ 0x08, + /* 0xe9 */ 0x0b, + /* 0xea */ 0x0c, + /* 0xeb */ 0x0e, + /* 0xec */ 0x0f, + /* 0xed */ 0x10, + /* 0xee */ 0x11, + /* 0xef */ 0x12, + /* 0xf0 */ 0x13, + /* 0xf1 */ 0x14, + /* 0xf2 */ 0x15, + /* 0xf3 */ 0x17, + /* 0xf4 */ 0x18, + /* 0xf5 */ 0x19, + /* 0xf6 */ 0x1a, + /* 0xf7 */ 0x1b, + /* 0xf8 */ 0x1c, + /* 0xf9 */ 0x1d, + /* 0xfa */ 0x1e, + /* 0xfb */ 0x1f, + /* 0xfc */ 0x7f, + /* 0xfd */ 0xdc, + /* 0xfe */ 0xf9, + /* 0xff */ 0x0a, + /* Note, for [0xff], l==30 and bits 2..3 give 00:0x0a, 01:0x0d, 10:0x16, 11:EOS */ }; /* huffman-encode string into the huff_tmp buffer and returns the amount @@ -1468,33 +780,48 @@ int huff_dec(const uint8_t *huff, int hlen, char *out, int olen) code = (code << shift) + (next >> (32 - shift)); /* now we necessarily have 32 bits available */ - if ((code >> 24) < 0xfe) { + if (code < 0xfe000000) { /* single byte */ - l = rht_bit31_24[code >> 24].l; - sym = rht_bit31_24[code >> 24].c; + sym = code >> 24; + l = sym < 0xb8 ? + sym < 0x50 ? 5 : 6 : + sym < 0xf8 ? 7 : 8; + sym = rht_bit31_24[code >> 24]; } - else if (((code >> 17) & 0xff) < 0xff) { + else if (code < 0xfffe0000) { /* two bytes, 0xfe + 2 bits or 0xff + 2..7 bits */ - l = rht_bit24_17[(code >> 17) & 0xff].l; - sym = rht_bit24_17[(code >> 17) & 0xff].c; + sym = code >> 17; + l = sym < 0xe0 ? + sym < 0xa0 ? 10 : sym < 0xd0 ? 11 : 12 : + sym < 0xf8 ? 13 : sym < 0xfc ? 14 : 15; + + sym = rht_bit24_17[(code >> 17) & 0xff]; } - else if (((code >> 16) & 0xff) < 0xff) { /* 3..5 bits */ + else if (code < 0xffff0000) { /* 3..5 bits */ /* 0xff + 0xfe + 3..5 bits or * 0xff + 0xff + 5..8 bits for values till 0xf5 */ - l = rht_bit15_11_fe[(code >> 11) & 0x1f].l; - sym = rht_bit15_11_fe[(code >> 11) & 0x1f].c; + sym = (code >> 11) & 0x1f; + l = sym < 0x0c ? 19 : sym < 0x1c ? 20 : 21; + sym = rht_bit15_11_11_4[(code >> 11) & 0x1f]; } - else if (((code >> 8) & 0xff) < 0xf6) { /* 5..8 bits */ + else if (code < 0xfffff600) { /* 5..8 bits */ /* that's 0xff + 0xff */ - l = rht_bit15_8[(code >> 8) & 0xff].l; - sym = rht_bit15_8[(code >> 8) & 0xff].c; + sym = code >> 8; + + l = sym < 0xb0 ? + sym < 0x48 ? 21 : 22 : + sym < 0xea ? 23 : 24; + sym = rht_bit15_8[(code >> 8) & 0xff]; } else { /* 0xff 0xff 0xf6..0xff */ - l = rht_bit11_4[(code >> 4) & 0xff].l; - if (l < 30) - sym = rht_bit11_4[(code >> 4) & 0xff].c; + sym = code >> 4; + l = sym < 0xbc ? + sym < 0x80 ? 25 : 26 : + sym < 0xe2 ? 27 : sym < 0xff ? 28 : 30; + if (sym < 0xff) + sym = rht_bit15_11_11_4[(code >> 4) & 0xff]; else if ((code & 0xff) == 0xf0) sym = 10; else if ((code & 0xff) == 0xf4)