|
| 1 | +//===----------- SparcInstrCrypto.td - cryptographic extensions -----------===// |
| 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 contains instruction formats, definitions and patterns needed for |
| 10 | +// cryptographic instructions on SPARC. |
| 11 | +//===----------------------------------------------------------------------===// |
| 12 | + |
| 13 | + |
| 14 | +// Convenience template for 4-operand instructions |
| 15 | +class FourOpImm<string OpcStr, bits<6> op3val, bits<4> op5val, |
| 16 | + RegisterClass RC> |
| 17 | + : F3_4<op3val, op5val, (outs RC:$rd), (ins RC:$rs1, RC:$rs2, simm5Op:$rs3), |
| 18 | + !strconcat(OpcStr, " $rs1, $rs2, $rs3, $rd")>; |
| 19 | + |
| 20 | +let Predicates = [HasCrypto] in { |
| 21 | +def AES_EROUND01 : FourOp<"aes_eround01", 0b011001, 0b0000, DFPRegs>; |
| 22 | +def AES_EROUND23 : FourOp<"aes_eround23", 0b011001, 0b0001, DFPRegs>; |
| 23 | +def AES_DROUND01 : FourOp<"aes_dround01", 0b011001, 0b0010, DFPRegs>; |
| 24 | +def AES_DROUND23 : FourOp<"aes_dround23", 0b011001, 0b0011, DFPRegs>; |
| 25 | +def AES_EROUND01_LAST : FourOp<"aes_eround01_l", 0b011001, 0b0100, DFPRegs>; |
| 26 | +def AES_EROUND23_LAST : FourOp<"aes_eround23_l", 0b011001, 0b0101, DFPRegs>; |
| 27 | +def AES_DROUND01_LAST : FourOp<"aes_dround01_l", 0b011001, 0b0110, DFPRegs>; |
| 28 | +def AES_DROUND23_LAST : FourOp<"aes_dround23_l", 0b011001, 0b0111, DFPRegs>; |
| 29 | +def AES_KEXPAND0 : F3_3<2, 0b110110, 0b100110000, |
| 30 | + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, DFPRegs:$rs2), |
| 31 | + "aes_kexpand0 $rs1, $rs2, $rd", []>; |
| 32 | +def AES_KEXPAND1 : FourOpImm<"aes_kexpand1", 0b011001, 0b1000, DFPRegs>; |
| 33 | +def AES_KEXPAND2 : F3_3<2, 0b110110, 0b100110001, |
| 34 | + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, DFPRegs:$rs2), |
| 35 | + "aes_kexpand2 $rs1, $rs2, $rd", []>; |
| 36 | + |
| 37 | +def CAMELLIA_F : FourOp<"camellia_f", 0b011001, 0b1100, DFPRegs>; |
| 38 | +def CAMELLIA_FL : F3_3<2, 0b110110, 0b100111100, |
| 39 | + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, DFPRegs:$rs2), |
| 40 | + "camellia_fl $rs1, $rs2, $rd", []>; |
| 41 | +def CAMELLIA_FLI : F3_3<2, 0b110110, 0b100111101, |
| 42 | + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, DFPRegs:$rs2), |
| 43 | + "camellia_fli $rs1, $rs2, $rd", []>; |
| 44 | + |
| 45 | +def CRC32C : F3_3<2, 0b110110, 0b101000111, |
| 46 | + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, DFPRegs:$rs2), |
| 47 | + "crc32c $rs1, $rs2, $rd", []>; |
| 48 | + |
| 49 | +def DES_ROUND : FourOp<"des_round", 0b011001, 0b1001, DFPRegs>; |
| 50 | +let rs2 = 0 in { |
| 51 | +def DES_IP : F3_3<2, 0b110110, 0b100110100, |
| 52 | + (outs DFPRegs:$rd), (ins DFPRegs:$rs1), |
| 53 | + "des_ip $rs1, $rd", []>; |
| 54 | +def DES_IIP : F3_3<2, 0b110110, 0b100110101, |
| 55 | + (outs DFPRegs:$rd), (ins DFPRegs:$rs1), |
| 56 | + "des_iip $rs1, $rd", []>; |
| 57 | +} |
| 58 | +def DES_KEXPAND : F3_3<2, 0b110110, 0b100110110, |
| 59 | + (outs DFPRegs:$rd), (ins DFPRegs:$rs1, simm5Op:$rs2), |
| 60 | + "des_kexpand $rs1, $rs2, $rd", []>; |
| 61 | + |
| 62 | +let rs1 = 0, rs2 = 0, rd = 0 in { |
| 63 | +let Uses = [D0, D1, D2, D5, D6, D7, D8, D9, D10, D11], |
| 64 | + Defs = [D0, D1, D2, D3, D4, D5, D6, D7] in |
| 65 | +def MD5 : F3_3<2, 0b110110, 0b101000000, (outs), (ins), "md5", []>; |
| 66 | +let Uses = [D0, D1, D2, D4, D5, D6, D7, D8, D9, D10, D11], |
| 67 | + Defs = [D0, D1, D2] in |
| 68 | +def SHA1 : F3_3<2, 0b110110, 0b101000001, (outs), (ins), "sha1", []>; |
| 69 | +let Uses = [D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11], |
| 70 | + Defs = [D0, D1, D2, D3] in |
| 71 | +def SHA256 : F3_3<2, 0b110110, 0b101000010, (outs), (ins), "sha256", []>; |
| 72 | +let Uses = [D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, |
| 73 | + D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23], |
| 74 | + Defs = [D0, D1, D2, D3, D4, D5, D6, D7] in |
| 75 | +def SHA512 : F3_3<2, 0b110110, 0b101000011, (outs), (ins), "sha512", []>; |
| 76 | +} |
| 77 | + |
| 78 | +// These instructions use and clobber all DFP and non-reserved Int registers. |
| 79 | +let rs1 = 0, rd = 0, |
| 80 | +Uses = [ D0, D1, D2, D3, D4, D5, D6, D7, |
| 81 | + D8, D9, D10, D11, D12, D13, D14, D15, |
| 82 | + D16, D17, D18, D19, D20, D21, D22, D23, |
| 83 | + D24, D25, D26, D27, D28, D29, D30, D31, |
| 84 | + O0, O1, O2, O3, O4, O5, |
| 85 | + L0, L1, L2, L3, L4, L5, L6, L7, |
| 86 | + I0, I1, I2, I3, I4, I5 ], |
| 87 | +Defs = [ D0, D1, D2, D3, D4, D5, D6, D7, |
| 88 | + D8, D9, D10, D11, D12, D13, D14, D15, |
| 89 | + D16, D17, D18, D19, D20, D21, D22, D23, |
| 90 | + D24, D25, D26, D27, D28, D29, D30, D31, |
| 91 | + O0, O1, O2, O3, O4, O5, |
| 92 | + L0, L1, L2, L3, L4, L5, L6, L7, |
| 93 | + I0, I1, I2, I3, I4, I5 ] in { |
| 94 | +def MPMUL : F3_3<2, 0b110110, 0b101001000, (outs), (ins simm5Op:$rs2), "mpmul $rs2", []>; |
| 95 | +def MONTMUL : F3_3<2, 0b110110, 0b101001001, (outs), (ins simm5Op:$rs2), "montmul $rs2", []>; |
| 96 | +def MONTSQR : F3_3<2, 0b110110, 0b101001010, (outs), (ins simm5Op:$rs2), "montsqr $rs2", []>; |
| 97 | +} |
| 98 | +} // Predicates = [HasCrypto] |
0 commit comments