2009-06-19 12 views
8

i386 linux에서 소프트웨어 부동 소수점을 사용할 수 있습니까? 각 호출마다 커널에 트랩하는 비용이 들지 않습니까? 당신이 수, 당신은 손으로 전체 툴 체인을 부트 스트랩 원하는 하지 않는 한x86에서 소프트웨어 부동 소수점 사용 linux

$ gcc -m32 -msoft-float -lm -o test test.c 
/tmp/cc8RXn8F.o: In function `main': 
test.c:(.text+0x39): undefined reference to `__muldf3' 
collect2: ld returned 1 exit status 

답변

4

을 : 나는 -msoft 플로트를 시도했다, 그러나 일반 (우분투) C 라이브러리이없는 FP 라이브러리가 포함 보인다 uclibc toolchain으로 시작하십시오 (i386 버전, 상상해보십시오) - 소프트 플로트는 (AFAIK) debian 및 파생 제품의 "기본"컴파일에 대해 직접 지원되지 않지만 uclibc 툴 체인의 "포함 된"접근 방식을 통해 사용할 수 있습니다.

+0

응답 해 주셔서 감사합니다. buildroot를 사용하여 uclibc를 부트 스트라이핑 해 보았지만 적어도. UCLIBC_HAS_FPU 옵션에 대해 BR2_UCLIBC_CONFIG 아래 제공된 .config 파일을 무시하는 것으로 보입니다./ – bdonlan

+0

@Alex uclibc 툴체인 링크가 손상되었습니다. http://uclibc.org/toolchains.html이 적절해야합니까? – zengr

0

G'day는

당신이 붙박이 FP를 지원하지 않는 플랫폼을 표적으로하지 않는 한, 나는 당신이 FP 지원을 에뮬레이트 싶어 이유 생각할 수 없다.

x386 플랫폼에 외부 FPU가 지원되지 않습니까? 불쌍한 FPU가 내장 된 x486이 아닙니다!

제 경험상 소프트 에뮬레이션은 하드웨어에 비해 훨씬 느립니다.

그 이유는 컴파일러 제조업체가 제공 한 소프트 에뮬레이션 대신에 온보드 68k FPU를 태그 지정하기 위해 Ada에서 패키지를 작성한 이유입니다. 그들은 실제로 컴파일러에서 번들로 묶었습니다.

편집 : 아래에 의견을 보았습니다. FP 지원의 전체 제품군이 필요하지 않다면 필요로하는 몇 가지 수학 함수에 대해 스스로 롤백 할 수 있습니까? 내가 말한 에이다 패키지가 시작된 방법. GCC는 몇 가지 추가 라이브러리없이이 기능을 지원하지 않습니다

+3

우리는 임베디드 x86 CPU로 제품을 이식하려고합니다. 그 중 많은 제품에는 FPU가 없습니다. 우리는 현재 FPU가없는 플랫폼에서 실행 중입니다 만 커널에 트래핑하는 것에 대한 벌칙은 없습니다 :) – bdonlan

4

HTH

환호.가 출력 부동 소수점에 대한 라이브러리 호출을 포함하는 생성

-msoft 플로트 : the 386 documentation에서. 경고 : 필요한 라이브러리 은 GCC의 일부가 아닙니다. 일반적으로 기기의 일반적인 C 컴파일러 기능은 이지만 크로스 컴파일에서는 직접 수행 할 수 없습니다. 교차 컴파일을 위해 라이브러리 기능을 적절하게 제공하려면 직접 을 준비해야합니다. 함수가 80387 레지스터 스택의 부동 소수점 결과를 반환 기계에

, 일부 부동 소수점 옵 코드는 당신이 설정할 수 없습니다, -msoft 플로트가

또한

를 사용하는 경우에도 방출 할 수있다 - mfpmath = unit을 "none"으로 설정하면 sse, 387 또는 둘 다가됩니다.

그러나 this gnu wiki page에 따르면 fp-soft 및 ieee이 있습니다. SoftFloat도 있습니다.

(ARM의 경우 -mfloat-abi = softfp가 있지만 386 SX에서 이와 비슷한 기능을 사용할 수없는 것 같습니다.)

tcc도 소프트웨어 부동 소수점 숫자를 지원합니다.

행운을 빌어 당신에게 적합한 도서관을 찾고 있습니다.

6

코드가 soft-fp 디렉토리 내의 소스에서 명확하게 사용 가능하므로 gcc가이 기능을 기본적으로 지원하지 않는다는 것은 놀라운 일입니다. 그것은 수동으로 라이브러리를 컴파일 할 수있다 : 오류로 인해 컴파일되지 않는 몇 가지 C 파일이 있습니다

$ svn co svn://gcc.gnu.org/svn/gcc/trunk/libgcc/ libgcc 
$ cd libgcc/soft-fp/ 
$ gcc -c -O2 -msoft-float -m32 -I../config/arm/ -I.. *.c 
$ ar -crv libsoft-fp.a *.o 

하지만 대부분은 컴파일 않습니다. 우리의 소스 파일과 디렉토리에 libsoft-fp.a를 복사 한 후 그들은 지금 -msoft-float으로 잘 컴파일 :

$ gcc -g -m32 -msoft-float test.c -lsoft-fp -L. 

$ objdump -D --disassembler-options=intel a.out | less 

를 사용하여 빠른 검사가 예상대로 아무 x87 부동 소수점 명령어가 호출되지 것을 보여주고 코드 실행을 많은 예제를 사용하는 예제에서는 8 배로 상당히 느립니다.

참고 : 나는

$ gcc -c -O2 -msoft-float -m32 -I../config/i386/ -I.. *.c 

와 소프트 부동 소수점 라이브러리를 컴파일하는 것이 바람직 한 것입니다하지만

adddf3.c: In function '__adddf3': 
adddf3.c:46: error: unknown register name 'st(1)' in 'asm' 

i386 버전이 같아 같은 오류 메시지의 부하 결과 st(1)은 x87 레지스터 중 하나를 가리키며, 이는 -msoft-float을 사용할 때 분명히 사용 가능하지 않습니다. 이상하게도 운 좋게도 i386에서 arm 버전이 정상적으로 컴파일되고 정상적으로 작동하는 것 같습니다.