4fe0073365de3ad21533ffd089f9ae7732c84aec
임시값마다 스택 슬롯을 주던 것을 바꿨다. ebx, esi, edi 세 개를 나눠준다 -- eax/ecx/edx 는 이 방출기가 계산하는 자리이고, 남는 셋은 호출을 저장 없이 넘긴다. IR 은 '임시값은 블록을 넘지 않는다'로 설계했지만 lowering 이 실제로는 넘기는 것을 만든다 -- 경계 검사가 인덱스를 계산한 자리와 쓰는 자리 사이에서 블록을 쪼갠다. 그래서 자격은 함수 전체를 보고 정하고, 블록 안의 선형 스캔은 살아남은 것만 다룬다. 그리고 목적지 레지스터에 직접 계산한다. 상수, 적재, 주소, 그리고 전폭 산술과 비교가 스크래치 레지스터를 거치지 않는다. 좁은 연산은 여전히 eax 를 거친다 -- esi 와 edi 에는 바이트 반쪽이 없다. 버그 둘: - 프롤로그에 ebx 를 넣는 편집이 copy 의 push 까지 같이 바꿔서 pop 없는 push 가 생겼다. 스택이 어긋나 17개가 죽었다. - load_place_base 가 load_temp 을 거치지 않고 슬롯을 직접 읽었다. 레지스터에 있는 포인터를 쓰지 않은 메모리에서 읽었다. calc 4437 -> 3796 줄 (-14%) wordfreq 6023 -> 5348 줄 214/214, 26/26.
Description
doslang mirror
914 KiB
Languages
C
94.2%
Python
3%
Assembly
2%
JavaScript
0.6%