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
--------------------------------------------------------------------------

Reply via email to