2014-01-15 2 views
2

64 비트 밉 컴퓨터에 gcc 컴파일러를 사용하고 있습니다. 생성 된 어셈블리 코드에 대해 흥미로운 것을 발견했습니다. 아래에 세부 사항이 있습니다 :어셈블리 코드 (어셈블리 코드가 순서에 맞지 않음)

00000001200a4348 <get_pa_txr_index+0x50> 2ca2001f sltiu v0,a1,31 
00000001200a434c <get_pa_txr_index+0x54> 14400016 bnez v0,00000001200a43a8 <get_pa_txr_index+0xb0> 
00000001200a4350 <get_pa_txr_index+0x58> 64a2000e daddiu v0,a1,14 

00000001200a43a8 <get_pa_txr_index+0xb0> 000210f8 dsll v0,v0,0x3 
00000001200a43ac <get_pa_txr_index+0xb4> 0062102d daddu v0,v1,v0 
00000001200a43b0 <get_pa_txr_index+0xb8> dc440008 ld a0,8(v0) 
00000001200a43b4 <get_pa_txr_index+0xbc> df9955c0 ld t9,21952(gp) 
00000001200a43b8 <get_pa_txr_index+0xc0> 0320f809 jalr t9 
00000001200a43bc <get_pa_txr_index+0xc4> 00000000 nop 

일반적으로 bnez는 즉시 0xb0으로 점프합니다. 하지만 0xb0 이후의 블록에서 프로그램이 a1을 매개 변수로 사용해야한다는 것은 확실합니다. 그러나 알 수 있듯이, a1은 0xb0 다음에 블록에 나타나지 않습니다.

그러나 a1은 bnez (0x54) 바로 다음에 오는 0x58에 사용됩니다.

0x54와 0x58 명령이 동시에 실행될 수 있습니까? 수퍼 스칼라 프로세서는 프로세서상의 중복 기능 유닛에 여러 명령어를 동시에 디스패치함으로써 클럭 사이클 동안 하나 이상의 명령어를 실행합니다.

제 질문은 gcc 컴파일러가 내 CPU가이 기능을 가지고 있음을 어떻게 알 수 있습니까? gcc는 어떤 기술을 사용하고 있습니까? 이런 종류의 어셈블리 코드를 생성하기 위해 gcc를 최적화하는 옵션은 무엇입니까?

감사합니다.

답변

4

이 기능은 일반적으로 branch delay slot이라고합니다. 분기 지연 슬롯을 채울 명령어를 찾는 것은 일반적으로 최적화 컴파일러의 백엔드 스케줄링 단계에서 수행됩니다.

+0

내가 관리 할 수 ​​있기 전에 실제로 2 분 전에 동일한 답변을 올렸습니다. 그래서, 내 자리를 지우면서 업 그레 이드. O :) – dbrank0

+1

아마도 다음 질문과 관련이 있습니다. http://stackoverflow.com/questions/15375084/what-is-the-point-of-delay-slots – dbrank0