Да, Господь с Вами …
Блин, пошел опять искать пепел ))
Можно пару ардуин спалить не сходя с места, чтобы не искать…
Там пепла нет, весь пепел от чего? От дыма! А когда ардуины горят - весь дым выходит…
На работе я, тут ничего палить не разрешают ))
Чтобы преднамеренно написать качественный говнокод - это талант нужен или озарение.
А что касается других кодов (не использующих таблицы), то если скомбинировать # 19 и # 24 то можно получить код, который будет на 1 такт быстрее и соответственно 2 байта короче кода #24
SWAP R24
MOV R25,R24
ROL R24
ROR R25
ROL R24
ROR R25
ROL R24
ROR R25
ROL R24
ROR R25
ROL R24
ANDI R24, $0F
ANDI R25, $F0
OR R24,R25
Полазил по инету и нашел код который еще на 1 такт быстрее (итого на 2 такта быстрее и на 4 байта меньше чем #24
MOV R25, R24
ASR R25
ROR R24
ROL R25
ROL R25
ANDI R24, $AA
ANDI R25, $55
OR R24, R25
MOV R25, R24
ANDI R24, $99
ANDI R25, $66
SWAP R25
OR R24, R25
А что касается говнокода - есть такая идея:
Преобразуем байт в строку битов, затем с помощью выделения подстрок и конкатенации переставляем символы, после чего опять делаем из этой строки байт. Писать код не хочу, ибо несмотря на то, что оно ужасно и прикольно, в то же время оно все равно бессмысленно.
Мля, что-то зацепило. Мозг сам задумался и я его не смог отвлечь. Получилось такое:
MOV R25, R24
ANDI R24, $66
EOR R25, R24
SWAP R24
OR R24, R25
ROR R25
MOV R25, R24
ANDI R24, $AA
EOR R25, R24
ROR R25
ADD R24, R24
ADC R24, R25
В итоге это уже на 3 такта быстрее и на 6 байтов меньше, чем #24
(если считать с вызовом и возвратом, то будет 20 тактов и 26 байт)
Эх, Командира на тебя нет, на параплане летает )))
У меня #24 почему-то не заработал
P.S. Разобрался с “кракозябрами” asm для GCC))
Всё работает, если немного изменить
Спойлер
uint8_t __attribute__((noinline)) rb(uint8_t b) {
uint8_t r;
asm volatile (
"SWAP %0 \n\t"
"MOV %1, %0 \n\t"
"ANDI %1,0xCC \n\t"
"LSR %1 \n\t"
"LSR %1 \n\t"
"ANDI %0,0x33 \n\t"
"LSL %0 \n\t"
"LSL %0 \n\t"
"OR %0,%1 \n\t"
"MOV %1,%0 \n\t"
"ANDI %1,0xAA \n\t"
"LSR %1 \n\t"
"ANDI %0,0x55 \n\t"
"LSL %0 \n\t"
"OR %0,%1 \n\t"
: "=&r" (r)
: "r" (b)
);
return r;
}