Hlavní navigace

Názor ke článku Počítání s přetečením v C od Jet - [22] to je zajímavý postřeh. Abych byl upřímný,...

  • 3. 10. 2014 9:17

    Jet (neregistrovaný)

    [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