2

저는 현재 MIPS 아키텍처를 목표로 숙제로 a toy compiler을 작성하고 있습니다. 호출자-저장됩니다 s0s7, 그리고 호출자가 저장되어 t9-t0 :MIPS 컴파일러의 레지스터 - 사용할 레지스터?

18 개보다 높은 수준의 언어로 번역 할 때 일반적으로 사용할 수있는 레지스터가 있습니다.

이 18 개의 레지스터를 사용할 수있는 경우, 함수의 변환을 수행 할 때 어느 레지스터를 선호해야합니까?

  1. 호출 수신자 저장 레지스터에 저장

    가 각각 처음에 스택 기능의 끝에서 복원해야

    각 세트는 장단점이있다.

  2. 호출자 저장 레지스터는 서브 루틴 호출 전후에 스택에 저장하고 스택에서 복원해야합니다.

이러한 레지스터를 사용하여 정적 전략을 채택한 경우 - 호출자가 저장 한 레지스터보다 호출 수신자 저장 레지스터를 선호하는 것과 같은 전략이 무엇이든간에 - 나는 아마도 거기에서 가장 좋은 성능을 얻지 못할 것입니다. 불필요한 레지스터로드/저장이됩니다.

그럼이 두 세트의 레지스터를 사용하는 좋은 습관이 있습니까?

답변

2

여기 미세한 세분성의 레지스터 할당 냉기의보다 나은 솔루션이다 :

먼저 우리가 각각의 변수에 대한 라이브 니스 분석을 수행하고 :

  • 가변 들어있는이 걸쳐 유효화 간격 함수 호출 : 호출자가 저장 한 레지스터보다 호출 수신자가 저장 한 레지스터를 선호합니다.
  • 활성화 간격이 함수 호출을 스팬하지 않는 변수의 경우 호출자가 저장 한 호출 간격보다 호출 수신자가 저장 한 호출 간격보다 우선합니다.
2

잎이 아닌 함수에서 호출 수신자 저장 레지스터를 선호하고 리프 함수에서 호출자 저장 레지스터를 선호합니다.

나뭇잎과 한 레벨의 호출 트리에서 조금만 행운을 남기면 아무런 절약 효과가 없습니다.