문제

시뮬레이터를 사용하여 이미 기존 아키텍처 (x86)의 아키텍처 변경 사항을 테스트하고 싶습니다. 그러나 올바르게 테스트하고 벤치 마크를 실행하려면 명령어 세트를 변경해야 할 수도 있습니다. 이러한 변경 사항을 GCC 또는 다른 컴파일러에 추가 할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

간단한 해결책 :

일반적인 접근법 중 하나는 인라인 어셈블리를 추가하고 명령어 바이트를 직접 인코딩하는 것입니다.

예를 들어:

int main()
{
    asm __volatile__ (".byte 0x90\n");
    return 0;
}

컴파일 (gcc -o3)에 :

00000000004005a0 <main>:
  4005a0:       90                      nop
  4005a1:       31 c0                   xor    %eax,%eax
  4005a3:       c3                      retq

따라서 0x90을 Inst 바이트로 교체하십시오. 물론 일반 objdump에서 실제 명령을 보지 못하고 프로그램이 시스템에서 실행되지 않을 수 있지만 (NOP 조합 중 하나를 사용하지 않는 한) 시뮬레이터는 올바르게 구현 된 경우이를 인식해야합니다.

이 명령어를 알지 못할 때 컴파일러가 자신에게 잘 최적화 될 것으로 기대할 수 없으며, 상태 (레지스터, 메모리)가 변경되면 인라인 어셈블리 클로버/입력/출력 옵션을 관리하고 작업해야합니다. 정확성을 확인하십시오. 필요한 경우에만 최적화를 사용하십시오.


복잡한 솔루션

대안적인 접근 방식은 컴파일러에서이를 구현하는 것입니다. GCC에서 수행 할 수 있지만 의견에 언급 된대로 LLVM은 아마도 컴파일러 개발 플랫폼으로 설계되었으므로 여전히 플레이하기에 가장 좋은 것 중 하나 일 것입니다. 그러나 여전히 매우 복잡합니다. LLVM은 IR 최적화 단계에 가장 적합하며 대상 별 백엔드를 수정하려고 할 때 다소 친숙하지 않습니다.
그럼에도 불구하고, 그것은 가능하며, 컴파일러 가이 명령을 발행 할시기를 결정하도록 계획한다면 그렇게해야합니다. 그러나 첫 번째 옵션에서 시작하여 시뮬레이터 가이 추가로 작동하는지 확인하고 컴파일러 측에서 시간을 보내는 것이 좋습니다.

LLVM에서 이것을 구현하기로 결정한 경우, 가장 좋은 방법은 본질적인 기능으로 정의하는 것입니다. 여기에는 이에 대한 문서가 비교적 더 있습니다. http://llvm.org/docs/extendingllvm.html

다른 팁

"머신 설명"이라는 GCC에서 파일 그룹을 수정하여 새 지침을 추가하거나 기존을 변경할 수 있습니다. 지시 패턴 <target>.md 파일, 일부 코드 <target>.c 파일, exticates, 제약 등. 이 모든 것이 있습니다 $GCCHOME/gcc/config/<target>/ 폴더. RTL에서 Generation Of Generation ASM 코드를 사용하는이 모든 것들. 다른 일반 GCC 소스 파일을 변경하여 방출 지침의 경우를 변경하고 SSA 트리 생성을 변경, RTL 생성을 변경하지만이 모든 것이 약간 복잡합니다. 무슨 일이 있었는지 간단한 설명 :

https://www.cse.iitb.ac.in/grc/slides/cgotut-gcc/topic5-md-intro.pdf

그것은 가능하고, 나는 그것을했지만 지루합니다. 기본적으로 기존 플랫폼을 모델로 사용하여 컴파일러를 새로운 플랫폼으로 포팅하는 프로세스입니다. GCC 어딘가에 명령어 세트를 정의하는 파일이 있으며 컴파일 중에 추가 코드 및 데이터를 생성하는 다양한 프로세스를 거칩니다. 내가 한 지 20 년이 넘었으므로 모든 세부 사항을 잊어 버렸습니다. 죄송합니다.

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