Open minkiminki opened 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를 빈 레지스터로 사용하면 괜찮을듯?
연산마다 레지스터가 하나씩은 필요하다. 그것을 어떻게 표현할지? 두가지 방법이 가능
각 연산마다 임시 레지스터를 둔다. 이것은 메모리에 들어갈 수 없다.
하나의 레지스터는 항상 비워둔다.
결국 문제는 그래프 컬러링 알고리즘이 얼마나 잘 작동하냐이다. 일단 무난하게 2번으로?