aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGeorg-Johann Lay <avr@gjlay.de>2024-05-08 17:56:05 +0200
committerGeorg-Johann Lay <avr@gjlay.de>2024-05-08 19:04:06 +0200
commitde4eea7d7ea86e54843507c68d6672eca9d8c7bb (patch)
tree7d238cb292c1bad7eefff0135c4c523bcbda8bfb /gcc
parent2f00e6caca1a14dfe26e94f608e9d79a787ebe08 (diff)
downloadgcc-de4eea7d7ea86e54843507c68d6672eca9d8c7bb.zip
gcc-de4eea7d7ea86e54843507c68d6672eca9d8c7bb.tar.gz
gcc-de4eea7d7ea86e54843507c68d6672eca9d8c7bb.tar.bz2
AVR: target/114981 - Support __builtin_powi[l] / __powidf2.
This supports __powidf2 by means of a double wrapper for already existing f7_powi (renamed to __f7_powi by f7-renames.h). It tweaks the implementation so that it does not perform trivial multiplications with 1.0 any more, but instead uses a move. It also fixes the last statement of f7_powi, which was wrong. Notice that f7_powi was unused until now. PR target/114981 libgcc/config/avr/libf7/ * libf7-common.mk (F7_ASM_PARTS): Add D_powi * libf7-asm.sx (F7MOD_D_powi_, __powidf2): New module and function. * libf7.c (f7_powi): Fix last (wrong) statement. Tweak trivial multiplications with 1.0. gcc/testsuite/ * gcc.target/avr/pr114981-powil.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.target/avr/pr114981-powil.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.target/avr/pr114981-powil.c b/gcc/testsuite/gcc.target/avr/pr114981-powil.c
new file mode 100644
index 0000000..70f8e79
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/pr114981-powil.c
@@ -0,0 +1,33 @@
+/* { dg-do run { target { ! avr_tiny } } } */
+/* { dg-additional-options "-Os" } */
+
+const long double vals[] =
+ {
+ 0.0625L, -0.125L, 0.25L, -0.5L,
+ 1.0L,
+ -2.0L, 4.0L, -8.0L, 16.0L
+ };
+
+#define ARRAY_SIZE(X) ((int) (sizeof(X) / sizeof(*X)))
+
+__attribute__((noinline,noclone))
+void test1 (long double x)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE (vals); ++i)
+ {
+ long double val0 = vals[i];
+ long double val1 = __builtin_powil (x, i - 4);
+ __asm ("" : "+r" (val0));
+
+ if (val0 != val1)
+ __builtin_exit (__LINE__);
+ }
+}
+
+int main (void)
+{
+ test1 (-2.0L);
+ return 0;
+}