llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-sparc Author: Koakuma (koachan) <details> <summary>Changes</summary> --- Full diff: https://github.com/llvm/llvm-project/pull/139451.diff 5 Files Affected: - (modified) llvm/lib/Target/Sparc/Sparc.td (+5-1) - (added) llvm/lib/Target/Sparc/SparcInstrCrypto.td (+98) - (modified) llvm/lib/Target/Sparc/SparcInstrInfo.td (+5) - (added) llvm/test/MC/Disassembler/Sparc/sparc-crypto.txt (+56) - (added) llvm/test/MC/Sparc/sparc-crypto.s (+88) ``````````diff diff --git a/llvm/lib/Target/Sparc/Sparc.td b/llvm/lib/Target/Sparc/Sparc.td index 6e6c887e60e12..7c26bf9061cb6 100644 --- a/llvm/lib/Target/Sparc/Sparc.td +++ b/llvm/lib/Target/Sparc/Sparc.td @@ -58,6 +58,9 @@ def FeatureUA2007 def FeatureOSA2011 : SubtargetFeature<"osa2011", "IsOSA2011", "true", "Enable Oracle SPARC Architecture 2011 extensions">; +def FeatureCrypto + : SubtargetFeature<"crypto", "IsCrypto", "true", + "Enable cryptographic extensions">; def FeatureLeon : SubtargetFeature<"leon", "IsLeon", "true", "Enable LEON extensions">; @@ -169,7 +172,8 @@ def : Proc<"niagara3", [FeatureV9, FeatureV8Deprecated, UsePopc, FeatureUA2005, FeatureUA2007]>; def : Proc<"niagara4", [FeatureV9, FeatureV8Deprecated, UsePopc, FeatureVIS, FeatureVIS2, FeatureVIS3, - FeatureUA2005, FeatureUA2007, FeatureOSA2011]>; + FeatureUA2005, FeatureUA2007, FeatureOSA2011, + FeatureCrypto]>; // LEON 2 FT generic def : Processor<"leon2", LEON2Itineraries, diff --git a/llvm/lib/Target/Sparc/SparcInstrCrypto.td b/llvm/lib/Target/Sparc/SparcInstrCrypto.td new file mode 100644 index 0000000000000..0e7063f99eb06 --- /dev/null +++ b/llvm/lib/Target/Sparc/SparcInstrCrypto.td @@ -0,0 +1,98 @@ +//===----------- SparcInstrCrypto.td - cryptographic extensions -----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file contains instruction formats, definitions and patterns needed for +// cryptographic instructions on SPARC. +//===----------------------------------------------------------------------===// + + +// Convenience template for 4-operand instructions +class FourOpImm<string OpcStr, bits<6> op3val, bits<4> op5val, + RegisterClass RC> + : F3_4<op3val, op5val, (outs RC:$rd), (ins RC:$rs1, RC:$rs2, simm5Op:$rs3), + !strconcat(OpcStr, " $rs1, $rs2, $rs3, $rd")>; + +let Predicates = [HasCrypto] in { +def AES_EROUND01 : FourOp<"aes_eround01", 0b011001, 0b0000, DFPRegs>; +def AES_EROUND23 : FourOp<"aes_eround23", 0b011001, 0b0001, DFPRegs>; +def AES_DROUND01 : FourOp<"aes_dround01", 0b011001, 0b0010, DFPRegs>; +def AES_DROUND23 : FourOp<"aes_dround23", 0b011001, 0b0011, DFPRegs>; +def AES_EROUND01_LAST : FourOp<"aes_eround01_l", 0b011001, 0b0100, DFPRegs>; +def AES_EROUND23_LAST : FourOp<"aes_eround23_l", 0b011001, 0b0101, DFPRegs>; +def AES_DROUND01_LAST : FourOp<"aes_dround01_l", 0b011001, 0b0110, DFPRegs>; +def AES_DROUND23_LAST : FourOp<"aes_dround23_l", 0b011001, 0b0111, DFPRegs>; +def AES_KEXPAND0 : F3_3<2, 0b110110, 0b100110000, + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, DFPRegs:$rs2), + "aes_kexpand0 $rs1, $rs2, $rd", []>; +def AES_KEXPAND1 : FourOpImm<"aes_kexpand1", 0b011001, 0b1000, DFPRegs>; +def AES_KEXPAND2 : F3_3<2, 0b110110, 0b100110001, + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, DFPRegs:$rs2), + "aes_kexpand2 $rs1, $rs2, $rd", []>; + +def CAMELLIA_F : FourOp<"camellia_f", 0b011001, 0b1100, DFPRegs>; +def CAMELLIA_FL : F3_3<2, 0b110110, 0b100111100, + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, DFPRegs:$rs2), + "camellia_fl $rs1, $rs2, $rd", []>; +def CAMELLIA_FLI : F3_3<2, 0b110110, 0b100111101, + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, DFPRegs:$rs2), + "camellia_fli $rs1, $rs2, $rd", []>; + +def CRC32C : F3_3<2, 0b110110, 0b101000111, + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, DFPRegs:$rs2), + "crc32c $rs1, $rs2, $rd", []>; + +def DES_ROUND : FourOp<"des_round", 0b011001, 0b1001, DFPRegs>; +let rs2 = 0 in { +def DES_IP : F3_3<2, 0b110110, 0b100110100, + (outs DFPRegs:$rd), (ins DFPRegs:$rs1), + "des_ip $rs1, $rd", []>; +def DES_IIP : F3_3<2, 0b110110, 0b100110101, + (outs DFPRegs:$rd), (ins DFPRegs:$rs1), + "des_iip $rs1, $rd", []>; +} +def DES_KEXPAND : F3_3<2, 0b110110, 0b100110110, + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, simm5Op:$rs2), + "des_kexpand $rs1, $rs2, $rd", []>; + +let rs1 = 0, rs2 = 0, rd = 0 in { +let Uses = [D0, D1, D2, D5, D6, D7, D8, D9, D10, D11], + Defs = [D0, D1, D2, D3, D4, D5, D6, D7] in +def MD5 : F3_3<2, 0b110110, 0b101000000, (outs), (ins), "md5", []>; +let Uses = [D0, D1, D2, D4, D5, D6, D7, D8, D9, D10, D11], + Defs = [D0, D1, D2] in +def SHA1 : F3_3<2, 0b110110, 0b101000001, (outs), (ins), "sha1", []>; +let Uses = [D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11], + Defs = [D0, D1, D2, D3] in +def SHA256 : F3_3<2, 0b110110, 0b101000010, (outs), (ins), "sha256", []>; +let Uses = [D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, + D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23], + Defs = [D0, D1, D2, D3, D4, D5, D6, D7] in +def SHA512 : F3_3<2, 0b110110, 0b101000011, (outs), (ins), "sha512", []>; +} + +// These instructions use and clobber all DFP and non-reserved Int registers. +let rs1 = 0, rd = 0, +Uses = [ D0, D1, D2, D3, D4, D5, D6, D7, + D8, D9, D10, D11, D12, D13, D14, D15, + D16, D17, D18, D19, D20, D21, D22, D23, + D24, D25, D26, D27, D28, D29, D30, D31, + O0, O1, O2, O3, O4, O5, + L0, L1, L2, L3, L4, L5, L6, L7, + I0, I1, I2, I3, I4, I5 ], +Defs = [ D0, D1, D2, D3, D4, D5, D6, D7, + D8, D9, D10, D11, D12, D13, D14, D15, + D16, D17, D18, D19, D20, D21, D22, D23, + D24, D25, D26, D27, D28, D29, D30, D31, + O0, O1, O2, O3, O4, O5, + L0, L1, L2, L3, L4, L5, L6, L7, + I0, I1, I2, I3, I4, I5 ] in { +def MPMUL : F3_3<2, 0b110110, 0b101001000, (outs), (ins simm5Op:$rs2), "mpmul $rs2", []>; +def MONTMUL : F3_3<2, 0b110110, 0b101001001, (outs), (ins simm5Op:$rs2), "montmul $rs2", []>; +def MONTSQR : F3_3<2, 0b110110, 0b101001010, (outs), (ins simm5Op:$rs2), "montsqr $rs2", []>; +} +} // Predicates = [HasCrypto] diff --git a/llvm/lib/Target/Sparc/SparcInstrInfo.td b/llvm/lib/Target/Sparc/SparcInstrInfo.td index c14d72b33c08c..b0c09eefc97fb 100644 --- a/llvm/lib/Target/Sparc/SparcInstrInfo.td +++ b/llvm/lib/Target/Sparc/SparcInstrInfo.td @@ -59,6 +59,10 @@ def HasUA2007 : Predicate<"Subtarget->isUA2007()">, def HasOSA2011 : Predicate<"Subtarget->isOSA2011()">, AssemblerPredicate<(all_of FeatureOSA2011)>; +// HasCrypto - This is true when the target processor has cryptographic extensions. +def HasCrypto : Predicate<"Subtarget->isCrypto()">, + AssemblerPredicate<(all_of FeatureCrypto)>; + // HasHardQuad - This is true when the target processor supports quad floating // point instructions. def HasHardQuad : Predicate<"Subtarget->hasHardQuad()">; @@ -1993,4 +1997,5 @@ def : Pat<(build_vector (i32 IntRegs:$a1), (i32 IntRegs:$a2)), include "SparcInstr64Bit.td" include "SparcInstrVIS.td" include "SparcInstrUAOSA.td" +include "SparcInstrCrypto.td" include "SparcInstrAliases.td" diff --git a/llvm/test/MC/Disassembler/Sparc/sparc-crypto.txt b/llvm/test/MC/Disassembler/Sparc/sparc-crypto.txt new file mode 100644 index 0000000000000..ceae8b4ce695c --- /dev/null +++ b/llvm/test/MC/Disassembler/Sparc/sparc-crypto.txt @@ -0,0 +1,56 @@ +# RUN: llvm-mc --disassemble %s -triple=sparcv9-unknown-linux -mattr=+crypto | FileCheck %s + +## Crypto instructions. + +# CHECK: aes_eround01 %f0, %f2, %f4, %f6 +0x8c,0xc8,0x08,0x02 +# CHECK: aes_eround23 %f0, %f2, %f4, %f6 +0x8c,0xc8,0x08,0x22 +# CHECK: aes_dround01 %f0, %f2, %f4, %f6 +0x8c,0xc8,0x08,0x42 +# CHECK: aes_dround23 %f0, %f2, %f4, %f6 +0x8c,0xc8,0x08,0x62 +# CHECK: aes_eround01_l %f0, %f2, %f4, %f6 +0x8c,0xc8,0x08,0x82 +# CHECK: aes_eround23_l %f0, %f2, %f4, %f6 +0x8c,0xc8,0x08,0xa2 +# CHECK: aes_dround01_l %f0, %f2, %f4, %f6 +0x8c,0xc8,0x08,0xc2 +# CHECK: aes_dround23_l %f0, %f2, %f4, %f6 +0x8c,0xc8,0x08,0xe2 +# CHECK: aes_kexpand0 %f0, %f2, %f4 +0x89,0xb0,0x26,0x02 +# CHECK: aes_kexpand1 %f0, %f2, 4, %f6 +0x8c,0xc8,0x09,0x02 +# CHECK: aes_kexpand2 %f0, %f2, %f4 +0x89,0xb0,0x26,0x22 +# CHECK: camellia_f %f0, %f2, %f4, %f6 +0x8c,0xc8,0x09,0x82 +# CHECK: camellia_fl %f0, %f2, %f4 +0x89,0xb0,0x27,0x82 +# CHECK: camellia_fli %f0, %f2, %f4 +0x89,0xb0,0x27,0xa2 +# CHECK: crc32c %f0, %f2, %f4 +0x89,0xb0,0x28,0xe2 +# CHECK: des_round %f0, %f2, %f4, %f6 +0x8c,0xc8,0x09,0x22 +# CHECK: des_ip %f0, %f2 +0x85,0xb0,0x26,0x80 +# CHECK: des_iip %f0, %f2 +0x85,0xb0,0x26,0xa0 +# CHECK: des_kexpand %f0, 2, %f4 +0x89,0xb0,0x26,0xc2 +# CHECK: md5 +0x81,0xb0,0x28,0x00 +# CHECK: sha1 +0x81,0xb0,0x28,0x20 +# CHECK: sha256 +0x81,0xb0,0x28,0x40 +# CHECK: sha512 +0x81,0xb0,0x28,0x60 +# CHECK: mpmul 1 +0x81,0xb0,0x29,0x01 +# CHECK: montmul 2 +0x81,0xb0,0x29,0x22 +# CHECK: montsqr 3 +0x81,0xb0,0x29,0x43 diff --git a/llvm/test/MC/Sparc/sparc-crypto.s b/llvm/test/MC/Sparc/sparc-crypto.s new file mode 100644 index 0000000000000..1c6071178eaae --- /dev/null +++ b/llvm/test/MC/Sparc/sparc-crypto.s @@ -0,0 +1,88 @@ +! RUN: not llvm-mc %s -triple=sparcv9 -show-encoding 2>&1 | FileCheck %s --check-prefixes=NO-CRYPTO --implicit-check-not=error: +! RUN: llvm-mc %s -triple=sparcv9 -mattr=+crypto -show-encoding | FileCheck %s --check-prefixes=CRYPTO + +!! Crypto instructions. + +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: aes_eround01 %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0x02] +aes_eround01 %f0, %f2, %f4, %f6 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: aes_eround23 %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0x22] +aes_eround23 %f0, %f2, %f4, %f6 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: aes_dround01 %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0x42] +aes_dround01 %f0, %f2, %f4, %f6 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: aes_dround23 %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0x62] +aes_dround23 %f0, %f2, %f4, %f6 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: aes_eround01_l %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0x82] +aes_eround01_l %f0, %f2, %f4, %f6 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: aes_eround23_l %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0xa2] +aes_eround23_l %f0, %f2, %f4, %f6 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: aes_dround01_l %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0xc2] +aes_dround01_l %f0, %f2, %f4, %f6 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: aes_dround23_l %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0xe2] +aes_dround23_l %f0, %f2, %f4, %f6 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: aes_kexpand0 %f0, %f2, %f4 ! encoding: [0x89,0xb0,0x26,0x02] +aes_kexpand0 %f0, %f2, %f4 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: aes_kexpand1 %f0, %f2, 4, %f6 ! encoding: [0x8c,0xc8,0x09,0x02] +aes_kexpand1 %f0, %f2, 4, %f6 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: aes_kexpand2 %f0, %f2, %f4 ! encoding: [0x89,0xb0,0x26,0x22] +aes_kexpand2 %f0, %f2, %f4 + +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: camellia_f %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x09,0x82] +camellia_f %f0, %f2, %f4, %f6 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: camellia_fl %f0, %f2, %f4 ! encoding: [0x89,0xb0,0x27,0x82] +camellia_fl %f0, %f2, %f4 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: camellia_fli %f0, %f2, %f4 ! encoding: [0x89,0xb0,0x27,0xa2] +camellia_fli %f0, %f2, %f4 + +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: crc32c %f0, %f2, %f4 ! encoding: [0x89,0xb0,0x28,0xe2] +crc32c %f0, %f2, %f4 + +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: des_round %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x09,0x22] +des_round %f0, %f2, %f4, %f6 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: des_ip %f0, %f2 ! encoding: [0x85,0xb0,0x26,0x80] +des_ip %f0, %f2 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: des_iip %f0, %f2 ! encoding: [0x85,0xb0,0x26,0xa0] +des_iip %f0, %f2 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: des_kexpand %f0, 2, %f4 ! encoding: [0x89,0xb0,0x26,0xc2] +des_kexpand %f0, 2, %f4 + +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: md5 ! encoding: [0x81,0xb0,0x28,0x00] +md5 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: sha1 ! encoding: [0x81,0xb0,0x28,0x20] +sha1 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: sha256 ! encoding: [0x81,0xb0,0x28,0x40] +sha256 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: sha512 ! encoding: [0x81,0xb0,0x28,0x60] +sha512 + +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: mpmul 1 ! encoding: [0x81,0xb0,0x29,0x01] +mpmul 1 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: montmul 2 ! encoding: [0x81,0xb0,0x29,0x22] +montmul 2 +! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled +! CRYPTO: montsqr 3 ! encoding: [0x81,0xb0,0x29,0x43] +montsqr 3 `````````` </details> https://github.com/llvm/llvm-project/pull/139451 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits