Delphi 컴파일러가 어셈블리 함수를 인라인하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2414964

문제

때로는 다음과 같은 매우 짧은 어셈블리 함수를 작성합니다.

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 코드도 인라인할 수 있기를 바랍니다.

다른 팁

손으로 제작 된 어셈블리 코드를 인라인 할 수 없습니다.

이 어셈블러 조각을 인화하는 것은 매우 어려울 것입니다. 레지스터 사용에 대한 모든 종류의 영향을 정상으로 인라인하면 컴파일러가 인라인 어셈블리를 사용하여 할 수없는 로컬 변수 등이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top