;; Machine description for RISC-V Scalar Cryptography extensions.
;; Copyright (C) 2023 Free Software Foundation, Inc.
;; This file is part of GCC.
;; GCC is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; GCC is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GCC; see the file COPYING3. If not see
;; .
(define_c_enum "unspec" [
;; Zbkb unspecs
UNSPEC_BREV8
UNSPEC_ZIP
UNSPEC_UNZIP
UNSPEC_PACK
UNSPEC_PACKH
UNSPEC_PACKW
;; Zbkc unspecs
UNSPEC_CLMUL
UNSPEC_CLMULH
;; Zbkx unspecs
UNSPEC_XPERM8
UNSPEC_XPERM4
;; Zknd unspecs
UNSPEC_AES_DSI
UNSPEC_AES_DSMI
UNSPEC_AES_DS
UNSPEC_AES_DSM
UNSPEC_AES_IM
UNSPEC_AES_KS1I
UNSPEC_AES_KS2
;; Zkne unspecs
UNSPEC_AES_ES
UNSPEC_AES_ESM
UNSPEC_AES_ESI
UNSPEC_AES_ESMI
;; Zknh unspecs
UNSPEC_SHA_256_SIG0
UNSPEC_SHA_256_SIG1
UNSPEC_SHA_256_SUM0
UNSPEC_SHA_256_SUM1
UNSPEC_SHA_512_SIG0
UNSPEC_SHA_512_SIG0H
UNSPEC_SHA_512_SIG0L
UNSPEC_SHA_512_SIG1
UNSPEC_SHA_512_SIG1H
UNSPEC_SHA_512_SIG1L
UNSPEC_SHA_512_SUM0
UNSPEC_SHA_512_SUM0R
UNSPEC_SHA_512_SUM1
UNSPEC_SHA_512_SUM1R
;; Zksh unspecs
UNSPEC_SM3_P0
UNSPEC_SM3_P1
;; Zksed unspecs
UNSPEC_SM4_ED
UNSPEC_SM4_KS
])
;; ZBKB extension
(define_insn "riscv_brev8_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")]
UNSPEC_BREV8))]
"TARGET_ZBKB"
"brev8\t%0,%1"
[(set_attr "type" "crypto")])
(define_insn "riscv_zip"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")]
UNSPEC_ZIP))]
"TARGET_ZBKB && !TARGET_64BIT"
"zip\t%0,%1"
[(set_attr "type" "crypto")])
(define_insn "riscv_unzip"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")]
UNSPEC_UNZIP))]
"TARGET_ZBKB && !TARGET_64BIT"
"unzip\t%0,%1"
[(set_attr "type" "crypto")])
(define_insn "riscv_pack_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:HISI 1 "register_operand" "r")
(match_operand:HISI 2 "register_operand" "r")]
UNSPEC_PACK))]
"TARGET_ZBKB"
"pack\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_packh_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:QI 1 "register_operand" "r")
(match_operand:QI 2 "register_operand" "r")]
UNSPEC_PACKH))]
"TARGET_ZBKB"
"packh\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_packw"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:HI 1 "register_operand" "r")
(match_operand:HI 2 "register_operand" "r")]
UNSPEC_PACKW))]
"TARGET_ZBKB && TARGET_64BIT"
"packw\t%0,%1,%2"
[(set_attr "type" "crypto")])
;; ZBKC extension
(define_insn "riscv_clmul_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")
(match_operand:X 2 "register_operand" "r")]
UNSPEC_CLMUL))]
"TARGET_ZBKC"
"clmul\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_clmulh_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")
(match_operand:X 2 "register_operand" "r")]
UNSPEC_CLMULH))]
"TARGET_ZBKC"
"clmulh\t%0,%1,%2"
[(set_attr "type" "crypto")])
;; ZBKX extension
(define_insn "riscv_xperm4_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")
(match_operand:X 2 "register_operand" "r")]
UNSPEC_XPERM4))]
"TARGET_ZBKX"
"xperm4\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_xperm8_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")
(match_operand:X 2 "register_operand" "r")]
UNSPEC_XPERM8))]
"TARGET_ZBKX"
"xperm8\t%0,%1,%2"
[(set_attr "type" "crypto")])
;; ZKND extension
(define_insn "riscv_aes32dsi"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")
(match_operand:SI 3 "register_operand" "D03")]
UNSPEC_AES_DSI))]
"TARGET_ZKND && !TARGET_64BIT"
"aes32dsi\t%0,%1,%2,%3"
[(set_attr "type" "crypto")])
(define_insn "riscv_aes32dsmi"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")
(match_operand:SI 3 "register_operand" "D03")]
UNSPEC_AES_DSMI))]
"TARGET_ZKND && !TARGET_64BIT"
"aes32dsmi\t%0,%1,%2,%3"
[(set_attr "type" "crypto")])
(define_insn "riscv_aes64ds"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "register_operand" "r")
(match_operand:DI 2 "register_operand" "r")]
UNSPEC_AES_DS))]
"TARGET_ZKND && TARGET_64BIT"
"aes64ds\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_aes64dsm"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "register_operand" "r")
(match_operand:DI 2 "register_operand" "r")]
UNSPEC_AES_DSM))]
"TARGET_ZKND && TARGET_64BIT"
"aes64dsm\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_aes64im"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "register_operand" "r")]
UNSPEC_AES_IM))]
"TARGET_ZKND && TARGET_64BIT"
"aes64im\t%0,%1"
[(set_attr "type" "crypto")])
(define_insn "riscv_aes64ks1i"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "DsA")]
UNSPEC_AES_KS1I))]
"(TARGET_ZKND || TARGET_ZKNE) && TARGET_64BIT"
"aes64ks1i\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_aes64ks2"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "register_operand" "r")
(match_operand:DI 2 "register_operand" "r")]
UNSPEC_AES_KS2))]
"(TARGET_ZKND || TARGET_ZKNE) && TARGET_64BIT"
"aes64ks2\t%0,%1,%2"
[(set_attr "type" "crypto")])
;; ZKNE extension
(define_insn "riscv_aes32esi"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")
(match_operand:SI 3 "register_operand" "D03")]
UNSPEC_AES_ESI))]
"TARGET_ZKNE && !TARGET_64BIT"
"aes32esi\t%0,%1,%2,%3"
[(set_attr "type" "crypto")])
(define_insn "riscv_aes32esmi"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")
(match_operand:SI 3 "register_operand" "D03")]
UNSPEC_AES_ESMI))]
"TARGET_ZKNE && !TARGET_64BIT"
"aes32esmi\t%0,%1,%2,%3"
[(set_attr "type" "crypto")])
(define_insn "riscv_aes64es"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "register_operand" "r")
(match_operand:DI 2 "register_operand" "r")]
UNSPEC_AES_ES))]
"TARGET_ZKNE && TARGET_64BIT"
"aes64es\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_aes64esm"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "register_operand" "r")
(match_operand:DI 2 "register_operand" "r")]
UNSPEC_AES_ESM))]
"TARGET_ZKNE && TARGET_64BIT"
"aes64esm\t%0,%1,%2"
[(set_attr "type" "crypto")])
;; ZKNH - SHA256
(define_insn "riscv_sha256sig0_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")]
UNSPEC_SHA_256_SIG0))]
"TARGET_ZKNH"
"sha256sig0\t%0,%1"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha256sig1_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")]
UNSPEC_SHA_256_SIG1))]
"TARGET_ZKNH"
"sha256sig1\t%0,%1"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha256sum0_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")]
UNSPEC_SHA_256_SUM0))]
"TARGET_ZKNH"
"sha256sum0\t%0,%1"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha256sum1_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")]
UNSPEC_SHA_256_SUM1))]
"TARGET_ZKNH"
"sha256sum1\t%0,%1"
[(set_attr "type" "crypto")])
;; ZKNH - SHA512
(define_insn "riscv_sha512sig0h"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")]
UNSPEC_SHA_512_SIG0H))]
"TARGET_ZKNH && !TARGET_64BIT"
"sha512sig0h\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha512sig0l"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")]
UNSPEC_SHA_512_SIG0L))]
"TARGET_ZKNH && !TARGET_64BIT"
"sha512sig0l\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha512sig1h"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")]
UNSPEC_SHA_512_SIG1H))]
"TARGET_ZKNH && !TARGET_64BIT"
"sha512sig1h\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha512sig1l"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")]
UNSPEC_SHA_512_SIG1L))]
"TARGET_ZKNH && !TARGET_64BIT"
"sha512sig1l\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha512sum0r"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")]
UNSPEC_SHA_512_SUM0R))]
"TARGET_ZKNH && !TARGET_64BIT"
"sha512sum0r\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha512sum1r"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "register_operand" "r")]
UNSPEC_SHA_512_SUM1R))]
"TARGET_ZKNH && !TARGET_64BIT"
"sha512sum1r\t%0,%1,%2"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha512sig0"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "register_operand" "r")]
UNSPEC_SHA_512_SIG0))]
"TARGET_ZKNH && TARGET_64BIT"
"sha512sig0\t%0,%1"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha512sig1"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "register_operand" "r")]
UNSPEC_SHA_512_SIG1))]
"TARGET_ZKNH && TARGET_64BIT"
"sha512sig1\t%0,%1"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha512sum0"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "register_operand" "r")]
UNSPEC_SHA_512_SUM0))]
"TARGET_ZKNH && TARGET_64BIT"
"sha512sum0\t%0,%1"
[(set_attr "type" "crypto")])
(define_insn "riscv_sha512sum1"
[(set (match_operand:DI 0 "register_operand" "=r")
(unspec:DI [(match_operand:DI 1 "register_operand" "r")]
UNSPEC_SHA_512_SUM1))]
"TARGET_ZKNH && TARGET_64BIT"
"sha512sum1\t%0,%1"
[(set_attr "type" "crypto")])
;; ZKSH
(define_insn "riscv_sm3p0_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")]
UNSPEC_SM3_P0))]
"TARGET_ZKSH"
"sm3p0\t%0,%1"
[(set_attr "type" "crypto")])
(define_insn "riscv_sm3p1_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")]
UNSPEC_SM3_P1))]
"TARGET_ZKSH"
"sm3p1\t%0,%1"
[(set_attr "type" "crypto")])
;; ZKSED
(define_insn "riscv_sm4ed_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")
(match_operand:X 2 "register_operand" "r")
(match_operand:SI 3 "register_operand" "D03")]
UNSPEC_SM4_ED))]
"TARGET_ZKSED"
"sm4ed\t%0,%1,%2,%3"
[(set_attr "type" "crypto")])
(define_insn "riscv_sm4ks_"
[(set (match_operand:X 0 "register_operand" "=r")
(unspec:X [(match_operand:X 1 "register_operand" "r")
(match_operand:X 2 "register_operand" "r")
(match_operand:SI 3 "register_operand" "D03")]
UNSPEC_SM4_KS))]
"TARGET_ZKSED"
"sm4ks\t%0,%1,%2,%3"
[(set_attr "type" "crypto")])