#include <stdio.h>
#include <inttypes.h>
#include <string.h>

void uintprint3(uint32_t *a)
{
  printf("%u %u %u\n", a[0], a[1], a[2]);
}

void sort3(uint32_t a[static 3])
{
  uint16_t mask = 0x6124;
  uint8_t bits = (a[0] <= a[1]) | ((a[1] <= a[2]) << 1) | ((a[0] <= a[2]) << 2);
  static const uint8_t b[] =
  {
    [0b000] =  3, // =0
    [0b001] =  8,
    [0b010] = 10,
    [0b101] =  2, // =5
    [0b110] =  1, // =4
    [0b111] = 12,
  };
  mask >>= b[bits];
  uint32_t tmp[3] = {a[(mask>>4)&0b11], a[(mask>>2)&0b11], a[(mask)&0b11]};
  memcpy(a, tmp, 3*sizeof(uint32_t));
}
 
int main(void)
{
  uint32_t a[] = {0, 1, 2};
  uint32_t b[] = {0, 2, 1};
  uint32_t c[] = {1, 2, 0};
  uint32_t d[] = {1, 0, 2};
  uint32_t e[] = {2, 0, 1};
  uint32_t f[] = {2, 1, 0};
  sort3(a); sort3(b); sort3(c); sort3(d); sort3(e); sort3(f);
 
  uintprint3(a);
  uintprint3(b);
  uintprint3(c);
  uintprint3(d);
  uintprint3(e);
  uintprint3(f);
  return 0;
}
