On Wed, Aug 23, 2017 at 11:22 AM, Richard Biener <rguent...@suse.de> wrote: >> > /* If the machine does not have a case insn that compares the bounds, >> > Index: gcc/config/i386/i386.c >> > =================================================================== >> > --- gcc/config/i386/i386.c (revision 251275) >> > +++ gcc/config/i386/i386.c (working copy) >> > @@ -7369,7 +7369,8 @@ ix86_valid_target_attribute_tree (tree a >> > || opts->x_target_flags != def->x_target_flags >> > || option_strings[IX86_FUNCTION_SPECIFIC_ARCH] >> > || option_strings[IX86_FUNCTION_SPECIFIC_TUNE] >> > - || enum_opts_set.x_ix86_fpmath) >> > + || enum_opts_set.x_ix86_fpmath >> > + || !TARGET_64BIT_P (opts->x_ix86_isa_flags)) >> >> You should use (!TARGET_64BIT_P ... && TARGET_SSE_P ...) to match the >> condition in the special fpmath processing part. (BTW: The comment in >> that part is wrong, we need SSE, not sse2 on 32-bit targets to use SSE >> math.) > > Hmpf, with the change I again run into the libgo bootstrap fail > (appearantly my reduced testcase is incomplete) > > libtool: compile: /abuild/rguenther/obj2/./gcc/xgcc > -B/abuild/rguenther/obj2/./gcc/ -B/usr/local/x86_64-pc-linux-gnu/bin/ > -B/usr/local/x86_64-pc-linux-gnu/lib/ -isystem > /usr/local/x86_64-pc-linux-gnu/include -isystem > /usr/local/x86_64-pc-linux-gnu/sys-include -m32 -DHAVE_CONFIG_H -I. > -I/space/rguenther/src/svn/trunk2/libgo -I > /space/rguenther/src/svn/trunk2/libgo/runtime > -I/space/rguenther/src/svn/trunk2/libgo/../libffi/include > -I../libffi/include -pthread -fexceptions -fnon-call-exceptions > -fplan9-extensions -fsplit-stack -Wall -Wextra -Wwrite-strings -Wcast-qual > -Werror -minline-all-stringops -D_GNU_SOURCE -D_LARGEFILE_SOURCE > -D_FILE_OFFSET_BITS=64 -I /space/rguenther/src/svn/trunk2/libgo/../libgcc > -I /space/rguenther/src/svn/trunk2/libgo/../libbacktrace -I > ../../../gcc/include -g -O2 -m32 -MT aeshash.lo -MD -MP -MF > .deps/aeshash.Tpo -c > /space/rguenther/src/svn/trunk2/libgo/runtime/aeshash.c -fPIC -DPIC -o > .libs/aeshash.o > In file included from > /space/rguenther/src/svn/trunk2/libgo/runtime/aeshash.c:17:0: > /space/rguenther/src/svn/trunk2/libgo/runtime/aeshash.c: In function > ‘aeshashbody’: > /abuild/rguenther/obj2/./gcc/include/emmintrin.h:700:1: error: inlining > failed in call to always_inline ‘_mm_loadu_si128’: target specific option > mismatch > _mm_loadu_si128 (__m128i_u const *__P) > ^~~~~~~~~~~~~~~ > /space/rguenther/src/svn/trunk2/libgo/runtime/aeshash.c:387:11: note: > called from here > mseed ^= _mm_loadu_si128(aeskeysched.__values); > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > that appens even with making the if a if (1). The check we run into > is somehow still > > else if (caller_opts->x_ix86_fpmath != callee_opts->x_ix86_fpmath) > ret = false; > > ah ... > > #ifndef __SSE__ > #pragma GCC push_options > #pragma GCC target("sse") > #define __DISABLE_SSE__ > #endif /* __SSE__ */ > > but on x86_64 when building with -m32 we _do_ have __SSE__ set so > the intrinsics get target_option_default_node which doesn't have > fmpath=sse. So x86_64 -m32 -march=i586 enables SSE math for > the intrinsics while x86_64 -m32 [-march=x86-64] does not...
IMO target_default_node should already enable fpmath=sse. When SSE is available, fpmath should be set to SSE, unless there is fpmath option specified. Uros.