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

c = a @ b 꼴에서 c<-b, c<-a의 경우 나누기 #12

Open
timedilation opened this issue Nov 8, 2018 · 6 comments
Open

c = a @ b 꼴에서 c<-b, c<-a의 경우 나누기 #12

timedilation opened this issue Nov 8, 2018 · 6 comments

Comments

@timedilation
Copy link
Collaborator

c <- a
c <- c+b
vs
c <- b
c <- c+a
구분할것인가

@timedilation
Copy link
Collaborator Author

timedilation commented Nov 8, 2018

a=c/a=b일 경우는 그냥 테스트하기로
b,a가 레지스터이고 이후에 레지스터가 더이상 안 쓰일 경우는 좀 더 고민해보기로

(보충 by minki)
b랑 c가 같은 레지스터에 할당된 경우 mov를 한번 아낄 수 있다. 그런데 더 공격적으로 c랑 a가 같은 레지스터에 할당된 경우도,
c <- b; c <- c+ac <- a; c <- c+b로 바꾸어서 컴파일하여 mov를 아끼는 것을 생각해볼 수 있다.
and, or, +, mul은 commuative하므로 전부 이런 방법을 사용할 수 있다.

@minkiminki
Copy link
Owner

/는 eax, edx를 전부 사용하게 강제되고 있다. /연산을 할 때는 다른 변수에 edx 레지스터가 못 할당되게 강제해야 한다.

@timedilation
Copy link
Collaborator Author

Operand가 Reference일 경우 조금 문제가 있음.

예시) arr[0] 에 1을 넣는다
arr[0]의 주소가 N(%rbp)에 들어가있음 -> 해당 operand type은 CTacReference
이 때
mov N(%rbp), %rdi
mov 1, (%rdi)
이렇게 rdi라는 주소를 담을 레지스터가 필요해짐 (M[M[~]] 을 할 수는 없으니)
레지스터라면 그냥 M[R]를 하면 되는데, M이 여러개인 경우 문제가 생김.
ex) arr[0] + arr[1] -> arr[2] 는 어떻게 되는가?
add (a(%rbp)), (b(%rbp))
mov (b(%rbp)), (c(%rbp))
를 해야 하는 상황, 최소 두개의 레지스터가 필요함
일단 현재는 rdi를 push하고, rdi를 사용한다음 다시 pop하는 방식으로 구현할 예정.

@timedilation
Copy link
Collaborator Author

timedilation commented Nov 11, 2018

src, dest가 모두 reference인 경우
ir 단계에서 임시변수 만들어서 더한 결과 넣으므로 고려할 필요가 없을 것으로 보임!

19   a[2] := a[0] + a[1]

이 코드가

162     movl    (%edi), %eax            #  30:     add    t24 <- @t17, @t23
163     movl    -80(%ebp), %edi
164     movl    (%edi), %ebx
165     addl    %ebx, %eax

188     movl    -84(%ebp), %eax         #  38:     assign @t30 <- t24
189     movl    -112(%ebp), %edi
190     movl    %eax, (%edi)

이렇게 변함

@timedilation
Copy link
Collaborator Author

add    t24 <- @t17, @t23

그러나 이부분이 문제이므로..
rax, rdx 두 개를 다 비워놓고 임시로 사용하기로 함.
rdx는 3rd param인데, param 이후에 연산을 하는 경우가 있는지 확인 필요함

@minkiminki
Copy link
Owner

연산마다 사이즈를 고려해서 레지스터를 골라야 해서 좀 귀찮다...

우선은 쉽게 모든 연산은 값을 rax, rdx로 옮겨서 연산하는 것으로 구현할 것이다.
작동하게 만든 다음에 그 다음에 개선시키기

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

No branches or pull requests

2 participants