This patch adds new builtins for AES acceleration instructions which
may or may not be supported in a future processor. Note, the names of
the builtins may change in future.
The following new builtins for AES acceleration can be used with
-mcpu=future option:
__vector_pair __builtin_aes_encrypt_paired (__vector_pair,
__vector_pair, uint2);
__vector_pair __builtin_aes128_encrypt_paired (__vector_pair,
__vector_pair);
__vector_pair __builtin_aes192_encrypt_paired (__vector_pair,
__vector_pair);
__vector_pair __builtin_aes256_encrypt_paired (__vector_pair,
__vector_pair);
__vector_pair __builtin_aes_decrypt_paired (__vector_pair,
__vector_pair, uint2);
__vector_pair __builtin_aes128_decrypt_paired (__vector_pair,
__vector_pair);
__vector_pair __builtin_aes192_decrypt_paired (__vector_pair,
__vector_pair);
__vector_pair __builtin_aes256_decrypt_paired (__vector_pair,
__vector_pair);
__vector_pair __builtin_aes_genlastkey_paired (__vector_pair, uint2);
__vector_pair __builtin_aes128_genlastkey_paired (__vector_pair);
__vector_pair __builtin_aes192_genlastkey_paired (__vector_pair);
__vector_pair __builtin_aes256_genlastkey_paired (__vector_pair);
vec_t __builtin_galois_field_mult (vec_t, vec_t, uint1);
vec_t __builtin_galois_field_mult_gcm (vec_t, vec_t);
vec_t __builtin_galois_field_mult_xts (vec_t, vec_t);
2026-05-07 Avinash Jayakar <[email protected]>
gcc/ChangeLog:
* config/rs6000/crypto.md (UNSPEC_XXAESENCP): New unspec entry.
(UNSPEC_XXAES128ENCP): Likewise.
(UNSPEC_XXAES192ENCP): Likewise.
(UNSPEC_XXAES256ENCP): Likewise.
(UNSPEC_XXAESDECP): Likewise.
(UNSPEC_XXAES128DECP): Likewise.
(UNSPEC_XXAES192DECP): Likewise.
(UNSPEC_XXAES256DECP): Likewise.
(UNSPEC_XXAESGENLKP): Likewise.
(UNSPEC_XXAES128GENLKP): Likewise.
(UNSPEC_XXAES192GENLKP): Likewise.
(UNSPEC_XXAES256GENLKP): Likewise.
(UNSPEC_XXGFMUL128): Likewise.
(UNSPEC_XXGFMUL128GCM): Likewise.
(UNSPEC_XXGFMUL128XTS): Likewise.
(AESACC_base_code): New iterator for xxaesencp and xxaesdecp base
mnemonics.
(AESACC_code): New iterator for xxaesencp and xxaesdecp extended
mnemonics.
(AESGENLKP_code): New iterator for xxaesgenlkp extended mnemonics.
(AESGF_code): New iterator for xxgfmul128 extended mnemonics.
(AESACC_base_insn): New attribute iterator for xxaesencp and xxaesdecp
base mnemonics.
(AESACC_insn): New attribute iterator for xxaesencp and xxaesdecp
extended mnemonics.
(AESGENLKP_insn): New attribute iterator for xxaesgenlkp extended
mnemonics.
(AESGF_insn): New attribute iterator for xxgfmul128 extended mnemonics.
(<AESACC_base_insn>): New define_insn for xxaesencp and xxaesdecp base
mnemonics.
(<AESACC_insn>): New define_insn for xxaesencp and xxaesdecp extended
mnemonics.
(<AESGENLKP_insn>): New define_insn for xxaesgenlkp extended mnemonics.
(xxaesgenlkp): New define_insn for genlkp base mnemonic.
(<AESGF_insn>): New define_insn for xxgfmul128 extended mnemonics.
(xxgfmul128): New define_insn for xxgfmul128 base mnemonic.
* config/rs6000/rs6000-builtins.def: Added new builtin definitions for
AES acceleration.
* doc/extend.texi: Add new section for AES acceleration builtins
for Future ISA.
gcc/testsuite/ChangeLog:
* gcc.target/powerpc/aes-builtin-1.c: New test.
* gcc.target/powerpc/aes-builtin-2.c: New test.
* gcc.target/powerpc/aes-builtin-3.c: New test.
---
gcc/config/rs6000/crypto.md | 102 +++++++++++-
gcc/config/rs6000/rs6000-builtins.def | 46 ++++++
gcc/doc/extend.texi | 51 ++++++
.../gcc.target/powerpc/aes-builtin-1.c | 155 ++++++++++++++++++
.../gcc.target/powerpc/aes-builtin-2.c | 34 ++++
.../gcc.target/powerpc/aes-builtin-3.c | 52 ++++++
6 files changed, 439 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gcc.target/powerpc/aes-builtin-1.c
create mode 100644 gcc/testsuite/gcc.target/powerpc/aes-builtin-2.c
create mode 100644 gcc/testsuite/gcc.target/powerpc/aes-builtin-3.c
diff --git a/gcc/config/rs6000/crypto.md b/gcc/config/rs6000/crypto.md
index f91791673c9..a25d9f75439 100644
--- a/gcc/config/rs6000/crypto.md
+++ b/gcc/config/rs6000/crypto.md
@@ -35,7 +35,22 @@ (define_c_enum "unspec"
UNSPEC_VSBOX
UNSPEC_VSHASIGMA
UNSPEC_VPERMXOR
- UNSPEC_VPMSUM])
+ UNSPEC_VPMSUM
+ UNSPEC_XXAESENCP
+ UNSPEC_XXAES128ENCP
+ UNSPEC_XXAES192ENCP
+ UNSPEC_XXAES256ENCP
+ UNSPEC_XXAESDECP
+ UNSPEC_XXAES128DECP
+ UNSPEC_XXAES192DECP
+ UNSPEC_XXAES256DECP
+ UNSPEC_XXAESGENLKP
+ UNSPEC_XXAES128GENLKP
+ UNSPEC_XXAES192GENLKP
+ UNSPEC_XXAES256GENLKP
+ UNSPEC_XXGFMUL128
+ UNSPEC_XXGFMUL128GCM
+ UNSPEC_XXGFMUL128XTS])
;; Iterator for VPMSUM/VPERMXOR
(define_mode_iterator CR_mode [V16QI V8HI V4SI V2DI])
@@ -62,6 +77,40 @@ (define_int_attr CR_insn [(UNSPEC_VCIPHER "vcipher")
(UNSPEC_VCIPHERLAST "vcipherlast")
(UNSPEC_VNCIPHERLAST "vncipherlast")])
+;; Iterator and attribute for AES encrypt/decrypt
+(define_int_iterator AESACC_base_code [UNSPEC_XXAESENCP
+ UNSPEC_XXAESDECP])
+(define_int_attr AESACC_base_insn [(UNSPEC_XXAESENCP "xxaesencp")
+ (UNSPEC_XXAESDECP "xxaesdecp")])
+
+;; Iterator and attribute for AES encrypt/decrypt extended mnemonics
+(define_int_iterator AESACC_code [UNSPEC_XXAES128ENCP
+ UNSPEC_XXAES192ENCP
+ UNSPEC_XXAES256ENCP
+ UNSPEC_XXAES128DECP
+ UNSPEC_XXAES192DECP
+ UNSPEC_XXAES256DECP])
+(define_int_attr AESACC_insn [(UNSPEC_XXAES128ENCP "xxaes128encp")
+ (UNSPEC_XXAES192ENCP "xxaes192encp")
+ (UNSPEC_XXAES256ENCP "xxaes256encp")
+ (UNSPEC_XXAES128DECP "xxaes128decp")
+ (UNSPEC_XXAES192DECP "xxaes192decp")
+ (UNSPEC_XXAES256DECP "xxaes256decp")])
+
+;; Iterator and attribute for AES gen last key extended mnemonics
+(define_int_iterator AESGENLKP_code [UNSPEC_XXAES128GENLKP
+ UNSPEC_XXAES192GENLKP
+ UNSPEC_XXAES256GENLKP])
+(define_int_attr AESGENLKP_insn [(UNSPEC_XXAES128GENLKP "xxaes128genlkp")
+ (UNSPEC_XXAES192GENLKP "xxaes192genlkp")
+ (UNSPEC_XXAES256GENLKP "xxaes256genlkp")])
+
+;; Iterator and attribute for AES galois field mult extended mnemonics
+(define_int_iterator AESGF_code [UNSPEC_XXGFMUL128GCM
+ UNSPEC_XXGFMUL128XTS])
+(define_int_attr AESGF_insn [(UNSPEC_XXGFMUL128GCM "xxgfmul128gcm")
+ (UNSPEC_XXGFMUL128XTS "xxgfmul128xts")])
+
;; 2 operand crypto instructions
(define_insn "crypto_<CR_insn>_<mode>"
[(set (match_operand:CR_vqdi 0 "register_operand" "=v")
@@ -111,3 +160,54 @@ (define_insn "crypto_vshasigma<CR_char>"
"TARGET_CRYPTO"
"vshasigma<CR_char> %0,%1,%2,%3"
[(set_attr "type" "vecsimple")])
+
+;; AES acceleration instructions
+
+(define_insn "<AESACC_base_insn>"
+ [(set (match_operand:OO 0 "vsx_register_operand" "=wa")
+ (unspec:OO [(match_operand:OO 1 "vsx_register_operand" "wa")
+ (match_operand:OO 2 "vsx_register_operand" "wa")
+ (match_operand:SI 3 "const_0_to_3_operand" "n")]
+ AESACC_base_code))]
+ "TARGET_FUTURE"
+ "<AESACC_base_insn> %x0,%x1,%x2,%3")
+
+(define_insn "<AESACC_insn>"
+ [(set (match_operand:OO 0 "vsx_register_operand" "=wa")
+ (unspec:OO [(match_operand:OO 1 "vsx_register_operand" "wa")
+ (match_operand:OO 2 "vsx_register_operand" "wa")]
+ AESACC_code))]
+ "TARGET_FUTURE"
+ "<AESACC_insn> %x0,%x1,%x2")
+
+(define_insn "xxaesgenlkp"
+ [(set (match_operand:OO 0 "vsx_register_operand" "=wa")
+ (unspec:OO [(match_operand:OO 1 "vsx_register_operand" "wa")
+ (match_operand:SI 2 "const_0_to_3_operand" "n")]
+ UNSPEC_XXAESGENLKP))]
+ "TARGET_FUTURE"
+ "xxaesgenlkp %x0,%x1,%2")
+
+(define_insn "<AESGENLKP_insn>"
+ [(set (match_operand:OO 0 "vsx_register_operand" "=wa")
+ (unspec:OO [(match_operand:OO 1 "vsx_register_operand" "wa")]
+ AESGENLKP_code))]
+ "TARGET_FUTURE"
+ "<AESGENLKP_insn> %x0,%x1")
+
+(define_insn "xxgfmul128"
+ [(set (match_operand:V16QI 0 "vsx_register_operand" "=wa")
+ (unspec:V16QI [(match_operand:V16QI 1 "vsx_register_operand" "wa")
+ (match_operand:V16QI 2 "vsx_register_operand" "wa")
+ (match_operand:SI 3 "const_0_to_1_operand" "n")]
+ UNSPEC_XXGFMUL128))]
+ "TARGET_FUTURE"
+ "xxgfmul128 %x0,%x1,%x2,%3")
+
+(define_insn "<AESGF_insn>"
+ [(set (match_operand:V16QI 0 "vsx_register_operand" "=wa")
+ (unspec:V16QI [(match_operand:V16QI 1 "vsx_register_operand" "wa")
+ (match_operand:V16QI 2 "vsx_register_operand" "wa")]
+ AESGF_code))]
+ "TARGET_FUTURE"
+ "<AESGF_insn> %x0,%x1,%x2")
diff --git a/gcc/config/rs6000/rs6000-builtins.def
b/gcc/config/rs6000/rs6000-builtins.def
index 7e5a4fb96e7..0d1529b71d4 100644
--- a/gcc/config/rs6000/rs6000-builtins.def
+++ b/gcc/config/rs6000/rs6000-builtins.def
@@ -3924,3 +3924,49 @@
void __builtin_vsx_stxvp (v256, unsigned long, const v256 *);
STXVP nothing {mma,pair}
+
+[future]
+ const v256 __builtin_aes_encrypt_paired (v256, v256, const int<2>);
+ XXAESENCP xxaesencp {}
+
+ const v256 __builtin_aes128_encrypt_paired (v256, v256);
+ XXAES128ENCP xxaes128encp {}
+
+ const v256 __builtin_aes192_encrypt_paired (v256, v256);
+ XXAES192ENCP xxaes192encp {}
+
+ const v256 __builtin_aes256_encrypt_paired (v256, v256);
+ XXAES256ENCP xxaes256encp {}
+
+ const v256 __builtin_aes_decrypt_paired (v256, v256, const int<2>);
+ XXAESDECP xxaesdecp {}
+
+ const v256 __builtin_aes128_decrypt_paired (v256, v256);
+ XXAES128DECP xxaes128decp {}
+
+ const v256 __builtin_aes192_decrypt_paired (v256, v256);
+ XXAES192DECP xxaes192decp {}
+
+ const v256 __builtin_aes256_decrypt_paired (v256, v256);
+ XXAES256DECP xxaes256decp {}
+
+ const v256 __builtin_aes_genlastkey_paired (v256, const int<2>);
+ XXAESGENLKP xxaesgenlkp {}
+
+ const v256 __builtin_aes128_genlastkey_paired (v256);
+ XXAES128GENLKP xxaes128genlkp {}
+
+ const v256 __builtin_aes192_genlastkey_paired (v256);
+ XXAES192GENLKP xxaes192genlkp {}
+
+ const v256 __builtin_aes256_genlastkey_paired (v256);
+ XXAES256GENLKP xxaes256genlkp {}
+
+ const vuc __builtin_galois_field_mult (vuc, vuc, const int<1>);
+ XXGFMUL128 xxgfmul128 {}
+
+ const vuc __builtin_galois_field_mult_gcm (vuc, vuc);
+ XXGFMUL128GCM xxgfmul128gcm {}
+
+ const vuc __builtin_galois_field_mult_xts (vuc, vuc);
+ XXGFMUL128XTS xxgfmul128xts {}
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 181e7e1bf52..42f83b98a05 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -24654,6 +24654,7 @@ The PVIPR documents the following overloaded functions:
* PowerPC AltiVec Built-in Functions Available on ISA 2.07::
* PowerPC AltiVec Built-in Functions Available on ISA 3.0::
* PowerPC AltiVec Built-in Functions Available on ISA 3.1::
+* PowerPC AltiVec/VSX Built-in Functions Available on Future ISA::
@end menu
@node PowerPC AltiVec Built-in Functions on ISA 2.05
@@ -26687,6 +26688,56 @@ vector unsigned char);
vector unsigned char);
@end smallexample
+@node PowerPC AltiVec/VSX Built-in Functions Available on Future ISA
+@subsubsection PowerPC AltiVec/VSX Built-in Functions Available on Future ISA
+
+The following additional built-in functions are available for the
+PowerPC family of processors, starting with Future ISA.
+
+Future ISA of the PowerPC may add new instructions for accelerating AES
+algorithm. GCC provides support for these new instructions through the
+following built-in functions. The third argument to
+@var{__builtin_aes_encrypt_paired} and @var{__builtin_aes_decrypt_paired} must
+be a constant integer that is 0, 1 or 2. The values correspond to 128, 192 and
+256 bit AES encryption/decryption respectively. The third argument to
+@var{__builtin_galois_field_mult} must be a constant integer that is 0 or 1.
+The values correspond to gcm and xts variant respectively.
+
+@smallexample
+__vector_pair __builtin_aes_encrypt_paired (__vector_pair, __vector_pair,
+ int);
+
+__vector_pair __builtin_aes128_encrypt_paired (__vector_pair, __vector_pair);
+
+__vector_pair __builtin_aes192_encrypt_paired (__vector_pair, __vector_pair);
+
+__vector_pair __builtin_aes256_encrypt_paired (__vector_pair, __vector_pair);
+
+__vector_pair __builtin_aes_decrypt_paired (__vector_pair, __vector_pair,
+ int);
+
+__vector_pair __builtin_aes128_decrypt_paired (__vector_pair, __vector_pair);
+
+__vector_pair __builtin_aes192_decrypt_paired (__vector_pair, __vector_pair);
+
+__vector_pair __builtin_aes256_decrypt_paired (__vector_pair, __vector_pair);
+
+__vector_pair __builtin_aes_genlastkey_paired (__vector_pair, int);
+
+__vector_pair __builtin_aes128_genlastkey_paired (__vector_pair);
+
+__vector_pair __builtin_aes192_genlastkey_paired (__vector_pair);
+
+__vector_pair __builtin_aes256_genlastkey_paired (__vector_pair);
+
+vec_t __builtin_galois_field_mult (vec_t, vec_t, int);
+
+vec_t __builtin_galois_field_mult_gcm (vec_t, vec_t);
+
+vec_t __builtin_galois_field_mult_xts (vec_t, vec_t);
+@end smallexample
+
+
@node PowerPC Hardware Transactional Memory Built-in Functions
@subsection PowerPC Hardware Transactional Memory Built-in Functions
GCC provides two interfaces for accessing the Hardware Transactional
diff --git a/gcc/testsuite/gcc.target/powerpc/aes-builtin-1.c
b/gcc/testsuite/gcc.target/powerpc/aes-builtin-1.c
new file mode 100644
index 00000000000..2777fcdc7ae
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/aes-builtin-1.c
@@ -0,0 +1,155 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future -O2" } */
+
+void
+aes_enc_pair_0 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes_encrypt_paired (t, k, 0);
+ *res = c;
+}
+void
+aes_enc_pair_1 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes_encrypt_paired (t, k, 1);
+ *res = c;
+}
+void
+aes_enc_pair_2 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes_encrypt_paired (t, k, 2);
+ *res = c;
+}
+void
+aes_enc_pair_128 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes128_encrypt_paired (t, k);
+ *res = c;
+}
+void
+aes_enc_pair_192 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes192_encrypt_paired (t, k);
+ *res = c;
+}
+void
+aes_enc_pair_256 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes256_encrypt_paired (t, k);
+ *res = c;
+}
+void
+aes_dec_pair_0 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes_decrypt_paired (t, k, 0);
+ *res = c;
+}
+void
+aes_dec_pair_1 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes_decrypt_paired (t, k, 1);
+ *res = c;
+}
+void
+aes_dec_pair_2 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes_decrypt_paired (t, k, 2);
+ *res = c;
+}
+void
+aes_dec_pair_128 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes128_decrypt_paired (t, k);
+ *res = c;
+}
+void
+aes_dec_pair_192 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes192_decrypt_paired (t, k);
+ *res = c;
+}
+void
+aes_dec_pair_256 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes256_decrypt_paired (t, k);
+ *res = c;
+}
+void
+aes_genlastkey_paired_0 (__vector_pair *key, __vector_pair *res)
+{
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes_genlastkey_paired (k, 0);
+ *res = c;
+}
+void
+aes_genlastkey_paired_1 (__vector_pair *key, __vector_pair *res)
+{
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes_genlastkey_paired (k, 1);
+ *res = c;
+}
+void
+aes_genlastkey_paired_2 (__vector_pair *key, __vector_pair *res)
+{
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes_genlastkey_paired (k, 2);
+ *res = c;
+}
+void
+aes_genlastkey_paired_128 (__vector_pair *key, __vector_pair *res)
+{
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes128_genlastkey_paired (k);
+ *res = c;
+}
+void
+aes_genlastkey_paired_192 (__vector_pair *key, __vector_pair *res)
+{
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes192_genlastkey_paired (k);
+ *res = c;
+}
+void
+aes_genlastkey_paired_256 (__vector_pair *key, __vector_pair *res)
+{
+ __vector_pair k = *key;
+ __vector_pair c = __builtin_aes256_genlastkey_paired (k);
+ *res = c;
+}
+
+
+/* { dg-final { scan-assembler-times {\mxxaesencp\M} 3 } } */
+/* { dg-final { scan-assembler-times {\mxxaes128encp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaes192encp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaes256encp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaesdecp\M} 3 } } */
+/* { dg-final { scan-assembler-times {\mxxaes128decp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaes192decp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaes256decp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaesgenlkp\M} 3 } } */
+/* { dg-final { scan-assembler-times {\mxxaes128genlkp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaes192genlkp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaes256genlkp\M} 1 } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/aes-builtin-2.c
b/gcc/testsuite/gcc.target/powerpc/aes-builtin-2.c
new file mode 100644
index 00000000000..98f16ad0fe8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/aes-builtin-2.c
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future -O2" } */
+
+typedef unsigned char vec_t __attribute__((vector_size(16)));
+
+void
+gfmul (vec_t *a, vec_t *b, vec_t *res)
+{
+ vec_t A = *a;
+ vec_t B = *b;
+ vec_t R = __builtin_galois_field_mult (A, B, 0);
+ R = __builtin_galois_field_mult (R, B, 1);
+ *res = R;
+}
+void
+gfmul_gcm (vec_t *a, vec_t *b, vec_t *res)
+{
+ vec_t A = *a;
+ vec_t B = *b;
+ vec_t R = __builtin_galois_field_mult_gcm (A, B);
+ *res = R;
+}
+void
+gfmul_xts (vec_t *a, vec_t *b, vec_t *res)
+{
+ vec_t A = *a;
+ vec_t B = *b;
+ vec_t R = __builtin_galois_field_mult_xts (A, B);
+ *res = R;
+}
+
+/* { dg-final { scan-assembler-times {\mxxgfmul128\M} 2 } } */
+/* { dg-final { scan-assembler-times {\mxxgfmul128gcm\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxgfmul128xts\M} 1 } } */
diff --git a/gcc/testsuite/gcc.target/powerpc/aes-builtin-3.c
b/gcc/testsuite/gcc.target/powerpc/aes-builtin-3.c
new file mode 100644
index 00000000000..007bf878afb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/aes-builtin-3.c
@@ -0,0 +1,52 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future -O2" } */
+
+void
+aes_dec_pair (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair lk = __builtin_aes_genlastkey_paired (k, 0);
+ __vector_pair c = __builtin_aes_decrypt_paired (t, lk, 0);
+ lk = __builtin_aes_genlastkey_paired (k, 1);
+ c = __builtin_aes_decrypt_paired (c, lk, 1);
+ lk = __builtin_aes_genlastkey_paired (k, 2);
+ c = __builtin_aes_decrypt_paired (c, lk, 2);
+ *res = c;
+}
+void
+aes_dec_pair_128 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair lk = __builtin_aes128_genlastkey_paired (k);
+ __vector_pair c = __builtin_aes128_decrypt_paired (t, lk);
+ *res = c;
+}
+void
+aes_dec_pair_192 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair lk = __builtin_aes192_genlastkey_paired (k);
+ __vector_pair c = __builtin_aes192_decrypt_paired (t, lk);
+ *res = c;
+}
+void
+aes_dec_pair_256 (__vector_pair *text, __vector_pair *key, __vector_pair *res)
+{
+ __vector_pair t = *text;
+ __vector_pair k = *key;
+ __vector_pair lk = __builtin_aes256_genlastkey_paired (k);
+ __vector_pair c = __builtin_aes256_decrypt_paired (t, lk);
+ *res = c;
+}
+
+/* { dg-final { scan-assembler-times {\mxxaesdecp\M} 3 } } */
+/* { dg-final { scan-assembler-times {\mxxaes128decp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaes192decp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaes256decp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaesgenlkp\M} 3 } } */
+/* { dg-final { scan-assembler-times {\mxxaes128genlkp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaes192genlkp\M} 1 } } */
+/* { dg-final { scan-assembler-times {\mxxaes256genlkp\M} 1 } } */
\ No newline at end of file
--
2.51.0