[PATCH] D98895: [X86][Draft] Disable long double type for -mno-x87 option
Andrew Savonichev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon May 24 10:14:38 PDT 2021
asavonic added inline comments.
================
Comment at: clang/test/Sema/x86-no-x87.c:48-61
+void assign2() {
+ struct st_long_double st;
+#ifndef NOERROR
+ // expected-error at +2{{long double is not supported on this target}}
+#endif
+ st.ld = 0.42;
+}
----------------
pengfei wrote:
> asavonic wrote:
> > pengfei wrote:
> > > These seems pass with GCC. https://godbolt.org/z/qM4nWhThx
> > Right. Assignment of a literal is compiled to just `mov` without any x87 instructions, so it is not diagnosed by GCC. On the other hand, assignment of a variable does trigger the error:
> >
> > void assign4(double d) {
> > struct st_long_double st;
> > st.ld = d; // error: long double is not supported on this target
> > }
> >
> > We can update the patch to do the same for some cases, but it does not look very consistent, and makes assumptions on how the code is optimized and compiled.
> >
> > GCC has an advantage here, because it emits the diagnostic at a lower level after at lease some optimizations are done. For example, the following code does not trigger an error for GCC because of inlining:
> >
> > double get_const() {
> > return 0.42;
> > }
> > void assign5(struct st_long_double *st) {
> > st->ld = get_const();
> > }
> >
> I see. Another concern is about the 32 bits. @LiuChen3 had tested in D100091 that GCC doesn't error for 32 bits. Do we need to consider it here?
Yes, it should be considered. Both x86 and x86_64 SysV ABI targets require x87 to be used for long double. Other targets have different requirements for long double: double precision for Windows, double and quad precision for Android x86 and x86_64 respectively.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D98895/new/
https://reviews.llvm.org/D98895
More information about the cfe-commits
mailing list