Skip to content

Commit d86c63d

Browse files
authored
[SPARC][IAS] Add definitions for cryptographic instructions
Reviewers: brad0, rorth, s-barannikov Reviewed By: s-barannikov Pull Request: #139451
1 parent 58c0bd1 commit d86c63d

File tree

5 files changed

+253
-1
lines changed

5 files changed

+253
-1
lines changed

llvm/lib/Target/Sparc/Sparc.td

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ def FeatureOSA2011
6464
: SubtargetFeature<"osa2011", "IsOSA2011", "true",
6565
"Enable Oracle SPARC Architecture 2011 extensions",
6666
[FeatureV9, FeatureVIS, FeatureVIS2, FeatureVIS3]>;
67+
def FeatureCrypto
68+
: SubtargetFeature<"crypto", "IsCrypto", "true",
69+
"Enable cryptographic extensions",
70+
[FeatureOSA2011]>;
6771
def FeatureLeon
6872
: SubtargetFeature<"leon", "IsLeon", "true",
6973
"Enable LEON extensions">;
@@ -175,7 +179,8 @@ def : Proc<"niagara3", [FeatureV9, FeatureV8Deprecated, UsePopc,
175179
FeatureUA2005, FeatureUA2007]>;
176180
def : Proc<"niagara4", [FeatureV9, FeatureV8Deprecated, UsePopc,
177181
FeatureVIS, FeatureVIS2, FeatureVIS3,
178-
FeatureUA2005, FeatureUA2007, FeatureOSA2011]>;
182+
FeatureUA2005, FeatureUA2007, FeatureOSA2011,
183+
FeatureCrypto]>;
179184

180185
// LEON 2 FT generic
181186
def : Processor<"leon2", LEON2Itineraries,
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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]

llvm/lib/Target/Sparc/SparcInstrInfo.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ def HasUA2007 : Predicate<"Subtarget->isUA2007()">,
6060
def HasOSA2011 : Predicate<"Subtarget->isOSA2011()">,
6161
AssemblerPredicate<(all_of FeatureOSA2011)>;
6262

63+
// HasCrypto - This is true when the target processor has cryptographic extensions.
64+
def HasCrypto : Predicate<"Subtarget->isCrypto()">,
65+
AssemblerPredicate<(all_of FeatureCrypto)>;
66+
6367
// HasHardQuad - This is true when the target processor supports quad floating
6468
// point instructions.
6569
def HasHardQuad : Predicate<"Subtarget->hasHardQuad()">;
@@ -2011,4 +2015,5 @@ def : Pat<(build_vector (i32 IntRegs:$a1), (i32 IntRegs:$a2)),
20112015
include "SparcInstr64Bit.td"
20122016
include "SparcInstrVIS.td"
20132017
include "SparcInstrUAOSA.td"
2018+
include "SparcInstrCrypto.td"
20142019
include "SparcInstrAliases.td"
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# RUN: llvm-mc --disassemble %s -triple=sparcv9-unknown-linux -mattr=+crypto | FileCheck %s
2+
3+
## Crypto instructions.
4+
5+
# CHECK: aes_eround01 %f0, %f2, %f4, %f6
6+
0x8c,0xc8,0x08,0x02
7+
# CHECK: aes_eround23 %f0, %f2, %f4, %f6
8+
0x8c,0xc8,0x08,0x22
9+
# CHECK: aes_dround01 %f0, %f2, %f4, %f6
10+
0x8c,0xc8,0x08,0x42
11+
# CHECK: aes_dround23 %f0, %f2, %f4, %f6
12+
0x8c,0xc8,0x08,0x62
13+
# CHECK: aes_eround01_l %f0, %f2, %f4, %f6
14+
0x8c,0xc8,0x08,0x82
15+
# CHECK: aes_eround23_l %f0, %f2, %f4, %f6
16+
0x8c,0xc8,0x08,0xa2
17+
# CHECK: aes_dround01_l %f0, %f2, %f4, %f6
18+
0x8c,0xc8,0x08,0xc2
19+
# CHECK: aes_dround23_l %f0, %f2, %f4, %f6
20+
0x8c,0xc8,0x08,0xe2
21+
# CHECK: aes_kexpand0 %f0, %f2, %f4
22+
0x89,0xb0,0x26,0x02
23+
# CHECK: aes_kexpand1 %f0, %f2, 4, %f6
24+
0x8c,0xc8,0x09,0x02
25+
# CHECK: aes_kexpand2 %f0, %f2, %f4
26+
0x89,0xb0,0x26,0x22
27+
# CHECK: camellia_f %f0, %f2, %f4, %f6
28+
0x8c,0xc8,0x09,0x82
29+
# CHECK: camellia_fl %f0, %f2, %f4
30+
0x89,0xb0,0x27,0x82
31+
# CHECK: camellia_fli %f0, %f2, %f4
32+
0x89,0xb0,0x27,0xa2
33+
# CHECK: crc32c %f0, %f2, %f4
34+
0x89,0xb0,0x28,0xe2
35+
# CHECK: des_round %f0, %f2, %f4, %f6
36+
0x8c,0xc8,0x09,0x22
37+
# CHECK: des_ip %f0, %f2
38+
0x85,0xb0,0x26,0x80
39+
# CHECK: des_iip %f0, %f2
40+
0x85,0xb0,0x26,0xa0
41+
# CHECK: des_kexpand %f0, 2, %f4
42+
0x89,0xb0,0x26,0xc2
43+
# CHECK: md5
44+
0x81,0xb0,0x28,0x00
45+
# CHECK: sha1
46+
0x81,0xb0,0x28,0x20
47+
# CHECK: sha256
48+
0x81,0xb0,0x28,0x40
49+
# CHECK: sha512
50+
0x81,0xb0,0x28,0x60
51+
# CHECK: mpmul 1
52+
0x81,0xb0,0x29,0x01
53+
# CHECK: montmul 2
54+
0x81,0xb0,0x29,0x22
55+
# CHECK: montsqr 3
56+
0x81,0xb0,0x29,0x43

llvm/test/MC/Sparc/sparc-crypto.s

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
! RUN: not llvm-mc %s -triple=sparcv9 -show-encoding 2>&1 | FileCheck %s --check-prefixes=NO-CRYPTO --implicit-check-not=error:
2+
! RUN: llvm-mc %s -triple=sparcv9 -mattr=+crypto -show-encoding | FileCheck %s --check-prefixes=CRYPTO
3+
4+
!! Crypto instructions.
5+
6+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
7+
! CRYPTO: aes_eround01 %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0x02]
8+
aes_eround01 %f0, %f2, %f4, %f6
9+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
10+
! CRYPTO: aes_eround23 %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0x22]
11+
aes_eround23 %f0, %f2, %f4, %f6
12+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
13+
! CRYPTO: aes_dround01 %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0x42]
14+
aes_dround01 %f0, %f2, %f4, %f6
15+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
16+
! CRYPTO: aes_dround23 %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0x62]
17+
aes_dround23 %f0, %f2, %f4, %f6
18+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
19+
! CRYPTO: aes_eround01_l %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0x82]
20+
aes_eround01_l %f0, %f2, %f4, %f6
21+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
22+
! CRYPTO: aes_eround23_l %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0xa2]
23+
aes_eround23_l %f0, %f2, %f4, %f6
24+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
25+
! CRYPTO: aes_dround01_l %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0xc2]
26+
aes_dround01_l %f0, %f2, %f4, %f6
27+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
28+
! CRYPTO: aes_dround23_l %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x08,0xe2]
29+
aes_dround23_l %f0, %f2, %f4, %f6
30+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
31+
! CRYPTO: aes_kexpand0 %f0, %f2, %f4 ! encoding: [0x89,0xb0,0x26,0x02]
32+
aes_kexpand0 %f0, %f2, %f4
33+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
34+
! CRYPTO: aes_kexpand1 %f0, %f2, 4, %f6 ! encoding: [0x8c,0xc8,0x09,0x02]
35+
aes_kexpand1 %f0, %f2, 4, %f6
36+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
37+
! CRYPTO: aes_kexpand2 %f0, %f2, %f4 ! encoding: [0x89,0xb0,0x26,0x22]
38+
aes_kexpand2 %f0, %f2, %f4
39+
40+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
41+
! CRYPTO: camellia_f %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x09,0x82]
42+
camellia_f %f0, %f2, %f4, %f6
43+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
44+
! CRYPTO: camellia_fl %f0, %f2, %f4 ! encoding: [0x89,0xb0,0x27,0x82]
45+
camellia_fl %f0, %f2, %f4
46+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
47+
! CRYPTO: camellia_fli %f0, %f2, %f4 ! encoding: [0x89,0xb0,0x27,0xa2]
48+
camellia_fli %f0, %f2, %f4
49+
50+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
51+
! CRYPTO: crc32c %f0, %f2, %f4 ! encoding: [0x89,0xb0,0x28,0xe2]
52+
crc32c %f0, %f2, %f4
53+
54+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
55+
! CRYPTO: des_round %f0, %f2, %f4, %f6 ! encoding: [0x8c,0xc8,0x09,0x22]
56+
des_round %f0, %f2, %f4, %f6
57+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
58+
! CRYPTO: des_ip %f0, %f2 ! encoding: [0x85,0xb0,0x26,0x80]
59+
des_ip %f0, %f2
60+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
61+
! CRYPTO: des_iip %f0, %f2 ! encoding: [0x85,0xb0,0x26,0xa0]
62+
des_iip %f0, %f2
63+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
64+
! CRYPTO: des_kexpand %f0, 2, %f4 ! encoding: [0x89,0xb0,0x26,0xc2]
65+
des_kexpand %f0, 2, %f4
66+
67+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
68+
! CRYPTO: md5 ! encoding: [0x81,0xb0,0x28,0x00]
69+
md5
70+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
71+
! CRYPTO: sha1 ! encoding: [0x81,0xb0,0x28,0x20]
72+
sha1
73+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
74+
! CRYPTO: sha256 ! encoding: [0x81,0xb0,0x28,0x40]
75+
sha256
76+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
77+
! CRYPTO: sha512 ! encoding: [0x81,0xb0,0x28,0x60]
78+
sha512
79+
80+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
81+
! CRYPTO: mpmul 1 ! encoding: [0x81,0xb0,0x29,0x01]
82+
mpmul 1
83+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
84+
! CRYPTO: montmul 2 ! encoding: [0x81,0xb0,0x29,0x22]
85+
montmul 2
86+
! NO-CRYPTO: error: instruction requires a CPU feature not currently enabled
87+
! CRYPTO: montsqr 3 ! encoding: [0x81,0xb0,0x29,0x43]
88+
montsqr 3

0 commit comments

Comments
 (0)