SSE register return avec SSE désactivé

Je suis dans la situation suivante:

  • J’écris du code pour un kernel qui n’autorise pas les instructions SSE
  • J’ai besoin de faire de l’arithmétique en virgule flottante
  • Je comstack pour une plate-forme x86_64

Voici un exemple de code illustrant le problème:

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; } 

Et voici la ligne pertinente du 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 

Lorsque je lance une construction, j’obtiens cette erreur:

 SSE register return with SSE disabled 

(L’erreur pointe vers la ligne qui multiplie d et valeur_base)

Une idée de ce que je peux faire pour résoudre ce problème? Supprimer -mno-sse n’est pas une option, mais il semble que le compilateur devrait pouvoir générer du code non-sse pour effectuer la multiplication.

Merci Nathan

On dirait que le compilateur émet un appel à une routine de bibliothèque pour multiplier la virgule flottante pour vous (probablement sans utiliser SSE), mais essaie d’utiliser une ABI pour l’appel dont la valeur de retour est passée dans SSE. Évidemment, ça ne marche pas.

S’il est possible d’utiliser du virgule flottante dans votre kernel, il devrait exister une bibliothèque d’exécution spéciale pour effectuer des opérations de type flottant n’utilisant pas les conventions habituelles de passage et de renvoi d’arguments (utilisateur). Toutefois, pour autant que je sache, le kernel BSD ne prend pas en charge la virgule flottante. C’était certainement le cas il y a quelques années.

Vous devriez probablement simplement demander à la liste de diffusion dev du kernel BSD s’il est possible ou non d’utiliser un nombre à virgule flottante; Je suppose que cela vous donnera une réponse plus rapide et définitive que SO.