예, FPU가 없으므로 정수 연산에서 부동 소수점을 수행해야합니다. 그러나이 작업에는 두 가지 메커니즘이 있으며 한 작업은 다른 작업보다 11 배 더 빠릅니다.
GCC 타겟 arm-linux-gnu는 ARM의 첫 번째 FPU 인 "FPA"에 대한 코드에서 실제 부동 소수점 명령어를 일반적으로 포함하지만 현재는 거의 존재하지 않습니다. 이로 인해 불법적 인 명령 트랩이 야기되어 커널에서 에뮬레이트됩니다. 컨텍스트 전환으로 인해 매우 느립니다.
-msoft-float 대신 라이브러리 함수 (libgcc.a)에 대한 호출을 삽입합니다. 이렇게하면 커널 공간으로의 전환을 피할 수 있으며 에뮬레이트 된 FPA 명령보다 11 배 더 빠릅니다.
사용중인 부동 소수점 모델을 말할 필요가 없습니다. 이미 -msoft-float를 사용하여 전체 사용자 영역을 구축하고있는 것일 수 있지만, FPA 명령이없는 개체 파일인지 확인하는 것이 좋습니다. 다음을 사용하여 확인할 수 있습니다.
objdump -d file | grep '<space><tab>f' | less
file
은 컴파일러가 출력하는 개체 파일, 실행 파일 또는 라이브러리입니다. 모든 FPA 명령어는
f
으로 시작하지만 다른 ARM 명령어는 시작하지 않습니다. 그것들은 실제 공간과 탭 문자이며, 여러분의 쉘보다 탭 문자를 얻기 위해서는
<control-V><tab>
라고 말할 필요가 있습니다.
FPA insns를 사용하는 경우 -msoft-float를 사용하여 전체 사용자 랜드를 컴파일해야합니다.
이러한 문제에 대한 가장 포괄적 인 추가 정보는 입니다. 이는 arm-linux-gnueabi
컴파일러 사용, gcc-4.1.1부터 사용할 수 있으며 다른 특성을 가진 새로운 대안 ABI입니다. 자세한 내용은이 문서를 참조하십시오.
GCC 3.3 !? 그게 5 년 이상 된 걸 당신은 알고 있습니까? '실제 프로그래머'가되어 자신의 GCC 4.4.2 툴 체인을 컴파일하십시오! – LiraNuna
4.1 GCC 툴 체인을 컴파일했는데, 너무 심하게 맞았거나 놓친 것 같아서, 공급 업체가 제공 한 제품으로 돌아갔습니다. – user21293
"실제 프로그래머"에 대한 정보는 없지만 최근 GCC의 연산을 측정 한 결과, ARM의 경우 최소한 4.2는 컴파일에 걸리는 로컬 최소 시간이었고, 메모리는 컴파일에 사용되었고, 결과 객체 코드의 크기는 오브젝트 코드가 실행되는 데 걸린 시간. 4.3 이후 모든 네 세트의 기하 급수적 인 성장. – martinwguy