2010-03-10 4 views
7

는 가끔 인라인에 가장 적합한 후보가 될 것으로 보인다왜 델파이 컴파일러는 어셈블리 함수를 인라인하지 않습니까?

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 년 오래 된 오픈 report on QC이 존재한다. 이 보고서에는 asm 지시문 확장과 같은 몇 가지 제안이 포함되어있어 컴파일러에 대한 asm 인라인을 단순화합니다. 컴파일러에게 프로 시저에 대한 스택 프레임을 생성 할 필요가 없다는 것과 선택적으로 어떤 레지스터 (eax, edx 및 ecx 중)를 보존해야하는지에 대해 말하는 "알몸"지시문을 프로 시저/함수 수준에서 소개하는 것을 선호합니다.

BASM 코드를 사용하여 효율적인 인라이닝 절차를 수행하는 것이 일반적이지 않은 경우 (그리고 unessessary 일 수있는 경우) 가장 중요한 경우 (명시 적으로 선언 된 레지스터 사용이 포함 된 알몸 함수)에 대한 인라이닝을 활성화하는 것이 좋습니다.

+0

결과 (예 : ... : Integer; register;) 다음에 레지스터 호출 규칙을 추가하여 컴파일하는 동안 다른 호출 규칙이 사용될 때 함수가 작동하는지 확인해야합니다. –

+2

컴파일러가 인라인 어셈블러 기능을 지원할 미래의 가능성에 대해 토론하고 싶다면 QC 또는 게시판이 가장 적합한 방법 일 것입니다. 나는 순간적으로 asm 블록을 가진 함수를 인라인 할 수 없다는 대답을 시도했다. 당신은 그것이 좋은 생각이라고 생각할지도 모릅니다. (헤이, 저는 집회가 좋고 좋을 것이라고 생각합니다.) 하지만 컴파일러에 대한 기능 요청을 논의 할 수있는 곳은 무엇입니까 ?? 나는 네가 당면한 문제에 대한 답을 원한다고 생각했다. 왜 내가 이것을 인라인 할 수 없는지. –

+0

@Ritsaert Hornstra : 왜 SO가 컴파일러의 기능 요청을 논의 할 곳이 아니라고 생각합니까? 그것은 분명히 프로그래밍 질문이며, 최선의 방법으로 구현하는 방법과 [아직 수사학적인 질문 인] 왜 그 일이 아직 구현되지 않은가에 대한 해답이되어야합니다. – kludg

답변

10

품질 중앙 보고서 # 9283 (및 투표)을 참조하십시오. 기본적으로 문제는 컴파일러가 인라인 코드 전에 보존 할 레지스터와 이후에 복원 할 대상을 이해할 수 있어야한다는 것입니다. 컴파일러가 레지스터를 처리하는 한 사용이 쉽지 않을 때 컨트롤은 쉽지 않습니다. 예제는 매우 간단하지만 컴파일러는보다 복잡한 경우를 처리 할 수 ​​있어야합니다. 이 보고서는 공개 된 상태이며 새로운 컴파일러가 BASM 코드를 인라인 할 수 있기를 희망합니다.

5

수공예품 어셈블리 코드를 인라인으로 연결할 수 없습니다.

어셈블러 조각을 인라이닝 할 수없는 것은 매우 어려울 것입니다. 일반적인 인라이닝을 사용하여 레지스터 사용에 대한 모든 종류의 효과, 로컬 변수 등은 컴파일러가 인라인 어셈블리와 함께 할 수 없다는 것을 의미합니다.

+0

위의 어셈블리 함수를 인라인하는 데 문제가 없습니다. 실제로 그것은 순수 파스칼 함수를 인라인하는 것보다 훨씬 단순 해 보입니다. – kludg

+4

간단하다고 생각한다면 EMbarcadero는 새로운 컴파일러 전문가로서 당신을 고용해야합니다 :-). 농담하지 않는다 : 어렵다. 컴파일러는 텍스트 (렉싱) 토큰 (구문 분석) 구문 트리 (최적화) 구문 트리 -> ... -> (코드gen) 컴퓨터 코드의 여러 단계 (델파이 컴파일러는 내부에서 알지 못합니다)를 수행합니다. 이제 인라인 assemply 일부 추상 구문 트리로 작업하는 최적화 단계에서 분석하기가 매우 어렵습니다. –

+0

이유가 표시되지 않습니까? 그것은 할당 된/수정 된 레지스터를 찾기 위해 앞에서 뒤로 간단한 선형 스캔입니다. BP는 BP를 사용하는 경우 스택 프레임 설정과 같은 일부 휴리스틱 스 (heuristics)입니다. 만약 % esp와 같은 이상한 구문이 발견되면 인라인을 사용할 수 없게됩니다. 기초 작업을하는 것은 이미 좋을 것입니다. –

관련 문제