Closed agnat closed 9 years ago
My testcase is:
(exl.s
):
.text
.file "/home/dylan/Desktop/exl.ll"
.globl main
.align 2
.type main,@function
main: ; @main
; BB#0: ; %entry
push r16
push r17
push r28
push r29
in r24, 61
in r25, 62
std Y+31, r24 ; 2-byte Folded Spill
std Y+32, r25 ; 2-byte Folded Spill
call init
ldi r24, 0
ldi r25, 0
ldi r18, 1
ldi r19, 0
std Y+29, r18 ; 2-byte Folded Spill
std Y+30, r19 ; 2-byte Folded Spill
std Y+27, r24 ; 2-byte Folded Spill
std Y+28, r25 ; 2-byte Folded Spill
rjmp LBB0_1
LBB0_1: ; %while_body
; =>This Inner Loop Header: Depth=1
ldd r24, Y+27 ; 2-byte Folded Reload
ldd r25, Y+28 ; 2-byte Folded Reload
ldd r18, Y+29 ; 2-byte Folded Reload
ldd r19, Y+30 ; 2-byte Folded Reload
in r30, 61
in r31, 62
sbiw r30, 2
andi r30, 254
andi r31, 255
in r0, 63
cli
out 62, r31
out 63, r0
out 61, r30
movw r20, r30
ldi r22, 232
ldi r23, 3
st Z, r22
std Z+1, r23
ldi r22, 0
ldi r23, 0
ldi r30, 1
ldi r31, 0
cp r18, r22
cpc r19, r23
std Y+25, r24 ; 2-byte Folded Spill
std Y+26, r25 ; 2-byte Folded Spill
std Y+23, r18 ; 2-byte Folded Spill
std Y+24, r19 ; 2-byte Folded Spill
std Y+21, r20 ; 2-byte Folded Spill
std Y+22, r21 ; 2-byte Folded Spill
std Y+19, r22 ; 2-byte Folded Spill
std Y+20, r23 ; 2-byte Folded Spill
std Y+17, r30 ; 2-byte Folded Spill
std Y+18, r31 ; 2-byte Folded Spill
breq LBB0_3
; BB#2: ; %while_body
; in Loop: Header=BB0_1 Depth=1
ldd r24, Y+19 ; 2-byte Folded Reload
ldd r25, Y+20 ; 2-byte Folded Reload
std Y+17, r24 ; 2-byte Folded Spill
std Y+18, r25 ; 2-byte Folded Spill
LBB0_3: ; %while_body
; in Loop: Header=BB0_1 Depth=1
ldd r24, Y+17 ; 2-byte Folded Reload
ldd r25, Y+18 ; 2-byte Folded Reload
mov r18, r24
ldd r24, Y+23 ; 2-byte Folded Reload
ldd r25, Y+24 ; 2-byte Folded Reload
ldd r20, Y+19 ; 2-byte Folded Reload
ldd r21, Y+20 ; 2-byte Folded Reload
cp r24, r20
cpc r25, r21
std Y+16, r18 ; 1-byte Folded Spill
brne LBB0_5
rjmp LBB0_4
LBB0_4: ; %if_then
; in Loop: Header=BB0_1 Depth=1
ldi r24, 0
ldi r22, -1
call digitalWrite
rjmp LBB0_6
LBB0_5: ; %if_else
; in Loop: Header=BB0_1 Depth=1
ldi r24, 1
ldi r22, -1
call digitalWrite
rjmp LBB0_6
LBB0_6: ; %if_cont
; in Loop: Header=BB0_1 Depth=1
in r24, 61
in r25, 62
sbiw r24, 2
andi r24, 254
andi r25, 255
in r0, 63
cli
out 62, r25
out 63, r0
out 61, r24
ldi r18, 200
ldi r19, 0
movw r30, r24
st Z, r18
std Z+1, r19
ldi r24, 0
ldi r25, 0
movw r22, r18
std Y+14, r24 ; 2-byte Folded Spill
std Y+15, r25 ; 2-byte Folded Spill
call delay
ldd r24, Y+25 ; 2-byte Folded Reload
ldd r25, Y+26 ; 2-byte Folded Reload
subi r24, 56
sbci r25, 255
ldi r20, 0
std Y+12, r24 ; 2-byte Folded Spill
std Y+13, r25 ; 2-byte Folded Spill
mov r24, r20
mov r22, r20
std Y+11, r20 ; 1-byte Folded Spill
call digitalWrite
ldi r24, 1
ldd r22, Y+11 ; 1-byte Folded Reload
call digitalWrite
ldd r18, Y+21 ; 2-byte Folded Reload
ldd r19, Y+22 ; 2-byte Folded Reload
movw r30, r18
ld r26, Z
ldd r27, Z+1
; implicit-def: R31R30
ldd r24, Y+16 ; 1-byte Folded Reload
mov r30, r24
andi r30, 1
andi r31, 0
ldi r28, 1
ldi r29, 0
ldd r16, Y+14 ; 2-byte Folded Reload
ldd r17, Y+15 ; 2-byte Folded Reload
cp r30, r16
cpc r31, r17
std Y+9, r26 ; 2-byte Folded Spill
std Y+10, r27 ; 2-byte Folded Spill
std Y+7, r28 ; 2-byte Folded Spill
std Y+8, r29 ; 2-byte Folded Spill
brne LBB0_8
; BB#7: ; %if_cont
; in Loop: Header=BB0_1 Depth=1
ldd r24, Y+14 ; 2-byte Folded Reload
ldd r25, Y+15 ; 2-byte Folded Reload
std Y+7, r24 ; 2-byte Folded Spill
std Y+8, r25 ; 2-byte Folded Spill
LBB0_8: ; %if_cont
; in Loop: Header=BB0_1 Depth=1
ldd r24, Y+7 ; 2-byte Folded Reload
ldd r25, Y+8 ; 2-byte Folded Reload
ldd r18, Y+9 ; 2-byte Folded Reload
ldd r19, Y+10 ; 2-byte Folded Reload
ldd r20, Y+12 ; 2-byte Folded Reload
ldd r21, Y+13 ; 2-byte Folded Reload
cp r18, r20
cpc r19, r21
std Y+5, r24 ; 2-byte Folded Spill
std Y+6, r25 ; 2-byte Folded Spill
brlt LBB0_10
; BB#9: ; %if_cont
; in Loop: Header=BB0_1 Depth=1
ldd r24, Y+23 ; 2-byte Folded Reload
ldd r25, Y+24 ; 2-byte Folded Reload
std Y+5, r24 ; 2-byte Folded Spill
std Y+6, r25 ; 2-byte Folded Spill
LBB0_10: ; %if_cont
; in Loop: Header=BB0_1 Depth=1
ldd r24, Y+5 ; 2-byte Folded Reload
ldd r25, Y+6 ; 2-byte Folded Reload
ldd r18, Y+9 ; 2-byte Folded Reload
ldd r19, Y+10 ; 2-byte Folded Reload
ldd r20, Y+12 ; 2-byte Folded Reload
ldd r21, Y+13 ; 2-byte Folded Reload
cp r18, r20
cpc r19, r21
ldd r22, Y+14 ; 2-byte Folded Reload
ldd r23, Y+15 ; 2-byte Folded Reload
std Y+3, r24 ; 2-byte Folded Spill
std Y+4, r25 ; 2-byte Folded Spill
std Y+1, r22 ; 2-byte Folded Spill
std Y+2, r23 ; 2-byte Folded Spill
brlt LBB0_12
; BB#11: ; %if_cont
; in Loop: Header=BB0_1 Depth=1
ldd r24, Y+12 ; 2-byte Folded Reload
ldd r25, Y+13 ; 2-byte Folded Reload
std Y+1, r24 ; 2-byte Folded Spill
std Y+2, r25 ; 2-byte Folded Spill
LBB0_12: ; %if_cont
; in Loop: Header=BB0_1 Depth=1
ldd r24, Y+1 ; 2-byte Folded Reload
ldd r25, Y+2 ; 2-byte Folded Reload
ldd r18, Y+3 ; 2-byte Folded Reload
ldd r19, Y+4 ; 2-byte Folded Reload
std Y+29, r18 ; 2-byte Folded Spill
std Y+30, r19 ; 2-byte Folded Spill
std Y+27, r24 ; 2-byte Folded Spill
std Y+28, r25 ; 2-byte Folded Spill
rjmp LBB0_1
.Lfunc_end0:
.size main, .Lfunc_end0-main
And verifying that the disassembled branch offsets are the same as what GCC generates. This PR doesn't mess up any fixups :)
Pass fixup value by reference to adjustFooBar(...) functions, adjusting the value in-place. Drop a missleading comment in processFixupValue(...).
I think it's a little less confusing this way... @dylanmckay, could you give it a review and maybe re-run your test case?