public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [patch,avr] Fix PR target/99184: Wrong cast from double to 16-bit and 32-bit ints.
@ 2022-09-18 17:39 Georg Johann Lay
  2022-09-19  7:51 ` [patch, avr] " Richard Biener
  0 siblings, 1 reply; 5+ messages in thread
From: Georg Johann Lay @ 2022-09-18 17:39 UTC (permalink / raw)
  To: gcc-patches; +Cc: Jeff Law, Senthil Kumar Selvaraj

[-- Attachment #1: Type: text/plain, Size: 1077 bytes --]

Hello,

this patch fixed PR target/99184 which incorrectly rounded during 64-bit 
(long) double to 16-bit and 32-bit integers.

The patch just removes the respective roundings from 
libf7-asm.sx::to_integer and ::to_unsigned.  Luckily, LibF7 does nowhere 
use respective functions internally, the only user is in libf7.c::f7_exp

which reads

   f7_round (qq, qq);
   int16_t q = f7_get_s16 (qq);

so that f7_get_s16() operates on an already rounded value, and therefore 
this code works unaltered with or without rounding in to_integer.

The patch applies to directory

./libgcc/config/avr/libf7/

and is the same for all GCC versions v10+.

Please someone with write permissions commit it to trunk and backport to 
v12, v11, and v10 as it is a wrong-code issue.

The patch will fit without problems (except for ChangeLog) because there 
is no traffic on that folder.


Thanks, Johann


libgcc/config/avr/libf7/
	PR target/99184
	Remove rounding from double to [u]int16 and [u]int32 casts.

	* libf7-asm.sx (to_integer, to_unsigned): Don't round 16-bit
	and 32-bit integers.


[-- Attachment #2: pr99184.diff --]
[-- Type: text/x-patch, Size: 2035 bytes --]

diff --git a/ChangeLog b/ChangeLog
index 7e06f52..3ec0082 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+
+	PR target/99184
+	Remove rounding from double to [u]int16 and [u]int32 casts.
+
+	* libf7-asm.sx (to_integer, to_unsigned): Don't round 16-bit
+	and 32-bit integers.
+
 2022-04-21  Release Manager
 
 	* GCC 11.3.0 released.
diff --git a/libf7-asm.sx b/libf7-asm.sx
index 7629e23..9d701f2 100644
--- a/libf7-asm.sx
+++ b/libf7-asm.sx
@@ -601,9 +601,6 @@ DEFUN to_integer
     tst     C6
     brmi    .Lsaturate.T    ;   > INTxx_MAX  =>  saturate
 
-    rcall   .Lround
-    brmi    .Lsaturate.T    ;   > INTxx_MAX  =>  saturate
-
     brtc 9f                 ;   >= 0         =>  return
     sbrc    Mask,   5
     .global __negdi2
@@ -658,30 +655,6 @@ DEFUN to_integer
     .global __clr_8
     XJMP    __clr_8
 
-.Lround:
-    ;; C6.7 is known to be 0 here.
-    ;; Return N = 1 iff we have to saturate.
-    cpi     Mask,   0xf
-    breq .Lround16
-    cpi     Mask,   0x1f
-    breq .Lround32
-
-    ;; For now, no rounding in the 64-bit case.  This rounding
-    ;; would have to be integrated into the right-shift.
-    cln
-    ret
-
-.Lround32:
-    rol     C2
-    adc     C3,     ZERO
-    adc     C4,     ZERO
-    rjmp 2f
-
-.Lround16:
-    rol     C4
-2:  adc     C5,     ZERO
-    adc     C6,     ZERO
-    ret
 ENDF to_integer
 #endif /* F7MOD_to_integer_ */
 
@@ -725,29 +698,6 @@ DEFUN to_unsigned
     clr     CA
     F7call  lshrdi3
     POP     r16
-
-    ;; Rounding
-    ;; ??? C6.7 is known to be 0 here.
-    cpi     Mask,   0xf
-    breq .Lround16
-    cpi     Mask,   0x1f
-    breq .Lround32
-
-    ;; For now, no rounding in the 64-bit case.  This rounding
-    ;; would have to be integrated into the right-shift.
-    ret
-
-.Lround32:
-    rol     C2
-    adc     C3,     ZERO
-    adc     C4,     ZERO
-    rjmp 2f
-
-.Lround16:
-    rol     C4
-2:  adc     C5,     ZERO
-    adc     C6,     ZERO
-    brcs    .Lset_0xffff    ; Rounding overflow  =>  saturate
     ret
 
 .Lset_0xffff:

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-09-19 14:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-18 17:39 [patch,avr] Fix PR target/99184: Wrong cast from double to 16-bit and 32-bit ints Georg Johann Lay
2022-09-19  7:51 ` [patch, avr] " Richard Biener
2022-09-19  8:57   ` Georg Johann Lay
2022-09-19  9:06     ` Richard Biener
2022-09-19 14:58       ` Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).