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를 최적화하는 옵션은 무엇입니까?
감사합니다.
내가 관리 할 수 있기 전에 실제로 2 분 전에 동일한 답변을 올렸습니다. 그래서, 내 자리를 지우면서 업 그레 이드. O :) – dbrank0
아마도 다음 질문과 관련이 있습니다. http://stackoverflow.com/questions/15375084/what-is-the-point-of-delay-slots – dbrank0