Ответ 1
GCC не может делать это без каких-либо дополнительных библиотек. В принципе, -msoft-float
просто генерирует вызовы для библиотек с плавающей запятой, но требуемые библиотеки не являются частью GCC.
Чтобы связать библиотеки soft-fp
, вы можете использовать переключатель -lsoft-fp
.
X86_64 содержит расширения SSE, поэтому компилятор попытается создать SSE-код для основных операций, таких как + - */. Мы будем использовать переключатель -mno-sse
, чтобы предотвратить это несанкционированное поведение.
Он может выглядеть следующим образом:
gcc -g -msoft-float -mno-sse -m64 -lsoft-fp
Для кода:
int main()
{
float a = 10;
float b = 20;
float c = a * b;
return 0;
}
Результирующая сборка будет:
.file "12.cpp"
.def __main; .scl 2; .type 32; .endef
.def __mulsf3; .scl 2; .type 32; .endef
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
pushq %rbp
.seh_pushreg %rbp
movq %rsp, %rbp
subq $48, %rsp
.seh_stackalloc 48
.seh_setframe %rbp, 48
.seh_endprologue
call __main
movl .LC0(%rip), %eax
movl %eax, -4(%rbp)
movl .LC1(%rip), %eax
movl %eax, -8(%rbp)
movl -8(%rbp), %edx
movl -4(%rbp), %ecx
call __mulsf3
movl %eax, -12(%rbp)
movl $0, %eax
addq $48, %rsp
popq %rbp
ret
.seh_endproc
.section .rdata,"dr"
.align 4
.LC0:
.long 1092616192
.align 4
.LC1:
.long 1101004800
.ident "GCC: (GNU) 4.8.0 20120624 (experimental)"
Никаких инструкций SSE не было создано. Обратите внимание на вызов __mulsf3
.
В этом вопросе можно найти несколько интересных идей: Использование плавающей запятой программного обеспечения для x86 linux