5

내 C 코드에 인라인 ARM 어셈블리를 작성하고 싶습니다. 이 코드에서는 함수에 입력 및 출력으로 선언 된 것 이상으로 레지스터 또는 두 개 이상의 레지스터를 사용해야합니다. GCC에 계산을 위해 여분의 레지스터를 사용할 것이라고 clobber 목록을 사용하는 방법을 알고 있습니다.GCC에서 인라인 ARM 어셈블리를 사용할 때 사용되는 레지스터 최적화

그러나 GCC는 어떤 레지스터가 최적화 될 때 어떤 레지스터를 사용하는지에 대해 자유롭게 움직일 수 있다고 확신합니다. 즉, 계산을 위해 고정 된 레지스터를 사용하는 것은 좋지 않은 생각입니다.

고정 레지스터를 사용하지 않고도 인라인 어셈블리의 입력이나 출력이 아닌 추가 레지스터를 사용하는 가장 좋은 방법은 무엇입니까?

P. 나는 더미 출력 변수를 사용하는 것이 트릭을 할 수 있다고 생각했지만 어떤 종류의 이상한 효과가 있을지 확신하지 못했습니다. ...

+0

나는 이것을 직접적으로 가능하다고 생각하지만, C 전문가가 이것을 대답하게 할 것입니다. :-) – Noldorin

+1

나는 당신이 레지스터 앨리어스 (alias)를 사용할 수 있고 컴파일러가 어떤 레지스터를 사용하고자하는지 선택할 수 있지만 그 문법을 기억할 수는 없다는 것을 알고있다. 또는 탄환을 물고 단지 .s 파일을 작성하여 융통성있게 별도로 조립할 수도 있습니다. –

+1

@MichaelDorgan 귀하의 의견을 보내 주셔서 감사합니다. 나는 입출력 레지스터가 그런 식으로 작동한다는 것을 알고 있지만 임시 레지스터에 사용되는 것을 보지 못했습니다. 두 번째 해결 방법은 내가 필요로하는 것과 반대입니다. 더 많은 최적화 옵션을 제거합니다 입력 및 출력 레지스터 지정) ... – Madcowswe

답변

5

좋아요, 나는 아이디어를 뒷받침하는 소스를 발견했습니다. 하드 레지스터 대신 더미 출력 사용 :

4.8 임시 레지스터 : 때때로 임시 레지스터에 clawbers를 잘못 사용하는 경우가 있습니다. 더미 출력을 구성하는 올바른 방법은 이며 허용 된 겹침 에 따라 "= r"또는 "= & r"을 사용하십시오. GCC는 더미 값에 대한 레지스터를 할당합니다. 차이점은 GCC가 편리한 레지스터를 선택할 수 있기 때문에 더 유연합니다.

this pdf.

GCC this 웹 사이트의 인라인 어셈블리에 대한 자세한 정보는 매우 유익한 것으로 밝혀졌습니다.

+0

지난 주에 AArch64에서 gcc가 하드 코딩되었을 때 gcc가 더 나은 코드 토핑과 꼬리말을 생성한다는 것을 발견했다. (실제로'w2, % [input1], % [input2] ('add % [fakeoutputastemp], % [input1], % [input2]'와 같은) 속임수를 쓰는 것보다 더 낫습니다. 물론 YMMV. 내 사례 : http://stackoverflow.com/questions/28325569/can-pretty-variable-names-be-used-for-registers-in-gcc-inline-assembly. 호출 규칙을 알고있는 경우 arg를 푸시하지 않고 너무 높지 않은 임시 reg를 선택할 수 있습니다. – ahcox