From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id 6A4483857830; Sat, 2 Jul 2022 01:30:37 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6A4483857830 From: "xeioexception at gmail dot com" To: gcc-bugs@gcc.gnu.org Subject: [Bug c/106165] New: incorrect result when using inlined asm implementation of floor() on i686 Date: Sat, 02 Jul 2022 01:30:37 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c X-Bugzilla-Version: 11.1.0 X-Bugzilla-Keywords: X-Bugzilla-Severity: normal X-Bugzilla-Who: xeioexception at gmail dot com X-Bugzilla-Status: UNCONFIRMED X-Bugzilla-Resolution: X-Bugzilla-Priority: P3 X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org X-Bugzilla-Target-Milestone: --- X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter target_milestone Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 02 Jul 2022 01:30:37 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D106165 Bug ID: 106165 Summary: incorrect result when using inlined asm implementation of floor() on i686 Product: gcc Version: 11.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: xeioexception at gmail dot com Target Milestone: --- $ gcc-11 -v -save-temps -O2 minified_to_string_radix.i -o 507 -lm Using built-in specs.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 COLLECT_GCC=3Dgcc-11=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 COLLECT_LTO_WRAPPER=3D/usr/lib/gcc/i686-linux-gnu/11/lto-wrapper=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 Target: i686-linux-gnu=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 Configured with: ../src/configure -v --with-pkgversion=3D'Ubuntu 11.1.0-1ubuntu1~18.04.1' --with-bugurl=3Dfile:///usr/share/doc/gcc-11/READM E.Bugs --enable-languages=3Dc,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=3D/usr --with-gcc-major-version-only --program-suffix=3D-11 - -program-prefix=3Di686-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=3D/usr/lib --without-included-gettext --enable-threa ds=3Dposix --libdir=3D/usr/lib --enable-nls --enable-clocale=3Dgnu --enable-libstdcxx-debug --enable-libstdcxx-time=3Dyes --with-default-libst= dc xx-abi=3Dnew --enable-gnu-unique-object --disable-vtable-verify --enable-pl= ugin --enable-default-pie --with-system-zlib --enable-libphobos -checking=3Drelease --with-target-system-zlib=3Dauto --enable-objc-gc=3Dauto --enable-targets=3Dall --enable-multiarch --disable-werror --disabl e-cet --with-arch-32=3Di686 --with-multilib-list=3Dm32,m64,mx32 --enable-mu= ltilib --with-tune=3Dgeneric --enable-checking=3Drelease --build=3Di686 -linux-gnu --host=3Di686-linux-gnu --target=3Di686-linux-gnu=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 Thread model: posix=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 Supported LTO compression algorithms: zlib zstd=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 gcc version 11.1.0 (Ubuntu 11.1.0-1ubuntu1~18.04.1)=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 COLLECT_GCC_OPTIONS=3D'-v' '-save-temps' '-O2' '-o' '507' '-mtune=3Dgeneric' '-march=3Di686' '-dumpdir' '507-'=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 /usr/lib/gcc/i686-linux-gnu/11/cc1 -E -quiet -v -imultiarch i386-linux-gnu 507_mini.c -mtune=3Dgeneric -march=3Di686 -O2 -fpch-preprocess - fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-secu= rity -o 507-507_mini.i=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 ignoring nonexistent directory "/usr/local/include/i386-linux-gnu"=20=20=20= =20=20=20=20=20=20=20=20=20=20=20 ignoring nonexistent directory "/usr/lib/gcc/i686-linux-gnu/11/include-fixe= d"=20=20=20 ignoring nonexistent directory "/usr/lib/gcc/i686-linux-gnu/11/../../../../i686-linux-gnu/include"=20=20= =20=20=20=20=20=20=20=20=20=20=20 #include "..." search starts here:=20 #include <...> search starts here:=20 /usr/lib/gcc/i686-linux-gnu/11/include /usr/local/include /usr/include/i386-linux-gnu /usr/include End of search list. COLLECT_GCC_OPTIONS=3D'-v' '-save-temps' '-O2' '-o' '507' '-mtune=3Dgeneric' '-march=3Di686' '-dumpdir' '507-' /usr/lib/gcc/i686-linux-gnu/11/cc1 -fpreprocessed 507-507_mini.i -quiet -dumpdir 507- -dumpbase 507_mini.c -dumpbase-ext .c -mtune=3Dgeneric -march= =3Di686 -O2 -version -fasynchronous-unwind-tables -fstack-protector-strong -Wformat -Wformat-security -o 507-507_mini.s GNU C17 (Ubuntu 11.1.0-1ubuntu1~18.04.1) version 11.1.0 (i686-linux-gnu) compiled by GNU C version 11.1.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP GGC heuristics: --param ggc-min-expand=3D100 --param ggc-min-heapsize=3D131= 072 GNU C17 (Ubuntu 11.1.0-1ubuntu1~18.04.1) version 11.1.0 (i686-linux-gnu) compiled by GNU C version 11.1.0, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP GGC heuristics: --param ggc-min-expand=3D100 --param ggc-min-heapsize=3D131= 072 Compiler executable checksum: 81b68deb607ea376c8bc5126cafbdd31 COLLECT_GCC_OPTIONS=3D'-v' '-save-temps' '-O2' '-o' '507' '-mtune=3Dgeneric' '-march=3Di686' '-dumpdir' '507-' as -v --32 -o 507-507_mini.o 507-507_mini.s GNU assembler version 2.30 (i686-linux-gnu) using BFD version (GNU Binutils= for Ubuntu) 2.30 COMPILER_PATH=3D/usr/lib/gcc/i686-linux-gnu/11/:/usr/lib/gcc/i686-linux-gnu= /11/:/usr/lib/gcc/i686-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/11/:/usr/lib/= gcc/i686-linux-gnu/ LIBRARY_PATH=3D/usr/lib/gcc/i686-linux-gnu/11/:/usr/lib/gcc/i686-linux-gnu/= 11/../../../i386-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/11/../../../../lib/= :/lib/i386-linux-gnu/:/lib/../lib/:/usr/lib/i386-linux-gnu/:/usr/lib/../lib= /:/usr/lib/gcc/i686-linux-gnu/11/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS=3D'-v' '-save-temps' '-O2' '-o' '507' '-mtune=3Dgeneric' '-march=3Di686' '-dumpdir' '507.' /usr/lib/gcc/i686-linux-gnu/11/collect2 -plugin /usr/lib/gcc/i686-linux-gnu/11/liblto_plugin.so -plugin-opt=3D/usr/lib/gcc/i686-linux-gnu/11/lto-wrapper -plugin-opt=3D-fresolution=3D507.res -plugin-opt=3D-pass-through=3D-lgcc -plugin-opt=3D-pass-through=3D-lgcc_s -plugin-opt=3D-pass-through=3D-lc -plugin-opt=3D-pass-through=3D-lgcc -plugin-opt=3D-pass-through=3D-lgcc_s -= -build-id --eh-frame-hdr -m elf_i386 --hash-style=3Dgnu --as-needed -dynamic-linker /lib/ld-linux.so.2 -pie -z now -z relro -o 507 /usr/lib/gcc/i686-linux-gnu/11/../../../i386-linux-gnu/Scrt1.o /usr/lib/gcc/i686-linux-gnu/11/../../../i386-linux-gnu/crti.o /usr/lib/gcc/i686-linux-gnu/11/crtbeginS.o -L/usr/lib/gcc/i686-linux-gnu/11 -L/usr/lib/gcc/i686-linux-gnu/11/../../../i386-linux-gnu -L/usr/lib/gcc/i686-linux-gnu/11/../../../../lib -L/lib/i386-linux-gnu -L/lib/../lib -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/i686-linux-gnu/11/../../.. 507-507_mini.o -lm -lgcc --push-s= tate --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/i686-linux-gnu/11/crtendS.o /usr/lib/gcc/i686-linux-gnu/11/../../../i386-linux-gnu/crtn.o COLLECT_GCC_OPTIONS=3D'-v' '-save-temps' '-O2' '-o' '507' '-mtune=3Dgeneric' '-march=3Di686' '-dumpdir' '507.' $ uname -a Linux c6c6b3a033a2 5.13.0-39-generic #44~20.04.1-Ubuntu SMP Thu Mar 24 16:4= 3:35 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.4 LTS Release: 18.04 Codename: bionic minified_to_string_radix.i: ``` typedef unsigned int size_t; typedef signed int __int32_t; typedef unsigned int __uint32_t; __extension__ typedef signed long long int __int64_t; __extension__ typedef unsigned long long int __uint64_t; int printf(const char *format, ...); int memcmp(const void *s1, const void *s2, size_t n); __extension__ typedef unsigned long long int __uint64_t; typedef long double float_t; typedef __int64_t int64_t; typedef __uint32_t uint32_t; typedef __uint64_t uint64_t; extern double fmod (double __x, double __y); extern __inline __attribute__ ((__always_inline__)) __attribute__ ((__gnu_inline__)) double __attribute__ ((__nothrow__)) floor (double __x) { register long double __value; register int __ignore; unsigned short = int __cw; unsigned short int __cwtmp; __asm __volatile ("fnstcw %3\n\t" "movzwl= %3, %1\n\t" "andl $0xf3ff, %1\n\t" "orl $0x0400, %1\n\t" "movw %w1, %2\n\t" "fl= dcw %2\n\t" "frndint\n\t" "fldcw %3" : "=3Dt" (__value), "=3D&q" (__ignore), "= =3Dm" (__cwtmp), "=3Dm" (__cw) : "0" (__x)); return __value; } typedef struct { uint64_t significand; int exp; } njs_diyfp_t; static njs_diyfp_t njs_d2diyfp(double d) { int biased_exp; uint64_t significand; njs_diyfp_t r; union { double d; uint64_t u64; } u; u.d =3D d; biased_exp =3D (u.u64 & (((uint64_t) (0x7FF00000) << 32) + (0x00000000)= )) >> 52; significand =3D u.u64 & (((uint64_t) (0x000FFFFF) << 32) + (0xFFFFFFFF)= ); if (biased_exp !=3D 0) { r.significand =3D significand + (((uint64_t) (0x00100000) << 32) + (0x00000000)); r.exp =3D biased_exp - (((int64_t) 0x3ff) + 52); } else { r.significand =3D significand; r.exp =3D (-(((int64_t) 0x3ff) + 52)) + 1; } return r; } static int number_to_string_radix(double number, uint32_t radix) { int digit; char ch; double n, remainder, integer, fraction, delta; char *p, *end; uint32_t size; char buf[((1 + 1024) + (1 + 1075))]; static const char *digits =3D "0123456789abcdefghijklmnopqrstuvwxyz"; p =3D buf + (1 + 1024); end =3D p; n =3D number; integer =3D floor(n); p =3D buf + (1 + 1024); while (njs_d2diyfp(integer / radix).exp > 0) { integer /=3D radix; *(--p) =3D '0'; } do { remainder =3D fmod(integer, radix); *(--p) =3D digits[(int) remainder]; integer =3D (integer - remainder) / radix; } while (integer > 0); size =3D (uint32_t) (end - p); printf("%g.toString(%d) =3D %.*s\n", number, radix, size, p); if (memcmp(p, "ga894a06abs0000", size) !=3D 0) { printf("ERROR expected \"ga894a06abs0000\"\n"); return -1; } return 0; } int main() { number_to_string_radix(1e23, 36); return 0; } ``` 1) gcc -O2 minified_to_string_radix.i -o 507 -lm && ./507 1e+23.toString(36) =3D ga894a06ac80000 ERROR expected "ga894a06abs0000" 2) gcc -O1 minified_to_string_radix.i -o 507 -lm && ./507 1e+23.toString(36) =3D ga894a06ac80000 OK 3) gcc -O1 -ffast-math minified_to_string_radix.i -o 507 -lm && ./507 1e+23.toString(36) =3D ga894a06ac80000 OK 4) gcc -O1 -fstrict-aliasing minified_to_string_radix.i -o 507 -lm && ./507 1e+23.toString(36) =3D ga894a06ac80000 OK 5) removing inlined floor() fixed the issue 6) clang-6.0 -O2 minified_to_string_radix.i -o 507 -lm && ./507 1e+23.toString(36) =3D ga894a06abs0000=