На скорость будет 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 тактов …