minkiminki / gocompa

Advanced Compiler Construction project
2 stars 0 forks source link

Register Allocation 계획 #8

Open minkiminki opened 6 years ago

minkiminki commented 6 years ago

연산마다 레지스터가 하나씩은 필요하다. 그것을 어떻게 표현할지? 두가지 방법이 가능

  1. 각 연산마다 임시 레지스터를 둔다. 이것은 메모리에 들어갈 수 없다.

    • 장점 : 그래프 컬러링 알고리즘이 잘 작동할 경우 필요한 레지스터 개수를 최소화 할 수 있다.
    • 단점 : coalescing 알고리즘이 좋지 않다면 좋지 않은 결과를 낼 수도 있다.
  2. 하나의 레지스터는 항상 비워둔다.

    • 장점 : 간단하다. 그래프 컬러링 알고리즘의 성능이 안 좋다면 이게 더 좋을 수 있다.
    • 단점 : 잘 작동한다면 1이 완벽한 방법이다.

결국 문제는 그래프 컬러링 알고리즘이 얼마나 잘 작동하냐이다. 일단 무난하게 2번으로?

minkiminki commented 6 years ago

caller save는 단순히 call 때 그 레지스터들이 이미 사용중인 것으로 표현한다.

callee save는 임시 레지스터를 만들어서 처음에 그 값을 저장했다가 나중에 다시 저장하는 것으로 표현. 지금 snuplc는 로컬 변수를 전부 0으로 초기화 한다. 이것도 그냥 mov 연산으로?

이렇게 한다면 push, pop 연산은 아예 불필요해진다.

인스트럭션은 다음 표를 참조하자. https://www.agner.org/optimize/instruction_tables.pdf

레지스터가 정해진 연산은 integer 곱셈, 나눗셈이다(imul, idiv). 둘 다 eax이다. 방식 2로 갈 때 eax를 빈 레지스터로 사용하면 괜찮을듯?