23.03.2006

В догонку...

...к экспериментам со swap. Еще два компилятора - под процессоры ARM, RVCT (компилятор от ARM) и gcc из Symbian SDK.



















 Метод 1Метод 2
C source code
void f0( int a, int b );
void f1( )
{
static int a = 0;
static int b = 0;

a ^= b ^= a ^= b;
f0(a, b);
}
void f0( int a, int b );

void f2( )
{
static int a = 0;
static int b = 0;

{
int c;
c = a;
a = b;
b = c;
}

f0(a, b);
}
RVCT
[armcc -O3 -S]
||f1|| PROC
LDR r2,|L1.32|
LDM r2,{r0,r1} ; a@f1_0, b@f1_1
EOR r0,r0,r1
EOR r1,r0,r1
EOR r0,r1,r0
STR r1,[r2,#4] ; b@f1_1
STR r0,[r2,#0] ; a@f1_0

B ||f0||
|L1.32|
DCD ||.data$0||
ENDP

||f2|| PROC
LDR r2,|L1.20|
LDR r0,[r2,#4] ; a@f2_0, b@f2_1
LDR r1,[r2,#0]
STM r2,{r0,r1} ; a@f2_0, b@f2_1

B ||f0||
|L1.20|
DCD ||.data$0||
ENDP
Symbian SDK gcc
[gcc -O3 -S]
f1:
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
ldr r3, .L2
ldr r2, .L2+4
ldr r0, [r3, #0]
ldr r1, [r2, #0]
eor r0, r0, r1
str r0, [r3, #0]
eor r1, r1, r0
str r1, [r2, #0]
eor r0, r0, r1
str r0, [r3, #0]

sub fp, ip, #4
bl f0
ldmea fp, {fp, sp, lr}
bx lr

f2:
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
ldr r2, .L2
ldr r3, .L2+4
ldr r0, [r2, #0]
ldr r1, [r3, #0]
str r0, [r3, #0]
str r1, [r2, #0]

sub fp, ip, #4
bl f0
ldmea fp, {fp, sp, lr}
bx lr


P.S. Стоит, пожалуй, обратить внимание и на то, что в данных случаях RVCT выигрывает у Symbian's gcc =).

Комментариев нет:

Отправить комментарий