2015-02-03 3 views
1

ARM 명령어가 CPSR을 기본적으로 (예 : x86과 같이) 설정하지 않는 이유는 무엇입니까?하지만 이러한 경우 S 비트를 사용해야합니까? 지침을 변경하지 않으면 CPSR이 더 나은 성능을 제공합니까? 예를 들어 ADD 명령은 ADDS보다 더 나은 성능을 제공합니까? 또는 실제 거래는 무엇입니까?ARM 명령어 세트 - CPSR 변경 (S 비트)

답변

1

성능을위한 것일 수도 있습니다. 항상 플래그를 변경하면 파이프 라인을 망가 트린 분기가없는 여러 명령어에서 하나의 플래그를 사용하는 데 어려움을 겪습니다.

if(a==0) 
{ 
    b=b+1; 
    c=0; 
} 
else 
{ 
    b=0; 
    c=c+1; 
} 

전통적으로 당신은

cmp a,0 
bne notzero 
    add b,b,1 
    mov c,0 
    b waszero 
notzero: 
    mov b,0 
    add c,c,1 
waszero: 

그래서 당신은 무엇

하지만 조건부 실행과 상관없이 지점 고통을하지 말 그대로 가지로 (의사하지 실제 ASM)을 그 구현해야

cmp a,0 
addeq b,b,1 
moveq c,0 
addne c,c,1 
movne b,0 

브랜치를 사용하지 않고 단순히 코드를 리핑하면 이 작업은 1) 플래그에 따라 조건부로 실행하는 명령어 당 옵션이 있고 2) 플래그를 수정하는 명령어에 플래그를 수정하지 않는 옵션이 있습니다.

프로세서 패밀리/아키텍처에 따라 추가 및 어쩌면 mov는 플래그를 수정하므로 조건부 실행과 플래그를 설정하지 않는 옵션을 모두 가져야합니다. 그래서 암에는 추가와 추가가 있습니다.

나는 그들이 64 비트 아키텍처로 모든 것을 제거했다고 생각한다. 어쩌면 재미 있고 멋지 겠지만, 충분히 사용하거나 가치가 없다거나, 32 비트로 모두/일부 명령어를 유지해야 할 필요가있다. .

+0

그래서 파이프 라인의 재설정을 피하기 위해 지점 대신 조건부 명령어를 사용하는 것이 가장 큰 이유는 무엇입니까? 64 비트 아키텍처에서는 벤치 마크에서 볼 수 있듯이 성능이 향상되지 않았으므로이를 제거했습니다. 나는이 질문을 생각해 낼 수 있도록 32 비트 ARM 아키텍처를 연구 중이다. –

1

왜 ARM 명령어가 CPSR을 기본적으로 (예 : x86과 같이) 설정하지 않았는지 궁금한데,이 경우 S 비트를 사용해야합니까?

이것은 상황에 따라 다릅니다. 유연성은 프로그래머의 상상력에 의해서만 제한됩니다.

지침에 따라 CPSR이 더 나은 성능을 제공합니까? 예를 들어 ADD 명령어는 ADDS보다 우수한 성능을 제공합니까?

거의 확실하게 주 1. 즉, CPSR을 설정하지 않은 명령어는 대부분의 ARM CPU 및 명령어에 대해 더 빨리 (적은 클록으로) 실행되지 않습니다.

또는 무엇이 실제입니까? 이 경우

일부 'C'코드를 고려

,

int i, sum; 
char *p = array; /* passed in */ 

for(i = 0, sum = 0; i < 10 ; i++) 
    sum += arrary[i]; 

return sum; 

이로 변환 할 수

mov r2, r0   ; get "array" to R2 
mov r1, #10   ; counter (reverse direction) 
mov r0, #0   ; sum = 0 
1: 
subs r1, #1   ; set conditions 
add r0, [r2], #1 ; does not affect conditions. 
bne 1b 
bx lr 

는 루프 본체는 간단하다. 그러나 루프에 조건이없는 경우 컴파일러 (또는 어셈블러 프로그래머)는 원하는 곳에 루프 감소를 예약하고 훨씬 나중에 테스트 할 조건을 설정합니다. 보다 복잡한 논리와 CPU가 데이터 종속성으로 인해 스톨을 일으키는 경우 더욱 중요해질 수 있습니다. 조건부 실행에서도 중요 할 수 있습니다.

옵션 'S'는 단일 명령어보다 많은 명령어의 기능입니다.

주 1 : 어떤 사람은 항상 ARM CPU를 만들 수 있습니다. 데이터 시트를 살펴 봐야합니다. 조건을 설정하는 데 더 많은 시간이 걸리는 CPU에 대해서는 알지 못합니다.

+1

심지어 거의 모든 ALU op가 단일 사이클 인 요즘에도 모든 명령의 플래그 쓰기 이름을 바꾸거나 조정할 필요가 없으면 순서가 잘못된 코어의 수명이 더 짧아 지므로 메모가 간접적으로 사실의 정렬. – Notlikethat

+0

더 많은 유연성을 제공하며, 그다지 유연성을 발휘하지 못합니다. 당신의 모범은 정말 도움이되었습니다. 감사! –