Which POWER implementations need the HWCAP_DFP check?

Florian Weimer fweimer@redhat.com
Mon May 14 15:28:00 GMT 2018


On 05/14/2018 05:22 PM, Tulio Magno Quites Machado Filho wrote:
> Florian Weimer <fweimer@redhat.com> writes:
> 
>> I think this run-time check is unnecessary on POWER6 and later:
>>
>> 	  double d = (env); \
>> 	  if(GLRO(dl_hwcap) & PPC_FEATURE_HAS_DFP) \
>> 	    asm volatile (".machine push; " \
>> 			  ".machine \"power6\"; " \
>> 			  "mtfsf 0xff,%0,1,0; " \
>> 			  ".machine pop" : : "f" (d)); \
>> 	  else \
>> 	    asm volatile ("mtfsf 0xff,%0" : : "f" (d)); \
> 
> I think it's still necessary when building glibc for an older processor,
> e.g. POWER4, and run it on processors that support DFP, e.g. POWER6.

Right.

>> In particularly, we do not need it on ppc64le.  Correct?
> 
> Agreed, unless the kernel has the right to disable DFP support.

Ugh, I had not thought of that.  Isn't DFP support part of the userspace 
ABI?

>> It's one of the GLIBC_PRIVATE references in libm.so.6, which is why I'm
>> asking.
> 
> Would the following code solve this problem?
> 
> #include <tls.h>
> /* Equivalent to fesetenv, but takes a fenv_t instead of a pointer.  */
> #define fesetenv_register(env) \
> 	do { \
> 	  double d = (env); \
> 	  if(THREAD_GET_HWCAP() & PPC_FEATURE_HAS_DFP) \
> 	    asm volatile (".machine push; " \
> 			  ".machine \"power6\"; " \
> 			  "mtfsf 0xff,%0,1,0; " \
> 			  ".machine pop" : : "f" (d)); \
> 	  else \
> 	    asm volatile ("mtfsf 0xff,%0" : : "f" (d)); \
> 	} while(0)

It avoids the GLIBC_PRIVATE reference, but it does not avoid the 
dependency on library internals.  So in a certain sense, it is way worse 
than what we have today (in particular if you are interested in pre-2.23 
glibc versions still).

I would have suggested something like

#define DL_HWCAP_HAS_DFP (GLRO(dl_hwcap) & PPC_FEATURE_HAS_DFP)

in the general powerpc sysdeps file, and

#define DL_HWCAP_HAS_DFP 1

for power6 (which I expect will propagate upwards).  I expect that this 
will result in somewhat nicer machine code, too.

Thanks,
Florian



More information about the Libc-alpha mailing list