문제

컴파일러 설계에서 발신자 또는 Callee Register 저장 배열을 갖는 대신 발신자가 사용한 레지스터 목록 (발신자 저장 배열의 경우 푸시 할 경우)을 Callee로 전달하여 Callee가 ITS를 비교할 수 있도록합니다. 발신자가 사용하는 레지스터에 중고 레지스터 목록. 그런 다음 실제로 밀어야하는 레지스터 만 밀어옵니다. 내가 뭔가를 놓치고 있습니까?

도움이 되었습니까?

해결책

흥미로운 아이디어입니다. 매력적이지 않은 두 가지가 있다고 생각합니다.

  • Callee는 최악의 경우에도 스택 공간을 예약해야합니다.
  • 효율적으로하려면 한 번에 레지스터 세트를 저장하고로드하는 데 특별한 지침이 필요합니다. 이러한 지시는 Motorola 68000 (그리고 아마도 PowerPC)에 있었지만 인기는 없었습니다.

다음은 어떻게 작동 해야하는지에 대한 약간의 정교함이 있습니다. 발신자가 목록을 약간 벡터로 기계 단어로 포장하기를 원할 것입니다. 그런 다음 Callee를 Bitwise로 제공하고 자체 목록을 사용하여 결과 비트 벡터가 지명 한 모든 레지스터를 저장하는 지침이 있습니다.

최악의 경우 스택에 공간을 예약해야하기 때문에 현대적인 슈퍼 스콜 라 외곽 프로세서에서는 같은 캐시 라인에 쓰는 것이 거의 무료입니다.

또한 실제로 원하는 것이 런 타임에로드 및 저장 수를 최소화한다면 모든 발신자 사료 레지스터를 사용하는 것도 사실입니다. 이 전략은 또한 예외를 높이고 스레드와 많은 컴파일러 ( OCAML) 그런 이유로 사용하십시오. Callee-Saves 레지스터는 유출 및 재 장전 지침의 코드 크기를 줄이려는 일종의 해킹입니다. 그들은 많은 상황에서 작동하며 통화 사이트가 절차 정의를 훨씬 능가하기 때문에 공간을 절약합니다 (평균적으로 절차에는 여러 통화가 포함되어 있음).

발신자 사본과 Callee-Saves 레지스터 간의 상충 관계에 대한 자세한 내용은 다음과 같습니다. Jack Davidson과 David Whalley의 멋진 종이.

다른 팁

그것은 매우 비효율적입니다 ... 당신은 완전히 불필요한 목록 (모든 함수에 대해)을 구문 분석해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top