[22] to je zajímavý postřeh. Abych byl upřímný, vůbec mě nenapadlo, že long long bude fungovat i na těchto processorech. Sice stejně potřebuju detekovat carry, ale aspoň si ušetřím nutnost sčítat a+b+předchozí_carry
Tak jsem si udělal pokus. To jsem radši neměl dělat. Ztratil jsem veškeré iluze o processoru AVR i o gcc. Jednak jsem si doteď myslel, že AVR je 32 bitů. Je to 8 bitů. Ale jak gcc přeložilo long long sčítání, to je zvrácenost. Chtělo se mi u toho zvracet.
Takže napřed 32 bitové sčítání, abychom si udělali představu:
add32:
.stabd 46,0,0
.stabn 68,0,9,.LM3-.LFBB2
.LM3:
.LFBB2:
/* prologue: function */
/* frame size = 0 */
/* stack size = 0 */
.L__stack_usage = 0
movw r26,r24
movw r24,r22
.stabn 68,0,10,.LM4-.LFBB2
.LM4:
add r18,r24
adc r19,r25
adc r20,r26
adc r21,r27
.stabn 68,0,11,.LM5-.LFBB2
.LM5:
movw r22,r18
movw r24,r20
/* epilogue start */
ret
.
.
.
A teď 64 bitů:
add64:
.stabd 46,0,0
.stabn 68,0,4,.LM0-.LFBB1
.LM0:
.LFBB1:
push r10
push r11
push r12
push r13
push r14
push r15
push r16
push r17
/* prologue: function */
/* frame size = 0 */
/* stack size = 8 */
.L__stack_usage = 8
.stabn 68,0,5,.LM1-.LFBB1
.LM1:
add r18,r10
ldi r26,lo8(1)
cp r18,r10
brlo .L2
ldi r26,lo8(0)
.L2:
mov r30,r11
add r30,r19
ldi r31,lo8(1)
cp r30,r11
brlo .L3
ldi r31,lo8(0)
.L3:
mov r19,r26
add r19,r30
ldi r26,lo8(1)
cp r19,r30
brlo .L4
ldi r26,lo8(0)
.L4:
or r31,r26
mov r26,r12
add r26,r20
ldi r30,lo8(1)
cp r26,r12
brlo .L5
ldi r30,lo8(0)
.L5:
mov r20,r31
add r20,r26
ldi r31,lo8(1)
cp r20,r26
brlo .L6
ldi r31,lo8(0)
.L6:
or r30,r31
mov r26,r13
add r26,r21
ldi r31,lo8(1)
cp r26,r13
brlo .L7
ldi r31,lo8(0)
.L7:
mov r21,r30
add r21,r26
ldi r30,lo8(1)
cp r21,r26
brlo .L8
ldi r30,lo8(0)
.L8:
or r31,r30
mov r26,r14
add r26,r22
ldi r30,lo8(1)
cp r26,r14
brlo .L9
ldi r30,lo8(0)
.L9:
mov r22,r31
add r22,r26
ldi r31,lo8(1)
cp r22,r26
brlo .L10
ldi r31,lo8(0)
.L10:
or r30,r31
mov r26,r15
add r26,r23
ldi r31,lo8(1)
cp r26,r15
brlo .L11
ldi r31,lo8(0)
.L11:
mov r23,r30
add r23,r26
ldi r30,lo8(1)
cp r23,r26
brlo .L12
ldi r30,lo8(0)
.L12:
or r31,r30
mov r26,r16
add r26,r24
ldi r30,lo8(1)
cp r26,r16
brlo .L13
ldi r30,lo8(0)
.L13:
mov r24,r31
add r24,r26
ldi r31,lo8(1)
cp r24,r26
brlo .L14
ldi r31,lo8(0)
.L14:
or r30,r31
add r25,r17
.stabn 68,0,6,.LM2-.LFBB1
.LM2:
add r25,r30
/* epilogue start */
pop r17
pop r16
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
ret