Skip to content

Instantly share code, notes, and snippets.

@aqrit
Created September 29, 2018 19:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aqrit/551493929d14e7e297fb39b2f1aeca00 to your computer and use it in GitHub Desktop.
Save aqrit/551493929d14e7e297fb39b2f1aeca00 to your computer and use it in GitHub Desktop.
#include <stddef.h> // size_t
#include <stdint.h>
#include <smmintrin.h> // sse4.1
#include <string.h> // memcpy
static const uint8_t dec_table[256*16] = {
0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF,
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF,
0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0x08, 0x09, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0xFF, 0x0E, 0x0F, 0xFF, 0xFF,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0x07, 0x08, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF,
0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x07, 0x08, 0x09, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0x07, 0x08, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0xFF, 0x0D, 0x0E, 0x0F, 0xFF,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0x06, 0x07, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x04, 0xFF, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x03, 0x04, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x02, 0x03, 0x04, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF,
0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x08, 0x09, 0xFF, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x07, 0x08, 0x09, 0xFF, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0xFF, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x08, 0xFF, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x07, 0x08, 0xFF, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x06, 0x07, 0x08, 0xFF, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x07, 0xFF, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x06, 0x07, 0xFF, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0x06, 0x07, 0xFF, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0x06, 0xFF, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0x05, 0x06, 0xFF, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xFF, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0xFF, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x03, 0x04, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x02, 0x03, 0x04, 0xFF, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0x0C, 0x0D, 0x0E, 0x0F,
0x06, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0x06, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0x05, 0x06, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x03, 0x04, 0x05, 0x06, 0x07, 0xFF, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0x05, 0xFF, 0xFF, 0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x03, 0x04, 0x05, 0xFF, 0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xFF, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x04, 0xFF, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x03, 0x04, 0xFF, 0xFF, 0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x02, 0x03, 0x04, 0xFF, 0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xFF, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x03, 0xFF, 0xFF, 0xFF, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x02, 0x03, 0xFF, 0xFF, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x01, 0x02, 0x03, 0xFF, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
};
// misaligned pointers are UB
static inline uint64_t unaligned_load_u64 (const void *ptr) {
uint64_t data;
memcpy(&data, ptr, sizeof(data));
return data;
}
// 2-bits per each rounded up to byte boundry
static inline uint32_t calc_key_block_length(uint32_t count) {
return (count >> 2) + (((count & 3) + 3) >> 2);
}
// unroll helper
#define DECODE(n, key) \
do{ \
const uint8_t* p = &dec_table[(key)*16]; \
__m128i shuf = _mm_loadu_si128((__m128i*) p); \
data_ptr -= *p; \
__m128i data = _mm_loadu_si128((__m128i*) &data_ptr[n*16]); \
data = _mm_shuffle_epi8(data, shuf); \
_mm_storeu_si128((__m128i*)&out[n*4], data); \
} while(0);
size_t streamvbyte_decodex(
const uint8_t *restrict in,
uint32_t *restrict out,
uint32_t count)
{
// key block is followed by a variable length literal data block
uint32_t key_block_len = calc_key_block_length(count);
const uint8_t *restrict key_ptr = in;
const uint8_t *restrict data_ptr = &in[key_block_len];
for(uint32_t i = 0; i < ((count >> 2) & ~15); i+=16)
{
uint64_t keys0 = unaligned_load_u64(&key_ptr[i]);
DECODE(0, keys0 & 0xFF);
DECODE(1, (keys0 & 0xFF00) >> 8);
keys0 >>= 16;
DECODE(2, keys0 & 0xFF);
DECODE(3, (keys0 & 0xFF00) >> 8);
keys0 >>= 16;
DECODE(4, keys0 & 0xFF);
DECODE(5, (keys0 & 0xFF00) >> 8);
keys0 >>= 16;
DECODE(6, keys0 & 0xFF);
DECODE(7, (keys0 & 0xFF00) >> 8);
uint64_t keys1 = unaligned_load_u64(&key_ptr[i+8]);
DECODE(8, keys1 & 0xFF);
DECODE(9, (keys1 & 0xFF00) >> 8);
keys1 >>= 16;
DECODE(10, keys1 & 0xFF);
DECODE(11, (keys1 & 0xFF00) >> 8);
keys1 >>= 16;
DECODE(12, keys1 & 0xFF);
DECODE(13, (keys1 & 0xFF00) >> 8);
keys1 >>= 16;
DECODE(14, keys1 & 0xFF);
DECODE(15, (keys1 & 0xFF00) >> 8);
out += 4*16;
data_ptr += 16*16;
}
// todo: tail loop...
return 0;
}
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h> // PRIu64
#define RDTSC_START(cycles) \
do{ \
register unsigned cyc_high, cyc_low; \
__asm volatile("cpuid\n\t" \
"rdtsc\n\t" \
"cpuid\n\t" \
"rdtsc\n\t" \
"cpuid\n\t" \
"rdtsc\n\t" \
"mov %%edx, %0\n\t" \
"mov %%eax, %1\n\t" \
: "=r"(cyc_high), "=r"(cyc_low) \
::"%rax", "%rbx", "%rcx", "%rdx", "memory"); \
(cycles) = ((uint64_t)cyc_high << 32) | cyc_low; \
}while(0)
#define RDTSC_FINAL(cycles) \
do{ \
register unsigned cyc_high, cyc_low; \
__asm volatile("rdtscp\n\t" \
"mov %%edx, %0\n\t" \
"mov %%eax, %1\n\t" \
"cpuid\n\t" \
: "=r"(cyc_high), "=r"(cyc_low) \
::"%rax", "%rbx", "%rcx", "%rdx", "memory"); \
(cycles) = ((uint64_t)cyc_high << 32) | cyc_low; \
}while(0)
#include "streamvbyte.h"
int main (void)
{
uint8_t buf0[0x200000];
uint8_t buf1[0x200000];
uint8_t buf2[0x200000];
// fill with all possible 16-byte 0x00/0xFF combinations
uint8_t* p = buf0;
for( int i = 0; i < 0x10000; i++ ){
p[0] = (uint8_t)(((i >> 0) & 1) - 1) & rand();
p[1] = (uint8_t)(((i >> 1) & 1) - 1) & rand();
p[2] = (uint8_t)(((i >> 2) & 1) - 1) & rand();
p[3] = (uint8_t)(((i >> 3) & 1) - 1) & rand();
p[4] = (uint8_t)(((i >> 4) & 1) - 1) & rand();
p[5] = (uint8_t)(((i >> 5) & 1) - 1) & rand();
p[6] = (uint8_t)(((i >> 6) & 1) - 1) & rand();
p[7] = (uint8_t)(((i >> 7) & 1) - 1) & rand();
p[8] = (uint8_t)(((i >> 8) & 1) - 1) & rand();
p[9] = (uint8_t)(((i >> 9) & 1) - 1) & rand();
p[10] = (uint8_t)(((i >> 10) & 1) - 1) & rand();
p[11] = (uint8_t)(((i >> 11) & 1) - 1) & rand();
p[12] = (uint8_t)(((i >> 12) & 1) - 1) & rand();
p[13] = (uint8_t)(((i >> 13) & 1) - 1) & rand();
p[14] = (uint8_t)(((i >> 14) & 1) - 1) & rand();
p[15] = (uint8_t)(((i >> 15) & 1) - 1) & rand();
p += 16;
}
streamvbyte_encode((uint32_t*)buf0, 0x100000 >> 2, buf1);
{
printf("%24s: ", "decode_new");
uint64_t tm1, tm2;
uint64_t min_diff = 0xFFFFFFFFFFFFFFFF;
for(int i = 0; i < 10000; i++){
RDTSC_START(tm1);
streamvbyte_decodex(buf1, (uint32_t*)buf2, 0x100000 >> 2);
RDTSC_FINAL(tm2);
uint64_t tmus = tm2 - tm1;
if(tmus < min_diff) min_diff = tmus;
}
printf("%10" PRIu64 "\n", min_diff);
}
{
printf("%24s: ", "decode_orig");
uint64_t tm1, tm2;
uint64_t min_diff = 0xFFFFFFFFFFFFFFFF;
for(int i = 0; i < 10000; i++){
RDTSC_START(tm1);
streamvbyte_decode(buf1, (uint32_t*)buf2, 0x100000 >> 2);
RDTSC_FINAL(tm2);
uint64_t tmus = tm2 - tm1;
if(tmus < min_diff) min_diff = tmus;
}
printf("%10" PRIu64 "\n", min_diff);
}
{
printf("%24s: ", "decode_new");
uint64_t tm1, tm2;
uint64_t min_diff = 0xFFFFFFFFFFFFFFFF;
for(int i = 0; i < 10000; i++){
RDTSC_START(tm1);
streamvbyte_decodex(buf1, (uint32_t*)buf2, 0x100000 >> 2);
RDTSC_FINAL(tm2);
uint64_t tmus = tm2 - tm1;
if(tmus < min_diff) min_diff = tmus;
}
printf("%10" PRIu64 "\n", min_diff);
}
{
printf("%24s: ", "decode_orig");
uint64_t tm1, tm2;
uint64_t min_diff = 0xFFFFFFFFFFFFFFFF;
for(int i = 0; i < 10000; i++){
RDTSC_START(tm1);
streamvbyte_decode(buf1, (uint32_t*)buf2, 0x100000 >> 2);
RDTSC_FINAL(tm2);
uint64_t tmus = tm2 - tm1;
if(tmus < min_diff) min_diff = tmus;
}
printf("%10" PRIu64 "\n", min_diff);
}
{
printf("%24s: ", "decode_new");
uint64_t tm1, tm2;
uint64_t min_diff = 0xFFFFFFFFFFFFFFFF;
for(int i = 0; i < 10000; i++){
RDTSC_START(tm1);
streamvbyte_decodex(buf1, (uint32_t*)buf2, 0x100000 >> 2);
RDTSC_FINAL(tm2);
uint64_t tmus = tm2 - tm1;
if(tmus < min_diff) min_diff = tmus;
}
printf("%10" PRIu64 "\n", min_diff);
}
if(memcmp(buf0,buf2,0x100000) == 0){
printf("ok\n");
} else {
printf("fail\n");
}
printf("\n\ndone\n");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment