Was sich im GCC an der Registerallokierung von 3.x nach 4.x geändert hat, kann ich nicht sagen. jedenfalls hat sich das ABI geändert, d.h. die Register werden in der 4.x so verwendet wie in der 3.x.

Globale/Statische Variablen werden nie in Register allokiert, es sei denn, man definiert sich globale Registervariablen à la

Code:
int register var asm ("r2");

void foo (void)
{
    var >>= 1;
}
Code:
foo:
	asr r3	 ;  var
	ror r2	 ;  var
	ret	 ;
Davon ist jedoch tunlichst abzuraten: Nehmen wir an, du verwendest so eine Variable in einer ISR und die IRQ trat in einer LIB-Funktion auf, die so ein Register verwendet. Dann hast du ein Problem...

Ich glaube nicht, daß du die LIBs komplett neu generieren willst und zwar so, daß GCC nirgends die o.g. regs verwendet (abgesehen davon, das Y den Framepionter hält).

Und selbst wenn du keine LIBs verwendest oder sie mit -ffixed= generiert bekommst, ist die Verwendung globaler Registervariablen anders als die globaler Variablen. Es gibt einige Nebeneffekte, die dir ruckzuck das Programm um die Ohren hauen.

GCC verwendet die unteren Register deshalb ungerne, weil die Register nicht alle gleichwertig sind. Es gibt für diese GPRs zB kein LDI und eine konstante in so ein GPR laden geht nur aufwändig über einen sekundären Reload (also über ein oberes GPR).

Die unteren Register werden verwendet, wenn deine Funktionen komplexer werden und wenn du Funktionen hast, die kein Blatt sind:
Code:
long long bar (long long a, long long b)
{
    return a+b;
}
Code:
bar:
/* prologue: frame size=0 */
	push r2
	push r3
	push r4
	push r5
	push r6
	push r7
	push r8
	push r9
	push r10
	push r11
	push r12
	push r13
	push r14
	push r15
	push r16
	push r17
/* prologue end (size=16) */
	mov r2,r18	 ;  a, a
	mov r3,r19	 ;  a, a
	mov r4,r20	 ;  a, a
	mov r5,r21	 ;  a, a
	mov r6,r22	 ;  a, a
	mov r7,r23	 ;  a, a
	mov r8,r24	 ;  a, a
	mov r9,r25	 ;  a, a
	mov r18,r10	 ;  b, b
	mov r19,r11	 ;  b, b
	mov r20,r12	 ;  b, b
	mov r21,r13	 ;  b, b
	mov r22,r14	 ;  b, b
	mov r23,r15	 ;  b, b
	mov r24,r16	 ;  b, b
	mov r25,r17	 ;  b, b
	mov r10,r2	 ; ,
	add r10,r18	 ; , b
	ldi r30,lo8(1)	 ;  tmp46,
	cp r10,r2	 ;  tmp45, a
	brlo .L3	 ; ,
	ldi r30,lo8(0)	 ;  tmp46,
.L3:
	mov r11,r3	 ; ,
	add r11,r19	 ; , b
	ldi r26,lo8(1)	 ;  tmp47,
	cp r11,r3	 ; , a
	brlo .L4	 ; ,
	ldi r26,lo8(0)	 ;  tmp47,
.L4:
	add r30,r11	 ;  tmp48,
	ldi r31,lo8(1)	 ;  tmp49,
	cp r30,r11	 ;  tmp48,
	brlo .L5	 ; ,
	ldi r31,lo8(0)	 ;  tmp49,
.L5:
	or r26,r31	 ;  tmp47, tmp49
	mov r11,r30	 ; , tmp48
	mov r12,r4	 ; ,
	add r12,r20	 ; , b
	ldi r27,lo8(1)	 ;  tmp50,
	cp r12,r4	 ; , a
	brlo .L6	 ; ,
	ldi r27,lo8(0)	 ;  tmp50,
.L6:
	mov r30,r26	 ;  tmp51, tmp47
	add r30,r12	 ;  tmp51,
	ldi r31,lo8(1)	 ;  tmp52,
	cp r30,r12	 ;  tmp51,
	brlo .L7	 ; ,
	ldi r31,lo8(0)	 ;  tmp52,
.L7:
	or r27,r31	 ;  tmp50, tmp52
	mov r12,r30	 ; , tmp51
	mov r13,r5	 ; ,
	add r13,r21	 ; , b
	ldi r26,lo8(1)	 ;  tmp53,
	cp r13,r5	 ; , a
	brlo .L8	 ; ,
	ldi r26,lo8(0)	 ;  tmp53,
.L8:
	mov r30,r27	 ;  tmp54, tmp50
	add r30,r13	 ;  tmp54,
	ldi r31,lo8(1)	 ;  tmp55,
	cp r30,r13	 ;  tmp54,
	brlo .L9	 ; ,
	ldi r31,lo8(0)	 ;  tmp55,
.L9:
	or r26,r31	 ;  tmp53, tmp55
	mov r13,r30	 ; , tmp54
	mov r14,r6	 ; ,
	add r14,r22	 ; , b
	ldi r27,lo8(1)	 ;  tmp56,
	cp r14,r6	 ; , a
	brlo .L10	 ; ,
	ldi r27,lo8(0)	 ;  tmp56,
.L10:
	mov r30,r26	 ;  tmp57, tmp53
	add r30,r14	 ;  tmp57,
	ldi r31,lo8(1)	 ;  tmp58,
	cp r30,r14	 ;  tmp57,
	brlo .L11	 ; ,
	ldi r31,lo8(0)	 ;  tmp58,
.L11:
	or r27,r31	 ;  tmp56, tmp58
	mov r14,r30	 ; , tmp57
	mov r15,r7	 ; ,
	add r15,r23	 ; , b
	ldi r26,lo8(1)	 ;  tmp59,
	cp r15,r7	 ; , a
	brlo .L12	 ; ,
	ldi r26,lo8(0)	 ;  tmp59,
.L12:
	mov r30,r27	 ;  tmp60, tmp56
	add r30,r15	 ;  tmp60,
	ldi r31,lo8(1)	 ;  tmp61,
	cp r30,r15	 ;  tmp60,
	brlo .L13	 ; ,
	ldi r31,lo8(0)	 ;  tmp61,
.L13:
	or r26,r31	 ;  tmp59, tmp61
	mov r15,r30	 ; , tmp60
	mov r16,r8	 ; ,
	add r16,r24	 ; , b
	ldi r27,lo8(1)	 ;  tmp62,
	cp r16,r8	 ; , a
	brlo .L14	 ; ,
	ldi r27,lo8(0)	 ;  tmp62,
.L14:
	mov r31,r26	 ;  tmp63, tmp59
	add r31,r16	 ;  tmp63,
	ldi r30,lo8(1)	 ;  tmp64,
	cp r31,r16	 ;  tmp63,
	brlo .L15	 ; ,
	ldi r30,lo8(0)	 ;  tmp64,
.L15:
	or r30,r27	 ;  tmp65, tmp62
	mov r17,r9	 ; ,
	add r17,r25	 ; , b
	add r30,r17	 ;  tmp65,
	mov r18,r10	 ;  <result>, <result>
	mov r19,r11	 ; , <result>
	mov r20,r12	 ; , <result>
	mov r21,r13	 ; , <result>
	mov r22,r14	 ; , <result>
	mov r23,r15	 ; , <result>
	mov r24,r31	 ; , <result>
	mov r25,r30	 ; , tmp65
/* epilogue: frame size=0 */
	pop r17
	pop r16
	pop r15
	pop r14
	pop r13
	pop r12
	pop r11
	pop r10
	pop r9
	pop r8
	pop r7
	pop r6
	pop r5
	pop r4
	pop r3
	pop r2
	ret
Anm: Der Code ist trotz -Os nicht optimal, weil wenig AUfwand in 64-Bit-Typen gesteckt wurde und GCC die Addition algebraisch austextet.

Das Beispiel zeigt aber, daß GCC durchaus diese Register verwendet.

ZU R1: GCC geht davon aus, daß da die 0 drin steht.