ARM System Developer's Guide  

- Designing and Optimizaing System Software




#####

C Looping Structures - summary

Register Allocation

Function Calls




### 5.3. 속도 향상을 고려한 C 루프문


> Summary <

효과적인 루프문의 코딩


1. 0으로 다운카운트하는 루프문 사용.

컴파일러는 최종값을 저장하기 위해 레지스터를 할당 할 필요가 없음

0과의 비교작업에 비용이 들지 않음


2. default로 unsigned loop count를 사용하고 반복조건은 i>0보다 i!=0을 사용

루프 오버헤드는 명령어 2개로 줄어듬


3. 루프가 적어도 한 번 이상 실행된다면 do-while 사용

컴파일러가 루프 카운터가 0인지 아닌지를 체크할 필요성을 없애줌


4. 루프 오버헤드를 줄여야 하는 중요한 루프문은 unrolling. (너무 많이 해서도 안됨)

루프 오버헤드가 전체의 일정 비율만큼 작아지면 언롤링은 코드 사이즈를 증가시킴

즉, 캐시 성능에 좋지 않음


5. 배열에서 element의 수는 4나 8의 배수가 되도록 정렬

배열의요소를 추가해야 할 지에 대한 고민하지 않고 루프를 2,4,8배로 쉽게 언롤릴 할 수 있음.




### 5.4. ATPCS에서의 레지스터 매핑


> 효육적인 함수 구현

- spilled(swapped out)되는 변수의 수를 최소화

- 가장 중요하면서 자주 액세스되는 변수들을 레지스터에 저장하도록 함



> 효율적인 레지슽 할당

1. 이론적으로 C 컴파일러는 14개의 변수를 레지스터에 저장할 수 있으나, 실제 몇몇 컴파일러들은 임시 스크래치 작업을 위해 r12같은 고정된 레지스터를 사용하고 있음.

또 복잡한 표현식 계산을 위해 임시 작업용 레지스터들을 필요로 함

=> 함수 내부 루틴에서 사용하는 지역 변수의 수를 12개로 제한하도록 하자.

2. 변수들이 내부 루프에서 사용되고 있는지를 확인하여 중요한 변수를 컴파일러에게 알리도록 하자.




### 5.5. 서브루틴 호출시 매개변수 처리


- APCS(ARM Procedure Call Standard) : 함수 인자와 리턴값을 ARM register로 보내는 방법에 대하여 정의

- ATPCS(ARM-Thumb Procedure Call Standard) : ARM과 Thumb interworking도 다루고 있음



- 처음 4개의 정수 인자는 ARM레지스터의 처음 4개인 r0,r1,r2,r3에 저장

- 다음의 정수 인자는 full descending stack에 저장

- 함수 리턴은 r0으로 보내짐

- long long, double과 같은 두 워드는 인접한 쌍의 연속된 레지스터로 보내지며, 리턴값은 r0, r1로 보내짐

- 구조체를 보낼 수도 있음


# PCS

1. four-register rule

: 4개 또는 그 이하의인자를 가지는 함수에서 모든 인자가 레지스터에 저장될 수 있어 효율적임

C에서 4개의 인자나, C++에서 3개이상의 외부인자가 필요할 경우 구조체가 더 효율적임

(구조체 포인터를 패싱하도록)


2. 작은 함수들은 같은 소스파일 안에 이들을 호출하는 함수 앞에 정의.

: 컴파일러는 함수 호출을 최적화 하거나 작은 함수들을 인라인 시킴, C 컴파일러는 호출될 함수를 위해 생성된 코드를 알 수 있게되어 호출할 함수 안에서 최적화가 가능


- caller는 callee가 중복되지 않는다는 것을 알 수 있어 레지스터들 보존이 필요 없음. 

caller는 ATPCS에서 중복 가능한 레지스터들을 저장할 필요가 없음

- callee가 매우 작다면 컴파일러는 호출하는 함수 안에 그 코드를 인라인 시켜 함수 호출 오버헤드를 완전히 없애줌


3. 크리티컬한 함수는 __inline 키워드로 Caller함수에 인라인 시킴. 

- 단순 정보를 주는 힌트일 뿐 컴파일러가 컴파일 할 때 사용하지는 않음.

- 큰 함수를 인라인 시키는 것은 성능향상에  별 도움이 안되며 코드 사이즈만 증가시키게 됨




'System > Embedded' 카테고리의 다른 글

[ARM] 익셉션과 인터럽트 처리 2  (0) 2015.11.10
[ARM] 익셉션과 인터럽트 처리  (0) 2015.11.10
[ARM] 32비트 ARM 명령어 2  (0) 2015.11.09
[ARM] 32비트 ARM 명령어  (0) 2015.11.09
[ARM] ARM 프로세서 개요 2  (0) 2015.11.09

+ Recent posts