From: Avinash Jayakar <[email protected]>

Hi,

Following patch depends on these 2 patches in the following order:
1. mcpu=future: 
https://gcc.gnu.org/pipermail/gcc-patches/2025-December/703739.html
2. future builtin infra: 
https://gcc.gnu.org/pipermail/gcc-patches/2026-March/709782.html

Bootstrapped and regtested on powerpc64le-linux-gnu with no regressions.

Thanks and regards,
Avinash Jayakar

rs6000: Builtins for AES acceleration instructions [RFC02657]

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-03-05  Avinash Jayakar  <[email protected]>

gcc/ChangeLog:

        * config/rs6000/crypto.md (unspec): Add unspec entries for all
        AES acceleration instructions.
        (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.

gcc/testsuite/ChangeLog:

        * gcc.target/powerpc/aes-builtin-1.c: New test.
        * gcc.target/powerpc/aes-builtin-2.c: New test.
---
 gcc/config/rs6000/crypto.md                   | 102 +++++++++++++++++-
 gcc/config/rs6000/rs6000-builtins.def         |  46 ++++++++
 .../gcc.target/powerpc/aes-builtin-1.c        |  90 ++++++++++++++++
 .../gcc.target/powerpc/aes-builtin-2.c        |  34 ++++++
 4 files changed, 271 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

diff --git a/gcc/config/rs6000/crypto.md b/gcc/config/rs6000/crypto.md
index f91791673c9..dcca2288f50 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")])
 
+(define_int_iterator AESACC_base_code [UNSPEC_XXAESENCP
+       UNSPEC_XXAESDECP])
+
+(define_int_iterator AESACC_code [UNSPEC_XXAES128ENCP
+       UNSPEC_XXAES192ENCP
+       UNSPEC_XXAES256ENCP
+       UNSPEC_XXAES128DECP
+       UNSPEC_XXAES192DECP
+       UNSPEC_XXAES256DECP])
+
+(define_int_attr AESACC_base_insn [(UNSPEC_XXAESENCP  "xxaesencp")
+       (UNSPEC_XXAESDECP  "xxaesdecp")])
+
+(define_int_attr AESACC_insn [(UNSPEC_XXAES128ENCP  "xxaes128encp")
+       (UNSPEC_XXAES192ENCP  "xxaes192encp")
+       (UNSPEC_XXAES256ENCP  "xxaes256encp")
+       (UNSPEC_XXAES128DECP  "xxaes128decp")
+       (UNSPEC_XXAES192DECP  "xxaes192decp")
+       (UNSPEC_XXAES256DECP  "xxaes256decp")])
+
+(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")])
+
+(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..bde6f2fe9ca 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 {mma}
+
+  const v256 __builtin_aes128_encrypt_paired (v256, v256);
+    XXAES128ENCP xxaes128encp {mma}
+
+  const v256 __builtin_aes192_encrypt_paired (v256, v256);
+    XXAES192ENCP xxaes192encp {mma}
+
+  const v256 __builtin_aes256_encrypt_paired (v256, v256);
+    XXAES256ENCP xxaes256encp {mma}
+
+  const v256 __builtin_aes_decrypt_paired (v256, v256, const int<2>);
+    XXAESDECP xxaesdecp {mma}
+
+  const v256 __builtin_aes128_decrypt_paired (v256, v256);
+    XXAES128DECP xxaes128decp {mma}
+
+  const v256 __builtin_aes192_decrypt_paired (v256, v256);
+    XXAES192DECP xxaes192decp {mma}
+
+  const v256 __builtin_aes256_decrypt_paired (v256, v256);
+    XXAES256DECP xxaes256decp {mma}
+
+  const v256 __builtin_aes_genlastkey_paired (v256, const int<2>);
+    XXAESGENLKP xxaesgenlkp {mma}
+
+  const v256 __builtin_aes128_genlastkey_paired (v256);
+    XXAES128GENLKP xxaes128genlkp {mma}
+
+  const v256 __builtin_aes192_genlastkey_paired (v256);
+    XXAES192GENLKP xxaes192genlkp {mma}
+
+  const v256 __builtin_aes256_genlastkey_paired (v256);
+    XXAES256GENLKP xxaes256genlkp {mma}
+
+  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/testsuite/gcc.target/powerpc/aes-builtin-1.c 
b/gcc/testsuite/gcc.target/powerpc/aes-builtin-1.c
new file mode 100644
index 00000000000..aa5d61693b2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/aes-builtin-1.c
@@ -0,0 +1,90 @@
+/* { dg-do compile } */
+/* { dg-options "-mdejagnu-cpu=future -O2" } */
+
+void
+aes (__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);
+  c = __builtin_aes_encrypt_paired (c, k, 1);
+  c = __builtin_aes_encrypt_paired (c, k, 2);
+  *res = c;
+}
+void
+aes128 (__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
+aes192 (__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
+aes256 (__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 (__vector_pair *text, __vector_pair *key, __vector_pair *res, int a)
+{
+  __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
+aes128_dec (__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
+aes192_dec (__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
+aes256_dec (__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 {\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 } } */
-- 
2.47.3

Reply via email to