diff --git a/math/Versions b/math/Versions
index 986dd3cee4..3cd83c6ded 100644
--- a/math/Versions
+++ b/math/Versions
@@ -575,6 +575,6 @@ libm {
     f32xsubf64x; f32xsubf128; f64subf64x; f64subf128;
     f64xsubf128;
     # No SVID compatible error handling.
-    exp; exp2; log; log2;
+    exp; exp2; log; log2; pow;
   }
 }
diff --git a/math/w_pow.c b/math/w_pow.c
new file mode 100644
index 0000000000..61faa2ed3f
--- /dev/null
+++ b/math/w_pow.c
@@ -0,0 +1,8 @@
+#include <math-type-macros-double.h>
+#undef __USE_WRAPPER_TEMPLATE
+#define __USE_WRAPPER_TEMPLATE 1
+#undef declare_mgen_alias
+#define declare_mgen_alias(a, b)
+#include <w_pow_template.c>
+versioned_symbol (libm, __pow, pow, GLIBC_2_28);
+libm_alias_double_other (__pow, pow)
diff --git a/math/w_pow_compat.c b/math/w_pow_compat.c
index 815c67963b..ca2011f4c6 100644
--- a/math/w_pow_compat.c
+++ b/math/w_pow_compat.c
@@ -22,10 +22,10 @@
 #include <libm-alias-double.h>
 
 
-#if LIBM_SVID_COMPAT
+#if LIBM_SVID_COMPAT && SHLIB_COMPAT (libm, GLIBC_2_0, GLIBC_2_28)
 /* wrapper pow */
 double
-__pow (double x, double y)
+__pow_compat (double x, double y)
 {
   double z = __ieee754_pow (x, y);
   if (__glibc_unlikely (!isfinite (z)))
@@ -60,5 +60,5 @@ __pow (double x, double y)
 
   return z;
 }
-libm_alias_double (__pow, pow)
+compat_symbol (libm, __pow_compat, pow, GLIBC_2_0);
 #endif
diff --git a/sysdeps/i386/fpu/w_pow.c b/sysdeps/i386/fpu/w_pow.c
new file mode 100644
index 0000000000..b50c1988de
--- /dev/null
+++ b/sysdeps/i386/fpu/w_pow.c
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_pow.c>
diff --git a/sysdeps/ia64/fpu/e_pow.S b/sysdeps/ia64/fpu/e_pow.S
index 3b402f3f14..db209da24e 100644
--- a/sysdeps/ia64/fpu/e_pow.S
+++ b/sysdeps/ia64/fpu/e_pow.S
@@ -2235,6 +2235,12 @@ POW_OVER_UNDER_ERROR:
 
 GLOBAL_LIBM_END(pow)
 libm_alias_double_other (pow, pow)
+#ifdef SHARED
+.symver pow,pow@@GLIBC_2.28
+.weak __pow_compat
+.set __pow_compat,__pow
+.symver __pow_compat,pow@GLIBC_2.0
+#endif
 
 
 LOCAL_LIBM_ENTRY(__libm_error_region)
diff --git a/sysdeps/ieee754/dbl-64/e_pow.c b/sysdeps/ieee754/dbl-64/e_pow.c
index 1d7ecd2fc1..892c8855a3 100644
--- a/sysdeps/ieee754/dbl-64/e_pow.c
+++ b/sysdeps/ieee754/dbl-64/e_pow.c
@@ -20,6 +20,8 @@
 #include <stdint.h>
 #include <math-barriers.h>
 #include <math-narrow-eval.h>
+#include <shlib-compat.h>
+#include <libm-alias-double.h>
 #include "math_config.h"
 
 /*
@@ -282,7 +284,7 @@ zeroinfnan (uint64_t i)
 
 double
 SECTION
-__ieee754_pow (double x, double y)
+__pow (double x, double y)
 {
   uint32_t sign_bias = 0;
   uint64_t ix, iy;
@@ -381,6 +383,9 @@ __ieee754_pow (double x, double y)
 #endif
   return exp_inline (ehi, elo, sign_bias);
 }
-#ifndef __ieee754_pow
-strong_alias (__ieee754_pow, __pow_finite)
+#ifndef __pow
+strong_alias (__pow, __ieee754_pow)
+strong_alias (__pow, __pow_finite)
+versioned_symbol (libm, __pow, pow, GLIBC_2_28);
+libm_alias_double_other (__pow, pow)
 #endif
diff --git a/sysdeps/ieee754/dbl-64/w_pow.c b/sysdeps/ieee754/dbl-64/w_pow.c
new file mode 100644
index 0000000000..1cc8931700
--- /dev/null
+++ b/sysdeps/ieee754/dbl-64/w_pow.c
@@ -0,0 +1 @@
+/* Not needed.  */
diff --git a/sysdeps/m68k/m680x0/fpu/w_pow.c b/sysdeps/m68k/m680x0/fpu/w_pow.c
new file mode 100644
index 0000000000..b50c1988de
--- /dev/null
+++ b/sysdeps/m68k/m680x0/fpu/w_pow.c
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_pow.c>
diff --git a/sysdeps/mach/hurd/i386/libm.abilist b/sysdeps/mach/hurd/i386/libm.abilist
index 49b8298cae..f64efcf832 100644
--- a/sysdeps/mach/hurd/i386/libm.abilist
+++ b/sysdeps/mach/hurd/i386/libm.abilist
@@ -1072,3 +1072,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index 5822c73a25..d44416e6d1 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -1036,3 +1036,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index 99fd72df34..6627df2fdb 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -1047,6 +1047,7 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.3.4 __c1_cabsf F
 GLIBC_2.3.4 __c1_cacosf F
 GLIBC_2.3.4 __c1_cacoshf F
diff --git a/sysdeps/unix/sysv/linux/arm/libm.abilist b/sysdeps/unix/sysv/linux/arm/libm.abilist
index f25337fe76..2c4a87e29f 100644
--- a/sysdeps/unix/sysv/linux/arm/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libm.abilist
@@ -457,6 +457,7 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
 GLIBC_2.4 __clog10f F
diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist
index cee07ba66c..cd2ab5d6b5 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -768,4 +768,5 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index 98f19cb137..397754a76c 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -1079,3 +1079,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/unix/sysv/linux/ia64/libm.abilist b/sysdeps/unix/sysv/linux/ia64/libm.abilist
index b32cff741b..2e6a56e93a 100644
--- a/sysdeps/unix/sysv/linux/ia64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libm.abilist
@@ -1009,3 +1009,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
index f25337fe76..2c4a87e29f 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -457,6 +457,7 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
 GLIBC_2.4 __clog10f F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
index 9a04d77ec0..bc3923d037 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
@@ -808,3 +808,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/unix/sysv/linux/microblaze/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
index 519eaa6df9..8d6ab715f3 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
@@ -769,3 +769,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
index 4050a919d5..0bf2708cc3 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
@@ -768,4 +768,5 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
index 61c60c4e11..41fc36a4cf 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
@@ -1036,3 +1036,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/unix/sysv/linux/nios2/libm.abilist b/sysdeps/unix/sysv/linux/nios2/libm.abilist
index bc52c8f7ee..d1e51e54b5 100644
--- a/sysdeps/unix/sysv/linux/nios2/libm.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libm.abilist
@@ -769,3 +769,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
index 66f87147e2..a981a16d97 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
@@ -814,6 +814,7 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
 GLIBC_2.4 __fpclassifyl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
index 324b4e68dc..bdb4c81fa5 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
@@ -813,6 +813,7 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
 GLIBC_2.4 __fpclassifyl F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
index 39ff08b018..ee4f9530b9 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
@@ -492,6 +492,7 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.3 _LIB_VERSION D 0x4
 GLIBC_2.3 __clog10 F
 GLIBC_2.3 __clog10f F
diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libm.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libm.abilist
index 1c8404c8de..b5706d4b8b 100644
--- a/sysdeps/unix/sysv/linux/riscv/rv64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/riscv/rv64/libm.abilist
@@ -1023,3 +1023,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
index ba4d1a1959..0faa0190c6 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
@@ -1037,6 +1037,7 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
 GLIBC_2.4 __fpclassifyl F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
index 3649e5321a..8e48dee271 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
@@ -1037,6 +1037,7 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
 GLIBC_2.4 __fpclassifyl F
diff --git a/sysdeps/unix/sysv/linux/sh/libm.abilist b/sysdeps/unix/sysv/linux/sh/libm.abilist
index 5e42e06e1d..372d58c03b 100644
--- a/sysdeps/unix/sysv/linux/sh/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libm.abilist
@@ -768,4 +768,5 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
index 795f7a70de..68b768d05f 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
@@ -1044,6 +1044,7 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
 GLIBC_2.4 __fpclassifyl F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
index e3cd41f16e..9dc43cb5a6 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
@@ -1036,3 +1036,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
index 6d9a61107c..1700ba655e 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
@@ -1070,3 +1070,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
index ca609340df..4d246c982e 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
@@ -1070,3 +1070,4 @@ GLIBC_2.28 fsub F
 GLIBC_2.28 fsubl F
 GLIBC_2.28 log F
 GLIBC_2.28 log2 F
+GLIBC_2.28 pow F
diff --git a/sysdeps/x86_64/fpu/multiarch/e_pow-fma.c b/sysdeps/x86_64/fpu/multiarch/e_pow-fma.c
index 73c1e7fb89..a6b38785f7 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_pow-fma.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_pow-fma.c
@@ -1,5 +1,4 @@
-#define __ieee754_pow __ieee754_pow_fma
-#define __exp1 __exp1_fma
+#define __pow __ieee754_pow_fma
 #define SECTION __attribute__ ((section (".text.fma")))
 
 #include <sysdeps/ieee754/dbl-64/e_pow.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_pow-fma4.c b/sysdeps/x86_64/fpu/multiarch/e_pow-fma4.c
index 8971b655ca..b417c3567c 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_pow-fma4.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_pow-fma4.c
@@ -1,5 +1,4 @@
-#define __ieee754_pow __ieee754_pow_fma4
-#define __exp1 __exp1_fma4
+#define __pow __ieee754_pow_fma4
 #define SECTION __attribute__ ((section (".text.fma4")))
 
 #include <sysdeps/ieee754/dbl-64/e_pow.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/e_pow.c b/sysdeps/x86_64/fpu/multiarch/e_pow.c
index 084073c936..207ffcd2f1 100644
--- a/sysdeps/x86_64/fpu/multiarch/e_pow.c
+++ b/sysdeps/x86_64/fpu/multiarch/e_pow.c
@@ -16,6 +16,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#include <math.h>
+
 extern double __redirect_ieee754_pow (double, double);
 
 #define SYMBOL_NAME ieee754_pow
@@ -25,5 +27,5 @@ libc_ifunc_redirected (__redirect_ieee754_pow,
 		       __ieee754_pow, IFUNC_SELECTOR ());
 strong_alias (__ieee754_pow, __pow_finite)
 
-#define __ieee754_pow __ieee754_pow_sse2
+#define __pow __ieee754_pow_sse2
 #include <sysdeps/ieee754/dbl-64/e_pow.c>
diff --git a/sysdeps/x86_64/fpu/multiarch/w_pow.c b/sysdeps/x86_64/fpu/multiarch/w_pow.c
new file mode 100644
index 0000000000..b50c1988de
--- /dev/null
+++ b/sysdeps/x86_64/fpu/multiarch/w_pow.c
@@ -0,0 +1 @@
+#include <sysdeps/../math/w_pow.c>
