Fixed-point <-> [u]int24_t conversions are running into link failures:
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.
Ok to apply?
Johann
--
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.
diff --git a/gcc/config/avr/avr-fixed.md b/gcc/config/avr/avr-fixed.md
index 5d2147d7dad..7859f89bb5f 100644
--- a/gcc/config/avr/avr-fixed.md
+++ b/gcc/config/avr/avr-fixed.md
@@ -43,9 +43,9 @@ (define_mode_iterator FIXED_A
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 @@ (define_mode_iterator FIXED_B
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 00000000000..fe502bc4e8a
--- /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 00000000000..1e74879b329
--- /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 00000000000..0b8187bc243
--- /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 00000000000..428d30d29f8
--- /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 00000000000..1beefb70ead
--- /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 00000000000..b1eca93d6ce
--- /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 00000000000..481cf0d8d90
--- /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 00000000000..a09ab0b5fb1
--- /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 00000000000..b551c701e6f
--- /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;
+}