https://gcc.gnu.org/g:ea1011146819c8e3a0506b6b24ffd4c94156ed26

commit r15-11197-gea1011146819c8e3a0506b6b24ffd4c94156ed26
Author: Georg-Johann Lay <[email protected]>
Date:   Sun May 24 22:16:46 2026 +0200

    AVR: target/125409 - Add fixed-point conversions to / from [u]int24_t.
    
    The test cases ran into
    
        ld: undefined reference to `__fractunssapsi'
        ld: undefined reference to `__fractunspsisa'
    
    etc. because the backend didn't implement these conversions.
    The worker function that outputs fixed-point conversions inline,
    avr_out_fract, is generic enough to handle 24-bit integral modes, so
    adding PSImode to the mode iterators in avr-fixed.md fixes the issue.
    
            PR target/125409
    gcc/
            * config/avr/avr-fixed.md (FIXED_A, FIXED_B): Add PSI to iterators.
    
    gcc/testsuite/
            * gcc.target/avr/torture/pr125409.h: New file.
            * gcc.target/avr/torture/pr125409-fx24-ssk.c: New test.
            * gcc.target/avr/torture/pr125409-fx24-ssr.c: New test.
            * gcc.target/avr/torture/pr125409-fx24-suk.c: New test.
            * gcc.target/avr/torture/pr125409-fx24-sur.c: New test.
            * gcc.target/avr/torture/pr125409-fx24-usk.c: New test.
            * gcc.target/avr/torture/pr125409-fx24-usr.c: New test.
            * gcc.target/avr/torture/pr125409-fx24-uuk.c: New test.
            * gcc.target/avr/torture/pr125409-fx24-uur.c: New test.
    
    (cherry picked from commit 29e4b7f1100ad3dd611da6fc3314a41978c5fc25)

Diff:
---
 gcc/config/avr/avr-fixed.md                              |  6 +++---
 gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-ssk.c |  8 ++++++++
 gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-ssr.c |  8 ++++++++
 gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-suk.c |  8 ++++++++
 gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-sur.c |  8 ++++++++
 gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-usk.c |  8 ++++++++
 gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-usr.c |  8 ++++++++
 gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-uuk.c |  8 ++++++++
 gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-uur.c |  8 ++++++++
 gcc/testsuite/gcc.target/avr/torture/pr125409.h          | 16 ++++++++++++++++
 10 files changed, 83 insertions(+), 3 deletions(-)

diff --git a/gcc/config/avr/avr-fixed.md b/gcc/config/avr/avr-fixed.md
index ce46bebaf3dd..6ee7f0a7f387 100644
--- a/gcc/config/avr/avr-fixed.md
+++ b/gcc/config/avr/avr-fixed.md
@@ -43,9 +43,9 @@
    SQ USQ SA USA
    DQ UDQ DA UDA
    TA UTA
-   QI HI SI DI])
+   QI HI PSI SI DI])
 
-;; Same so that be can build cross products
+;; Same so that we can build cartesian products.
 
 (define_mode_iterator FIXED_B
   [QQ UQQ
@@ -53,7 +53,7 @@
    SQ USQ SA USA
    DQ UDQ DA UDA
    TA UTA
-   QI HI SI DI])
+   QI HI PSI SI DI])
 
 (define_insn_and_split "fract<FIXED_B:mode><FIXED_A:mode>2"
   [(set (match_operand:FIXED_A 0 "register_operand" "=r")
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-ssk.c 
b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-ssk.c
new file mode 100644
index 000000000000..fe502bc4e8ac
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-ssk.c
@@ -0,0 +1,8 @@
+/* { dg-do link { target { ! avr_tiny } } } */
+/* { dg-additional-options "-std=gnu99 -Wno-pedantic" } */
+
+#define TT __int24
+#define UU signed
+#define FX _Accum
+
+#include "pr125409.h"
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-ssr.c 
b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-ssr.c
new file mode 100644
index 000000000000..1e74879b329e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-ssr.c
@@ -0,0 +1,8 @@
+/* { dg-do link { target { ! avr_tiny } } } */
+/* { dg-additional-options "-std=gnu99 -Wno-pedantic" } */
+
+#define TT __int24
+#define UU signed
+#define FX _Fract
+
+#include "pr125409.h"
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-suk.c 
b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-suk.c
new file mode 100644
index 000000000000..0b8187bc2436
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-suk.c
@@ -0,0 +1,8 @@
+/* { dg-do link { target { ! avr_tiny } } } */
+/* { dg-additional-options "-std=gnu99 -Wno-pedantic" } */
+
+#define TT __int24
+#define UU unsigned
+#define FX _Accum
+
+#include "pr125409.h"
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-sur.c 
b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-sur.c
new file mode 100644
index 000000000000..428d30d29f86
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-sur.c
@@ -0,0 +1,8 @@
+/* { dg-do link { target { ! avr_tiny } } } */
+/* { dg-additional-options "-std=gnu99 -Wno-pedantic" } */
+
+#define TT __int24
+#define UU unsigned
+#define FX _Fract
+
+#include "pr125409.h"
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-usk.c 
b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-usk.c
new file mode 100644
index 000000000000..1beefb70ead7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-usk.c
@@ -0,0 +1,8 @@
+/* { dg-do link { target { ! avr_tiny } } } */
+/* { dg-additional-options "-std=gnu99 -Wno-pedantic" } */
+
+#define TT __uint24
+#define UU signed
+#define FX _Accum
+
+#include "pr125409.h"
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-usr.c 
b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-usr.c
new file mode 100644
index 000000000000..b1eca93d6ceb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-usr.c
@@ -0,0 +1,8 @@
+/* { dg-do link { target { ! avr_tiny } } } */
+/* { dg-additional-options "-std=gnu99 -Wno-pedantic" } */
+
+#define TT __uint24
+#define UU signed
+#define FX _Fract
+
+#include "pr125409.h"
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-uuk.c 
b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-uuk.c
new file mode 100644
index 000000000000..481cf0d8d903
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-uuk.c
@@ -0,0 +1,8 @@
+/* { dg-do link { target { ! avr_tiny } } } */
+/* { dg-additional-options "-std=gnu99 -Wno-pedantic" } */
+
+#define TT __uint24
+#define UU unsigned
+#define FX _Accum
+
+#include "pr125409.h"
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-uur.c 
b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-uur.c
new file mode 100644
index 000000000000..a09ab0b5fb11
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr125409-fx24-uur.c
@@ -0,0 +1,8 @@
+/* { dg-do link { target { ! avr_tiny } } } */
+/* { dg-additional-options "-std=gnu99 -Wno-pedantic" } */
+
+#define TT __uint24
+#define UU unsigned
+#define FX _Fract
+
+#include "pr125409.h"
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr125409.h 
b/gcc/testsuite/gcc.target/avr/torture/pr125409.h
new file mode 100644
index 000000000000..b551c701e6fd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr125409.h
@@ -0,0 +1,16 @@
+UU FX fx_fun (TT x) { return x; }
+TT fun_fx (UU FX x) { return x; }
+
+short UU FX hfx_fun (TT x) { return x; }
+TT fun_hfx (UU short FX x) { return x; }
+
+long UU FX lfx_fun (TT x) { return x; }
+TT fun_lfx (UU long FX x) { return x; }
+
+long long UU FX llfx_fun (TT x) { return x; }
+TT fun_llfx (UU long long FX x) { return x; }
+
+int main (void)
+{
+  return 0;
+}

Reply via email to