Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Register Allocation 계획 #8

Open
minkiminki opened this issue Nov 3, 2018 · 1 comment
Open

Register Allocation 계획 #8

minkiminki opened this issue Nov 3, 2018 · 1 comment

Comments

@minkiminki
Copy link
Owner

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

  1. 각 연산마다 임시 레지스터를 둔다. 이것은 메모리에 들어갈 수 없다.
  • 장점 : 그래프 컬러링 알고리즘이 잘 작동할 경우 필요한 레지스터 개수를 최소화 할 수 있다.
  • 단점 : coalescing 알고리즘이 좋지 않다면 좋지 않은 결과를 낼 수도 있다.
  1. 하나의 레지스터는 항상 비워둔다.
  • 장점 : 간단하다. 그래프 컬러링 알고리즘의 성능이 안 좋다면 이게 더 좋을 수 있다.
  • 단점 : 잘 작동한다면 1이 완벽한 방법이다.

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

@minkiminki
Copy link
Owner Author

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

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

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant