๐ ์์ธ ์ ๋ฆฌ#
- CSAPP 5.5 Reducing Procedure Calls ์์ ์ต์ ํํ ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ๋ก ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
1 . L17: loop:
2 vmovsd (%rbx), %xmm0 Read product from dest
3 vmulsd (%rdx), %xmm0, %xmm0 Multiply product by data[i]
4 vmovsd %xmm0, (%rbx) Store product at dest
5 addq $8, %rdx Increment data+i
6 cmpq %rax, %rdx Compare to data+length
7 jne .L17 If !=, goto loop- ๋ฌธ์ ์ ์ด ์กฐ๊ธ ๋ณด์ธ๋ค.
- dest๋ %rbx์ ์ ์ฅ๋์ด์๊ณ , ๋ฐ๋ณต๋ฌธ ์ธ๋ฑ์ค i๋ %rdx์, ๋ฃจํ ์ข ๋ฃ๋ %rax์ ๊ฐ์ด๋ ๋น๊ตํ๋ฉด์ ๊ฐ์งํ๋ค.
- dest, ์ฆ %rbx๋ฅผ ๊ณ์ํด์ ์ฝ๊ณ ์ฐ๊ณ ํ๊ณ ์๋ค!! ๊ทธ๋ด ํ์๊ฐ ์๋๋ฐ.
1 /* Accumulate result in local variable */
2 void combine4(vec_ptr v, data_t *dest)
3 {
4 long i;
5 long length = vec_length(v);
6 data_t *data = get_vec_start(v);
7 data_t acc = IDENT;
8
9 for (i = 0; i < length; i++) {
10 acc = acc OP data[i];
11 }
12 *dest = acc;
13 }- ๊ทธ ํํธ๋ฅผ ์์ ๊ฐ์ด ์์ ํด๋ณด์.
- data_t acc๊ฐ ์๊ธด๊ฒ ์ฐจ์ด์ ์ด๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค์ ์ฝ์ง ์๊ณ , ๋ ์ง์คํฐ ํ๋์์ ๊ณ ์ ํด์ ๊ณ์ฐํ ์ ์๊ฒ ๋์์ผ๋ฏ๋ก ํจ์ฌ ๋นจ๋ผ์ง๋ค!
- ์ด๋ ์ปดํ์ผ๋ฌ ์ต์ ํ๋ก ์ ์๋์ผ๋ก ์กํ์ง ์์์๊น?
- *dest๊ฐ v์ ์์์ฟ๋ค๊ณ ์๊ฐํด๋ณด์. ์ด๋ฐ alias๊ฐ ๋ฐ์ํ๋ค๋ฉด, ๋ง์๋๋ก ๋ฐ๊พธ๋๊ฒ๋ง์ผ๋ก๋ ๋ฐฐ์ด์ด ํผ์๋๋ฉด์ ๊ฐ์ด ๋ฌ๋ผ์ง๊ฒ ๋๋ค!!
- ๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๋ ๊ทธ๋ฐ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ต์ ํํ์ง ๋ชปํ๊ณ , ๋๋ฆฌ๊ฒ ์๋ํ๋ค.
