pengfei added inline comments.
================ Comment at: clang/test/Sema/x86-no-x87.c:2 +// RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-linux-gnu -target-feature -x87 +// RUN: %clang_cc1 -fsyntax-only -verify %s -triple i686-linux-gnu -target-feature -x87 +// RUN: %clang_cc1 -fsyntax-only -verify %s -triple x86_64-windows-msvc -target-feature -x87 -DNOERROR ---------------- asavonic wrote: > pengfei wrote: > > Should i686 expect no error like GCC? > GCC seems to fallback to soft-float for i686 if -mno-80387 is used: > > long double orig(long double x, long double y) > { > long double z = x + y; > if (z < 0.0) > return z; > else > return 0.0; > } > > i686-linux-gnu-gcc-8 -c -S -mno-80387 -O3: > call __addxf3@PLT > [...] > call __ltxf2@PLT > addl $32, %esp > testl %eax, %eax > js .L3 > xorl %esi, %esi > xorl %edi, %edi > xorl %ebp, %ebp > .L3: > addl $12, %esp > movl %esi, %eax > movl %edi, %edx > movl %ebp, %ecx > popl %ebx > popl %esi > popl %edi > popl %ebp > ret > > This looks like a different ABI. > X87 instructions are not used, so no error is reported. > I found it's a bit complex for 32 bits. 1. i686 ABI specifies the return of floating point type must be put in %st0, so any FP type returning should be error out w/o x87. 2. GCC doesn't respect above ABI. 3. FP types are passed from stack, so a function like `void orig(long double x, long double y, long double *z)` should not be error out w/o x87. x86_64 only uses ST registers when returning FP80. Considering it is rare for case 3, I think we can ignore it this time, but I suggest we should add check for float and double on 32 bits. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D98895/new/ https://reviews.llvm.org/D98895 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits