Patchwork [i386] : Use SSE insns to generate soft-fp exceptions for 64bit targets only

login
register
mail settings
Submitter Uros Bizjak
Date Oct. 11, 2012, 11:54 a.m.
Message ID <CAFULd4b0bTY43R6Qeb0aJX+fEOa7Xf=XYwX772R-yTaY+6w8nQ@mail.gmail.com>
Download mbox | patch
Permalink /patch/190881/
State New
Headers show

Comments

Uros Bizjak - Oct. 11, 2012, 11:54 a.m.
Hello!

For 32bit targets, there is no guarantee that mxcsr register will be
set up correctly w.r.t. unmasked FP exceptions, so don't use SSE
instructions to generate INVALID and DIVZERO FP exceptions.

2012-10-10  Uros Bizjak  <ubizjak@gmail.com>

	* config/i386/sfp-exceptions.c (__sfp_handle_exceptions): Emit SSE
	instructions for 64bit targets only.

Patch was bootstrapped and regtested on x86_64-pc-linux-gnu {,-m32},
committed to mainline SVN.

Uros.

Patch

Index: config/i386/sfp-exceptions.c
===================================================================
--- config/i386/sfp-exceptions.c	(revision 192347)
+++ config/i386/sfp-exceptions.c	(working copy)
@@ -46,7 +46,7 @@  __sfp_handle_exceptions (int _fex)
   if (_fex & FP_EX_INVALID)
     {
       float f = 0.0f;
-#ifdef __SSE__
+#ifdef __x86_64__
       asm volatile ("%vdivss\t{%0, %d0|%d0, %0}" : "+x" (f));
 #else
       asm volatile ("fdiv\t{%y0, %0|%0, %y0}" : "+t" (f));
@@ -56,7 +56,7 @@  __sfp_handle_exceptions (int _fex)
   if (_fex & FP_EX_DIVZERO)
     {
       float f = 1.0f, g = 0.0f;
-#ifdef __SSE__
+#ifdef __x86_64__
       asm volatile ("%vdivss\t{%1, %d0|%d0, %1}" : "+x" (f) : "xm" (g));
 #else
       asm volatile ("fdivs\t%1" : "+t" (f) : "m" (g));