https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116363
Bug ID: 116363 Summary: gcc.c-torture/execute/conversion.c fails on H8/300 Product: gcc Version: 15.0 Status: UNCONFIRMED Keywords: testsuite-fail Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: jdx at o2 dot pl Target Milestone: --- Host: x86_64-pc-linux-gnu Target: h8300-elf The test case fails in 9 similar places in function test_float_to_longlong_integer(). The first place is at line 451. The following program illustrates the issue: -------------------------------------------------------------------------- void abort (void); void exit (int); unsigned long long int f2ull(float f) { return (unsigned long long int) f; } int main(void) { if (f2ull((float) ((~0ULL) >> 1)) != (~0ULL) >> 1 && /* 0x7fffffff */ f2ull((float) ((~0ULL) >> 1)) != ((~0ULL) >> 1) + 1) abort(); exit(0); } -------------------------------------------------------------------------- It looks like __fixunssfdi() called from f2ull() returns junk but I do not feel competent to dig deeper. Here is generated assembly: -------------------------------------------------------------------------- .file "test_conv.c" .h8300h ;# GNU C17 (GNU Toolchain for Renesas H8 Family [Built by jdx]) version 15.0.0 20240811 (experimental) (h8300-elf) ;# compiled by GNU C version 12.3.0, GMP version 6.2.1, MPFR version 4.1.0, MPC version 1.2.1, isl version none ;# GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 ;# options passed: -fdiagnostics-urls=never -O0 -fdiagnostics-path-format=separate-events -fdiagnostics-text-art-charset=none .section .text .align 1 .global _f2ull _f2ull: mov.l er6,@-er7 ;#, mov.l er7,er6 ;#, mov.l er4,@-er7 ;#, mov.l er5,@-er7 ;#, subs #4,er7 ;#, mov.l er0,@(-12,er6) ;# f, f ;# test_conv.c:7: return (unsigned long long int) f; mov.l @(-12,er6),er0 ;# f, jsr @___fixunssfdi ;# mov.l er0,er4 ;#, _2 mov.l er1,er5 ;#, _2 ;# test_conv.c:7: return (unsigned long long int) f; mov.l er4,er2 ;# _2, <retval> mov.l er5,er3 ;# _2, <retval> ;# test_conv.c:8: } mov.l er2,er0 ;# <retval>, mov.l er3,er1 ;# <retval>, adds #4,er7 ;#, mov.l @er7+,er5 ;#, mov.l @er7+,er4 ;#, mov.l @er7+,er6 ;#, rts .size _f2ull, .-_f2ull .align 1 .global _main _main: mov.l er6,@-er7 ;#, mov.l er7,er6 ;#, ;# test_conv.c:13: if (f2ull((float) ((~0ULL) >> 1)) != (~0ULL) >> 1 && /* 0x7fffffff */ mov.l #1593835520,er2 ;#, tmp22 mov.l er2,er0 ;# tmp22, jsr @_f2ull ;# mov.l er0,er2 ;#, _1 mov.l er1,er3 ;#, _1 ;# test_conv.c:13: if (f2ull((float) ((~0ULL) >> 1)) != (~0ULL) >> 1 && /* 0x7fffffff */ cmp.l #2147483647,er2 ;#, _1 bne .L7 ;#, cmp.l #-1,er3 ;#, _1 beq .L4 ;#, .L7: ;# test_conv.c:14: f2ull((float) ((~0ULL) >> 1)) != ((~0ULL) >> 1) + 1) mov.l #1593835520,er2 ;#, tmp23 mov.l er2,er0 ;# tmp23, jsr @_f2ull ;# mov.l er0,er2 ;#, _2 mov.l er1,er3 ;#, _2 ;# test_conv.c:13: if (f2ull((float) ((~0ULL) >> 1)) != (~0ULL) >> 1 && /* 0x7fffffff */ cmp.l #-2147483648,er2 ;#, _2 bne .L8 ;#, mov.l er3,er3 ;# _2 beq .L4 ;#, .L8: ;# test_conv.c:15: abort(); jsr @_abort ;# .L4: ;# test_conv.c:16: exit(0); sub.w r0,r0 ;# jsr @_exit ;# .size _main, .-_main .global ___fixunssfdi .ident "GCC: (GNU Toolchain for Renesas H8 Family [Built by jdx]) 15.0.0 20240811 (experimental)" .end --------------------------------------------------------------------------