А вот вопрос знатокам С для АВРов.
Понадобилась перетасовка битов в int - по сути, транспонировать матрицу 4*4. Чтоб не мудрить - решил просто, в лоб - 16 команд перестановки битиков, объявив этот int в union-е с битовой структурой. Типа такого:
Код
dst.b0 = src.b0;
dst.b4 = src.b1;
dst.b8 = src.b2;
и т.д.
Учитывая умность компилятора, хотел увидеть что-то типа - src в регистры, потом 16 пар BST/BLD, и результат из регистров в dst. использование 4-х регистров, - не напрягает, по моему. Но. Получил код такой (оптимизация high):
Код
\ 0000012E 2F32 MOV R19, R18
\ 00000130 7031 ANDI R19, 0x01
\ 00000132 2F02 MOV R16, R18
\ 00000134 0F00 LSL R16
\ 00000136 0F00 LSL R16
\ 00000138 0F00 LSL R16
\ 0000013A 2B03 OR R16, R19
\ 0000013C 7101 ANDI R16, 0x11
\ 0000013E 2F32 MOV R19, R18
\ 00000140 9536 LSR R19
\ 00000142 9536 LSR R19
\ 00000144 9536 LSR R19
\ 00000146 7032 ANDI R19, 0x02
\ 00000148 2B30 OR R19, R16
\ 0000014A 2F02 MOV R16, R18
\ 0000014C 7200 ANDI R16, 0x20
\ 0000014E 2B03 OR R16, R19
\ 00000150 2F31 MOV R19, R17
\ 00000152 FB30 BST R19, 0
\ 00000154 E030 LDI R19, 0
\ 00000156 F932 BLD R19, 2
\ 00000158 2B30 OR R19, R16
\ 0000015A 2F01 MOV R16, R17
\ 0000015C 9502 SWAP R16
\ 0000015E 7F00 ANDI R16, 0xF0
\ 00000160 0F00 LSL R16
\ 00000162 7400 ANDI R16, 0x40
\ 00000164 2B03 OR R16, R19
\ 00000166 2F31 MOV R19, R17
\ 00000168 9536 LSR R19
\ 0000016A 7038 ANDI R19, 0x08
\ 0000016C 2B30 OR R19, R16
\ 0000016E 2F01 MOV R16, R17
\ 00000170 0F00 LSL R16
\ 00000172 0F00 LSL R16
\ 00000174 7800 ANDI R16, 0x80
\ 00000176 2B03 OR R16, R19
\ 00000178 930C ST X, R16
\ 0000017A 2F02 MOV R16, R18
\ 0000017C FB02 BST R16, 2
\ 0000017E E000 LDI R16, 0
\ 00000180 F900 BLD R16, 0
\ 00000182 2F32 MOV R19, R18
\ 00000184 0F33 LSL R19
\ 00000186 2B30 OR R19, R16
\ 00000188 7131 ANDI R19, 0x11
\ 0000018A 2F02 MOV R16, R18
\ 0000018C 9502 SWAP R16
\ 0000018E 700F ANDI R16, 0x0F
\ 00000190 9506 LSR R16
\ 00000192 7002 ANDI R16, 0x02
\ 00000194 2B03 OR R16, R19
\ 00000196 9526 LSR R18
\ 00000198 9526 LSR R18
\ 0000019A 7220 ANDI R18, 0x20
\ 0000019C 2B20 OR R18, R16
\ 0000019E 2F01 MOV R16, R17
\ 000001A0 7004 ANDI R16, 0x04
\ 000001A2 2B02 OR R16, R18
\ 000001A4 2F21 MOV R18, R17
\ 000001A6 0F22 LSL R18
\ 000001A8 0F22 LSL R18
\ 000001AA 0F22 LSL R18
\ 000001AC 7420 ANDI R18, 0x40
\ 000001AE 2B20 OR R18, R16
\ 000001B0 2F01 MOV R16, R17
\ 000001B2 9506 LSR R16
\ 000001B4 9506 LSR R16
\ 000001B6 9506 LSR R16
\ 000001B8 7008 ANDI R16, 0x08
\ 000001BA 2B02 OR R16, R18
\ 000001BC 7810 ANDI R17, 0x80
\ 000001BE 2B10 OR R17, R16
\ 000001C0 8311 STD Z+1, R17
... то есть более 70 команд (вместо 32). Жуть какая-то. Где-то я напортачил или все-таки этот ИАР местами глупости выдает?
Кстати, когда это же было в процедуре - там компилятор вообще построил код такой, что использовался только R16 и все через память...
Странно это, однако.