1//==- BuiltinsRISCV.td - RISC-V Builtin function database ---*- tablegen -*-==// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file defines the RISC-V-specific builtin function database. 10// 11//===----------------------------------------------------------------------===// 12 13include "clang/Basic/BuiltinsBase.td" 14 15class RISCVBuiltin<string prototype, string features = ""> : TargetBuiltin { 16 let Spellings = ["__builtin_riscv_" # NAME]; 17 let Prototype = prototype; 18 let Features = features; 19} 20 21let Attributes = [NoThrow, Const] in { 22//===----------------------------------------------------------------------===// 23// Zbb extension. 24//===----------------------------------------------------------------------===// 25def orc_b_32 : RISCVBuiltin<"unsigned int(unsigned int)", "zbb">; 26def orc_b_64 : RISCVBuiltin<"uint64_t(uint64_t)", "zbb,64bit">; 27def clz_32 : RISCVBuiltin<"unsigned int(unsigned int)", "zbb|xtheadbb">; 28def clz_64 : RISCVBuiltin<"unsigned int(uint64_t)", "zbb|xtheadbb,64bit">; 29def ctz_32 : RISCVBuiltin<"unsigned int(unsigned int)", "zbb">; 30def ctz_64 : RISCVBuiltin<"unsigned int(uint64_t)", "zbb,64bit">; 31 32//===----------------------------------------------------------------------===// 33// Zbc or Zbkc extension. 34//===----------------------------------------------------------------------===// 35def clmul_32 : RISCVBuiltin<"unsigned int(unsigned int, unsigned int)", "zbc|zbkc">; 36def clmul_64 : RISCVBuiltin<"uint64_t(uint64_t, uint64_t)", "zbc|zbkc,64bit">; 37def clmulh_32 : RISCVBuiltin<"unsigned int(unsigned int, unsigned int)", "zbc|zbkc,32bit">; 38def clmulh_64 : RISCVBuiltin<"uint64_t(uint64_t, uint64_t)", "zbc|zbkc,64bit">; 39def clmulr_32 : RISCVBuiltin<"unsigned int(unsigned int, unsigned int)", "zbc,32bit">; 40def clmulr_64 : RISCVBuiltin<"uint64_t(uint64_t, uint64_t)", "zbc,64bit">; 41 42//===----------------------------------------------------------------------===// 43// Zbkx extension. 44//===----------------------------------------------------------------------===// 45let Features = "zbkx,32bit" in { 46def xperm4_32 : RISCVBuiltin<"unsigned int(unsigned int, unsigned int)">; 47def xperm8_32 : RISCVBuiltin<"unsigned int(unsigned int, unsigned int)">; 48} // Features = "zbkx,32bit" 49 50let Features = "zbkx,64bit" in { 51def xperm4_64 : RISCVBuiltin<"uint64_t(uint64_t, uint64_t)">; 52def xperm8_64 : RISCVBuiltin<"uint64_t(uint64_t, uint64_t)">; 53} // Features = "zbkx,64bit" 54 55//===----------------------------------------------------------------------===// 56// Zbkb extension. 57//===----------------------------------------------------------------------===// 58def brev8_32 : RISCVBuiltin<"unsigned int(unsigned int)", "zbkb">; 59def brev8_64 : RISCVBuiltin<"uint64_t(uint64_t)", "zbkb,64bit">; 60def zip_32 : RISCVBuiltin<"unsigned int(unsigned int)", "zbkb,32bit">; 61def unzip_32 : RISCVBuiltin<"unsigned int(unsigned int)", "zbkb,32bit">; 62 63//===----------------------------------------------------------------------===// 64// Zknd extension. 65//===----------------------------------------------------------------------===// 66let Features = "zknd,32bit" in { 67def aes32dsi : RISCVBuiltin<"unsigned int(unsigned int, unsigned int, _Constant unsigned int)">; 68def aes32dsmi : RISCVBuiltin<"unsigned int(unsigned int, unsigned int, _Constant unsigned int)">; 69} // Features = "zknd,32bit" 70 71let Features = "zknd,64bit" in { 72def aes64ds : RISCVBuiltin<"uint64_t(uint64_t, uint64_t)">; 73def aes64dsm : RISCVBuiltin<"uint64_t(uint64_t, uint64_t)">; 74def aes64im : RISCVBuiltin<"uint64_t(uint64_t)">; 75} // Features = "zknd,64bit" 76 77//===----------------------------------------------------------------------===// 78// Zknd & Zkne extension. 79//===----------------------------------------------------------------------===// 80let Features = "zknd|zkne,64bit" in { 81def aes64ks1i : RISCVBuiltin<"uint64_t(uint64_t, _Constant unsigned int)">; 82def aes64ks2 : RISCVBuiltin<"uint64_t(uint64_t, uint64_t)">; 83} // Features = "zknd|zkne,64bit" 84 85//===----------------------------------------------------------------------===// 86// Zkne extension. 87//===----------------------------------------------------------------------===// 88let Features = "zkne,32bit" in { 89def aes32esi : RISCVBuiltin<"unsigned int(unsigned int, unsigned int, _Constant unsigned int)">; 90def aes32esmi : RISCVBuiltin<"unsigned int(unsigned int, unsigned int, _Constant unsigned int)">; 91} // Features = "zkne,32bit" 92 93let Features = "zkne,64bit" in { 94def aes64es : RISCVBuiltin<"uint64_t(uint64_t, uint64_t)">; 95def aes64esm : RISCVBuiltin<"uint64_t(uint64_t, uint64_t)">; 96} // Features = "zkne,64bit" 97 98//===----------------------------------------------------------------------===// 99// Zknh extension. 100//===----------------------------------------------------------------------===// 101let Features = "zknh" in { 102def sha256sig0 : RISCVBuiltin<"unsigned int(unsigned int)">; 103def sha256sig1 : RISCVBuiltin<"unsigned int(unsigned int)">; 104def sha256sum0 : RISCVBuiltin<"unsigned int(unsigned int)">; 105def sha256sum1 : RISCVBuiltin<"unsigned int(unsigned int)">; 106} // Features = "zknh" 107 108let Features = "zknh,32bit" in { 109def sha512sig0h : RISCVBuiltin<"unsigned int(unsigned int, unsigned int)">; 110def sha512sig0l : RISCVBuiltin<"unsigned int(unsigned int, unsigned int)">; 111def sha512sig1h : RISCVBuiltin<"unsigned int(unsigned int, unsigned int)">; 112def sha512sig1l : RISCVBuiltin<"unsigned int(unsigned int, unsigned int)">; 113def sha512sum0r : RISCVBuiltin<"unsigned int(unsigned int, unsigned int)">; 114def sha512sum1r : RISCVBuiltin<"unsigned int(unsigned int, unsigned int)">; 115} // Features = "zknh,32bit" 116 117let Features = "zknh,64bit" in { 118def sha512sig0 : RISCVBuiltin<"uint64_t(uint64_t)">; 119def sha512sig1 : RISCVBuiltin<"uint64_t(uint64_t)">; 120def sha512sum0 : RISCVBuiltin<"uint64_t(uint64_t)">; 121def sha512sum1 : RISCVBuiltin<"uint64_t(uint64_t)">; 122} // Features = "zknh,64bit" 123 124//===----------------------------------------------------------------------===// 125// Zksed extension. 126//===----------------------------------------------------------------------===// 127let Features = "zksed" in { 128def sm4ed : RISCVBuiltin<"unsigned int(unsigned int, unsigned int, _Constant unsigned int )">; 129def sm4ks : RISCVBuiltin<"unsigned int(unsigned int, unsigned int, _Constant unsigned int)">; 130} // Features = "zksed" 131 132//===----------------------------------------------------------------------===// 133// Zksh extension. 134//===----------------------------------------------------------------------===// 135let Features = "zksh" in { 136def sm3p0 : RISCVBuiltin<"unsigned int(unsigned int)">; 137def sm3p1 : RISCVBuiltin<"unsigned int(unsigned int)">; 138} // Features = "zksh" 139 140} // Attributes = [Const, NoThrow] 141 142//===----------------------------------------------------------------------===// 143// Zihintntl extension. 144//===----------------------------------------------------------------------===// 145let Features = "zihintntl", Attributes = [CustomTypeChecking] in { 146def ntl_load : RISCVBuiltin<"void(...)">; 147def ntl_store : RISCVBuiltin<"void(...)">; 148} // Features = "zihintntl", Attributes = [CustomTypeChecking] 149