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

precolored register #17

Open
minkiminki opened this issue Nov 21, 2018 · 3 comments
Open

precolored register #17

minkiminki opened this issue Nov 21, 2018 · 3 comments

Comments

@minkiminki
Copy link
Owner

minkiminki commented Nov 21, 2018

레지스터를 고려할 상황이 여럿 있다.

  1. callee save register
    고려하지 않고 register allocation을 한다. 그리고 callee save가 필요한 경우만 push, pop을 한다.

  2. caller save register
    call 인스트럭션을 실행할 때 caller save register들이 죽어있는 것으로 처리한다. 구체적으로는 call instruction 때에만 살아있는 임시 변수를 추가한다.

  3. 받은 parameter
    TODO 어렵다...
    처음에 parameter 변수로 옮기는 instruction을 추가하는 것이 가장 쉬워보인다.
    => opGetParam이라는 instruction 추가해서 완료 d923ad1

  4. 보낼 parameter
    call 전까지 살아 있는 임시변수(1)와, caller save register처럼 call 때만 차지하는 임시변수(2)를 추가한다. 또한 parameter에 넣는 변수는 (1)과 coalescing될 수 있다.
    이대로 구현은 아직 안 했음

  5. 함수 부른 뒤 return 값
    rax를 비워두고 있으므로 문제 없음(이슈 참조)

  6. 함수 끝낼 때 return 값
    rax를 비워두고 있으므로 문제 없음

  7. 특정 register를 사용해야 하는 연산
    항상 rax와 rdx를 비워두고 여기에 옮겨서 연산을 할 것

  8. 연산을 할 때 비어있어야 하는 레지스터
    항상 rax와 rdx를 비워두고 여기에 옮겨서 연산을 할 것이므로 문제 없음

@minkiminki
Copy link
Owner Author

minkiminki commented Nov 21, 2018

지금은 4에서 말한 임시변수를 정해놓고 그것만 쓰는 식이었는데 coalescing을 위해서는 매번 새로 만드는 것이 나을 듯하다(죽어있는 것을 표현하기 위한 register는 제외). => 완료

@minkiminki
Copy link
Owner Author

minkiminki commented Nov 21, 2018

arguments 채우지 않은 부분 register도 다 죽여야 하는데 지금 그렇게 처리를 안 했다. 수정할 것
=> 완료

@minkiminki
Copy link
Owner Author

전부 완료

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