Говнокод по пятницам. Эпизод 2. Перверсивное реверсирование

На скорость будет 17 тактов и 36 байт…

uint8_t __attribute__((noinline)) rb(uint8_t b) {
  uint8_t r;
  asm volatile (
    "ROL %1 \n\t"
    "ROR %0 \n\t"
    "ROL %1 \n\t"
    "ROR %0 \n\t"
    "ROL %1 \n\t"
    "ROR %0 \n\t"
    "ROL %1 \n\t"
    "ROR %0 \n\t"
    "ROL %1 \n\t"
    "ROR %0 \n\t"
    "ROL %1 \n\t"
    "ROR %0 \n\t"
    "ROL %1 \n\t"
    "ROR %0 \n\t"
    "ROL %1 \n\t"
    "ROR %0 \n\t"
    : "=&r" (r)
    : "r" (b)
    :);
  return r;
}

void setup () {
  Serial.begin(9600);
  Serial.println("Start");
}

void loop() {
  Serial.println(0B11000001, BIN);
  Serial.println(rb(0B11000001), BIN);
}

Вместе с вызовом и возвратом 25 тактов …

MOV  R25,R24
ROL R25
ROR R24
ROL R25
ROR R24
ROL R25
ROR R24
ROL R25
ROR R24
ROL R25
ROR R24
ROL R25
ROR R24
ROL R25
ROR R24
ROL R25
ROR R24
RET

Если упереться в размер кода, то 14 байт:

uint8_t __attribute__((noinline)) rb(uint8_t b) {
  uint8_t r;
  uint8_t c(8);
  asm volatile (
    "loop1: \n\t"
    "ROL %1 \n\t"
    "ROR %0 \n\t"
    "DEC %2 \n\t"
    "BRNE loop1 \n\t"
    : "=&r" (r)
    : "r" (b), "r"(c)
    :);
  return r;
}

Вместе с вызовом и возвратом уже будет 49 тактов …