> -mxop implies -mfma4, but reverse is not true. I think this handling went in for bdver1. But, with bdver2, we have both fma and fma4. So for bdver2, -mxop should not be enabling one of them.
> if someone set -mfma4 together > with -mfma on the command line, we should NOT disable selected ISA > behind user's back If both -mfma4 and -mfma are enabled, GCC outputs fma4 instructions. This, I think is because fma4 instruction patterns are read before fma instruction patterns from the ".md" files. So, enabling both -mfma4 and -mfma is not good for bdver2. Moreover, if user tries to use, -mfma -mno-fma4 -mxop, the order in which these options are used becomes crucial. -mxop enables -mfma4 and by instruction patterns fma4 instructions gets listed in the assembly file. For the below test, double a,b,c,d; int fn(){ a = b + c * d ; return a; } #1) Using options "-O2 -mno-fma4 -mfma -mxop" outputs fma4. (vfmaddsd b(%rip), %xmm2, %xmm1, %xmm0) #2) Using options "-O2 -mfma -mno-fma4 -mxop" outputs fma4. (vfmaddsd b(%rip), %xmm2, %xmm1, %xmm0) #3) Using options "-mxop -mno-fma4 -mfma" outpts fma. (vfmadd132sd d(%rip), %xmm1, %xmm0) As we see the order in which the options are used becomes crucial. This is confusing. I haven't really tested other implied options. But, I suspect similar phenomenon in those cases too. IMO, we can directly go by the CPUID flags and enable the flags. This will be a one to one mapping and leave the user with lot more liberty. Please let me know your opinion. Regards Ganesh -----Original Message----- From: Uros Bizjak [mailto:ubiz...@gmail.com] Sent: Friday, August 10, 2012 1:21 AM To: Gopalasubramanian, Ganesh Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH,i386] fma,fma4 and xop flags On Wed, Aug 8, 2012 at 1:31 PM, <ganesh.gopalasubraman...@amd.com> wrote: > Bdver2 cpu supports both fma and fma4 instructions. > Previous to patch, option "-mno-xop" removes "-mfma4". > Similarly, option "-mno-fma4" removes "-mxop". It looks to me that there is some misunderstanding. AFAICS: -mxop implies -mfma4, but reverse is not true. Please see #define OPTION_MASK_ISA_FMA4_SET \ (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_SSE4A_SET \ | OPTION_MASK_ISA_AVX_SET) #define OPTION_MASK_ISA_XOP_SET \ (OPTION_MASK_ISA_XOP | OPTION_MASK_ISA_FMA4_SET) So, -mxop sets -mfma4, etc ..., but -mfma4 does NOT enable -mxop. OTOH, #define OPTION_MASK_ISA_FMA4_UNSET \ (OPTION_MASK_ISA_FMA4 | OPTION_MASK_ISA_XOP_UNSET) #define OPTION_MASK_ISA_XOP_UNSET OPTION_MASK_ISA_XOP -mno-fma4 implies -mno-xop, but again reverse is not true. Thus, -mno-xop does NOT imply -mno-fma4. > So, the patch conditionally disables "-mfma" or "-mfma4". > Enabling "-mxop" is done by also checking "-mfma". Please note that conditional handling of ISA flags belongs to ix86_option_override_internal. However, if someone set -mfma4 together with -mfma on the command line, we should NOT disable selected ISA behind user's back, in the same way as we don't disable anything with "-march=i386 -msse4". With -march=bdver2, we already marked that only fma is supported, and if user selected "-march=bdver2 -mfma4" on the command line, we shouldn't disable anything. Uros.