He estado tratando de compilar gcc 4.x de las fuentes usando --with-fpmath=387 pero recibo este error: "Invalid --with-fpmath=387" . Miré en las configuraciones y descubrí que no es compatible con esta opción (aunque los documentos todavía la mencionan como una posible opción):
case ${with_fpmath} in avx) tm_file="${tm_file} i386/avxmath.h" ;; sse) tm_file="${tm_file} i386/ssemath.h" ;; *) echo "Invalid --with-fpmath=$with_fpmath" 1>&2 exit 1Básicamente, comencé todo esto porque necesito proporcionar un ejecutable para una plataforma de destino antigua (de hecho, es un Celeron antiguo pero sin instrucciones SSE2 que aparentemente son utilizadas por libstdc++ por DEFAULT ). El ejecutable falla en la primera instrucción (movq XMM0,...) proveniente de la copia de rutinas en libstdc++ con un mensaje de "Instrucción ilegal". Hay alguna manera de resolver esto? Necesito estar en un g ++ bastante reciente para poder portar mi base de código existente.
Me preguntaba si es posible proporcionar estos encabezados/fuentes de una compilación anterior para habilitar la compatibilidad con las instrucciones regulares de x87, de modo que no se haga referencia a las instrucciones de SSE.
ACTUALIZACIÓN: tenga en cuenta que estoy hablando de libstdc ++ compilado que tiene instrucciones SSE2 en el código objeto, por lo que la pregunta no se trata de argumentos de línea de comando gcc. No importa lo que proporcione a gcc al compilar mi código, se vinculará con libstdc++ que ya tiene instrucciones integradas de SSE2.
La verdadera respuesta es no usar NINGÚN modificador --with-fpmath al compilar GCC. Me confundió la declaración de cambio de script de configuración pensando que solo es compatible con sse o avx, mientras que, de hecho, el valor predeterminado (no mencionado en este cambio es "387"). Así que asegúrese de no usar --with-fpmath cuando ejecute configure. Recompilé GCC sin él y ahora funciona bien.
Gracias.
El argumento para decirle a gcc que produzca código para un objetivo específico es -march= CPU donde CPU es la CPU particular que desea. Para un celeron antiguo, probablemente desee -march=pentium2 o -march=pentium3
Para controlar el fp codegen por separado, las versiones más nuevas de gcc usan -mfpmath= -- en su caso, desea -mfpmath=387 .
Todos estos y muchos otros están cubiertos en la documentación de gcc
editar
Para usar esas banderas para crear bibliotecas (como libstdc++) que luego vinculará a los programas, debe configurar la compilación para que la biblioteca use las banderas apropiadas. libstdc++ se compila como parte de la compilación de g++, por lo que deberá realizar una compilación personalizada; puede usar configure CXXFLAGS=-mfpmath=387 para establecer banderas adicionales para usar mientras se compilan cosas.
Tenga en cuenta que la pregunta era sobre libstdc++ compilado con instrucciones SSE2 en el código objeto, por lo que la pregunta no era sobre los argumentos de la línea de comandos de gcc. No importa lo que proporcione a gcc al compilar mi código, se vinculará con libstdc++ que ya tiene instrucciones integradas de SSE2.
La verdadera respuesta es no usar NINGÚN modificador --with-fpmath al compilar GCC. Me confundió la declaración de cambio de script de configuración pensando que solo es compatible con sse o avx, mientras que, de hecho, el valor predeterminado (no mencionado en este cambio es "387"). Así que asegúrese de no usar --with-fpmath cuando ejecute configure. Recompilé GCC sin él y ahora funciona bien.