2009-10-12 16 views
9

Estoy en la siguiente situación:retorno registro SSE con SSE discapacitados

  • Estoy escribiendo código para un kernel que no permite las instrucciones SSE
  • tengo que hacer aritmética de punto flotante
  • I 'm compilación de una plataforma x86_64

Aquí es un ejemplo de código que ilustra el problema:

int 
main(int argc, char** argv) 
{ 
    double d = 0.0, dbase; 
    uint64_t base_value = 300; 

    d = (2200.0 - 1000.0)/(1000.0); 
    dbase = d * base_value; 
    printf("d = %f, dbase = %f\n", d, dbase); 
    base_value = dbase; 
    printf("base_value = %llu\n", (long long unsigned)base_value); 
    return 0; 
} 

Y aquí es la línea relevante del makefile:

CFLAGS += -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow \ 
      -msoft-float -fno-asynchronous-unwind-tables -fno-omit-frame-pointer 

Cuando ejecuto una acumulación consigo este error:

SSE register return with SSE disabled 

(Los puntos de error en la línea que multiplica dy base_value)

¿Alguna idea de qué puedo hacer para solucionar esto? La eliminación de -mno-sse no es una opción, pero parece que el compilador debería ser capaz de generar código no sse para hacer la multiplicación.

Gracias Nathan

+1

Es posible que gcc no pueda manejar este caso porque asume que todos los procesadores x86-64 tienen SSE. – Amok

+1

¿Significa esto que nadie multiplica algo dentro del núcleo de FreeBSD en compilaciones de 64 bits? – Nathan

+0

Cualquier kernel en el que he trabajado tiende a evitar el punto flotante tanto como sea posible. –

Respuesta

6

Suena como el compilador emite una llamada a una rutina de biblioteca para hacer la multiplicación de punto flotante para usted (presumiblemente sin usar SSE), pero está tratando de usar un ABI para la llamada que tiene el valor de retorno pasado en SSE. Obviamente, eso no funciona.

Si es posible usar en absoluto el punto flotante en su kernel, debe haber una biblioteca de tiempo de ejecución especial para realizar operaciones de flotación suave que no utilice las convenciones habituales de paso y retorno de argumentos (userland). Sin embargo, hasta donde yo sé, no hay soporte para coma flotante en el kernel BSD. Ese fue ciertamente el caso hace unos años.

Probablemente deberías simplemente preguntarle a la lista de correo electrónico del desarrollador de kernel BSD si es posible o no utilizar el punto flotante; Sospecho que te dará una respuesta más rápida y definitiva que SO.

+0

Decidí usar simplemente aritmética de punto fijo en su lugar (el kernel en cuestión está basado en el kernel de FreeBSD pero está significativamente alterado, así que no estaba seguro de que ninguna de las listas de correo oficiales daría una mejor respuesta que "no lo hago" haz eso ". – Nathan

+0

Ah. Lo siento, no hay una respuesta más feliz para esta. –