update una para mejor mac instalar cual compiler compile como anterior actualizar gcc assembly osx-lion macports avx

gcc - una - Cómo usar AVX/pclmulqdq en Mac OS X



gcc compiler mac os x (5)

Estoy intentando compilar un programa que utiliza la instrucción pclmulqdq presente en nuevos procesadores Intel. He instalado GCC 4.6 usando macports pero cuando compilo mi programa (que usa el _mm_clmulepi64_si128 intrínseco), obtengo

/var/folders/ps/sfjmtgx5771_qbqnh4c9xclr0000gn/T//ccEAWWhd.s:16:no such instruction: `pclmulqdq $0, %xmm0,%xmm1''

Parece que GCC puede generar el código de ensamblaje correcto desde el intrínseco, pero el ensamblador no reconoce la instrucción.

Instalé binutils usando macports, pero el problema persiste. ¿Cómo sé qué ensamblador gcc está usando? El ensamblador XCode probablemente no lo admite, pero el ensamblador binutils debería.


El ensamblador GNU (GAS) no es compatible con Mac OS X.

Para usar AVX, tuve que:

  • Instalar GCC usando MacPorts;
  • Reemplace el ensamblador nativo de OS X (/ usr / bin / as) por un script que llame al ensamblador de clang.
  • Compile el programa con el GCC instalado (por ejemplo, gcc-mp-4.7)

Lo extraño es que, aunque el ensamblador de clang admite AVX, el compilador de clang no reconoce los intrínsecos de AVX, forzando la fea solución anterior.


La versión integrada de as está desactualizada. (En OS X 10.8.3)

/ usr / libexec / as / x86_64 / as -v

Apple Inc versión cctools-839, ensamblador GNU versión 1.38

No parece existir una versión de gas para OS X. (Ver: Instalación de GNU Assembler en OSX )

Usar el ensamblador de clang a través de un hack de scripts (como lo señala Conrado PLG) es una solución alternativa. Sin embargo, requiere privilegios de administrador y sobrescribe los ejecutables de OS X, lo que provoca el riesgo de que se sobrescriba con una versión nueva (aunque posiblemente obsoleta) de una versión futura de OS X.

¿Hay entonces una mejor solución?

Como se menciona en ¿Por qué cross gcc invoca nativo ''como''? parece ser posible especificar qué "ejecutable" y "flags" usar (usando "-specs = ..."). Una solución más limpia al problema parece ser pasar los indicadores "-specs" correctos para invocar al ensamblador de clang. Esto no requiere privilegios de administrador y no corre el riesgo de ser roto por una actualización de OS X. Los detalles exactos de cómo realizar esto quedan por descubrirse (¿alguien?).

Si esta solución se vuelve libre de problemas y lo suficientemente transparente, se puede justificar el uso de esas configuraciones como predeterminado (o al menos como variante) para macport gcc (para que admita "-march = native" y similares). Hay una configuración como configure.args ("--with-as = $ {prefix} / bin / as", como se ve en https://trac.macports.org/browser/trunk/dports/lang/gcc48/Portfile ), que podría ser reemplazado.


Parece que arreglé mi problema usando la sintaxis gcc / asm donde a la función asm {} se le pasa una cadena que consta de enunciados de ensamblador rodeados por comillas y separados por una barra invertida y una línea nueva o una barra invertida y una cadena citada que contiene otra instrucción de ensamblador.

https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s3


Solo usa

as --version

AVX apareció alrededor de la versión 2.18.50 en gas / binutils.


Una solución más simple que solucionó este problema para mí fue agregar -Wa,-q a los indicadores del compilador. Desde las páginas man para as (versión 1.38):

-q

Utilice el ensamblador integrado clang (1) en lugar del ensamblador de sistema basado en GNU.

La parte -Wa pasa del controlador del compilador al ensamblador, al igual que -Wl pasa argumentos al vinculador.