2012-05-16 2 views
1

GCC에 아키텍처의 표준 ABI와 달리 레지스터를 사용하는 코드를 생성하도록 요청할 수 있습니까?GCC4 - ARMv5 레지스터 할당

ARMv4 칩 (LPC2000)을 사용하고 있으며 빠른 인터럽트가 더 빠릅니다.

FIQ 루틴이 있지만 스택에 r0..r7을 저장해야합니다. 레지스터 R8..r15의 자체 뱅크이므로 FIQ 모드로 간주하지 않습니다. 대신 스택을 푸시하고 팝하는 데 사용되는 16 개의 명령 사이클을 저장하고 싶습니다.

아무도 분명히하기 전에 : 어셈블리 언어로 FIQ 처리기를 다시 작성하십시오. 예, 필자는이 작업을 수행 할 수 있음을 알고 있습니다.이 질문은보다 구체적입니다.

GCC4가 함수 내에서 레지스터를 할당하는 순서를 변경하도록 지시하는 #pragma 또는 __attribute__ 또는 스위치가 있습니까?

+0

방금 ​​ASM을 사용하거나 컴파일해야 그 정도의 성능에 관심이 있다면 C 코드는 결과를 직접 수정/조정합니다. 그렇지 않으면 사소한 isr (asm에서 구현하기가 간단합니다) 이외에는 아무것도 얻지 못할 것입니다. –

+0

참고로 lpc2000을 읽었을 때 ARM7TDMI는 ARMv4가 아니며 ARMv5가 아닙니다. –

+0

@dwelch : 오타가 수정되었습니다. 이 질문은 변경되지 않으며 여전히 v5에 영향을 미칩니다. –

답변

3

A.이 당신이 interrupt 프라그와 함수를 선언 할 때 정확하게 멀리 최적화해야합니다

void f() __attribute__ ((interrupt ("FIQ"))); 

가 출처 : http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#Function-Attributes

B. 그러나 내가 오픈 버그 리포트를 찾을 수를 그 이 현재 관련 레지스터의 푸시/팝을 최적화하지 않습니다. 버그 보고서는 '놓친 최적화'로 분류 된 6 월에 확인 된 이후 열려있다 2011 년

출처 : http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48429

+0

예 "FIQ"인터럽트에 대해 알고 있지만 그렇습니다. 내가 원하는 코드를 생성하지 않습니다. 나는 내가 벌레를 발견했다는 것을 몰랐다. workaround가 있습니까? –

+0

@JasonMorgan - 해결 방법이 있는지 모르겠습니다. 버그 보고서에서 내가 수집 한 것은'r8'을 함수에서 사용하는 것이이 속성을 사용할 때 '기대되는 행동'이라는 것입니다. 나는 아마 그것을 사용하고, 수정을 기다릴 것이다. 또는 패치로 도움을 청하십시오. – ArjunShankar

관련 문제