Delphi 컴파일러가 어셈블리 함수를 인라인하지 않는 이유는 무엇입니까?
문제
때로는 다음과 같은 매우 짧은 어셈블리 함수를 작성합니다.
function SeniorBit(Value: LongWord): Integer;
asm
OR EAX,EAX
JZ @@Done
BSR EAX,EAX
INC EAX
@@Done:
end;
이것이 인라인 처리에 가장 적합한 후보인 것 같습니다.
function SeniorBit(Value: LongWord): Integer; inline;
하지만 델파이 컴파일러는 이를 허용하지 않습니다.왜?
업데이트됨:
ldsandon 덕분에 5.5년 된 오픈 소스가 생겼습니다 QC 보고.보고서에는 컴파일러의 asm 인라인을 단순화하기 위한 몇 가지 제안(예: asm 지시문 확장)이 포함되어 있습니다.나는 프로시저에 대한 스택 프레임을 생성할 필요가 없으며 선택적으로 어떤 레지스터(eax, edx 및 ecx 중에서)가 보존되어야 하는지를 컴파일러에 알려주는 프로시저/함수 수준에 "naked" 지시어를 도입하고 싶습니다.
BASM 코드를 사용한 효율적인 인라인 처리 절차의 일반적인 작업이 어려우며 불필요할 수 있는 경우 가장 중요한 경우(예: 명시적으로 선언된 레지스터 사용이 포함된 기본 함수)에 대해 인라인 처리를 활성화하는 것이 좋습니다.
해결책
Quality Central 보고서 #9283을 참조하고 이에 투표하십시오.기본적으로 문제는 컴파일러가 인라인 코드 이전에 보존할 레지스터와 이후에 복원할 레지스터를 이해할 수 있어야 한다는 것입니다.컴파일러가 레지스터를 처리하는 한 쉽습니다. 사용이 제어되지 않는 경우에는 그렇지 않습니다.귀하의 예는 매우 간단하지만 컴파일러는 더 복잡한 경우를 처리할 수 있어야 합니다.보고서는 공개 상태입니다. 새 컴파일러가 BASM 코드도 인라인할 수 있기를 바랍니다.
다른 팁
손으로 제작 된 어셈블리 코드를 인라인 할 수 없습니다.
이 어셈블러 조각을 인화하는 것은 매우 어려울 것입니다. 레지스터 사용에 대한 모든 종류의 영향을 정상으로 인라인하면 컴파일러가 인라인 어셈블리를 사용하여 할 수없는 로컬 변수 등이 있습니다.