컴파일러가 명령 재 스케쥴링 후에 생성하는 것과 동일한 순서로 디스 어셈블 된 코드를보고 싶습니다. bt.w 나는 GDB를 사용하고 있는데, 명령어를 disas /m FunctionName
으로하면 소스 코드 순서대로 분해 된 코드를 제공한다. 나는 나의 컴파일러 (GCC 4.1)에 의한 명령 재 스케줄화의 효과를 보려고 노력하고 있으며 명령이 어떻게 재 계획되는지를보고 싶다. 감사합니다. /////////////////// EDITS ///////////////////////////////// 코드의 라인 디스 어셈블 된 코드를 살펴본 후 을 ////////// :컴파일러에서 생성 한 코드를 분해하는 방법은 무엇입니까?
double w_n = (A_n[2] * x[0] + A_n[5] * y + A_n[8] * z + A_n[11]) ;
내가 지시의 그것의 83 바이트를 볼 수 있었다. 그러나이를 2 번 반복하여 펼친 후 :
double w_n[2] = { (A_n[2] * x[0] + A_n[5] * y + A_n[8] * z + A_n[11]), (A_n_2[2] * x[0] + A_n_2[5] * y + A_n_2[8] * z + A_n_2[11]) };
코드 블록은 226 바이트입니다. 그리고 명령 수는 엄청나게 증가합니다. 아무도 왜 이런 일이 일어 났는지 말할 수 있습니까? 또한 언 롤링 후에 은퇴 한 지침이 VTune에서 볼 수 있습니다. 생각할 수있는 이유 : 컴파일러가 간단한 명령어를 생성하기 위해 블록 크기를 늘릴 수있는 충분한 기회를 얻음으로써 명령어 프리 페치 및 디코더 유닛의 처리량을 극대화합니다.
도움을 주시면 대단히 감사하겠습니다. 감사!!
clang과 llvm을 사용하면 관심있는 패스를 적용하고 x86 또는 기타 코드를 생성하기가 더 쉽습니다. –
참조 http://stackoverflow.com/questions/137038/how-do- 어셈블러 출력 - cc-source-in-gcc –