https://gcc.gnu.org/g:80597dcd3432ff9a29e45a5f97f5e788943b2638
commit r13-10340-g80597dcd3432ff9a29e45a5f97f5e788943b2638 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 98572a305571..eef1bd88ee9a 100644 --- a/gcc/config/avr/avr-fixed.md +++ b/gcc/config/avr/avr-fixed.md @@ -44,9 +44,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 @@ -54,7 +54,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; +}
