Skip to content

Commit bc45acb

Browse files
koachanbrad0
authored andcommitted
[SPARC][IAS] Add named V9 ASI tag constants for memory instructions
This adds named ASI tag constants (such as #ASI_P and #ASI_P_L) for memory accesses. This patch adds 64-bit/V9 tag names, given that currently the majority of SPARC software targets that arch. Support for 32-bit/V8 tag names will be added in a future patch. Reviewed By: barannikov88 Differential Revision: https://reviews.llvm.org/D157235
1 parent 8037deb commit bc45acb

15 files changed

+398
-125
lines changed

llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,17 +1113,33 @@ OperandMatchResultTy SparcAsmParser::parseASITag(OperandVector &Operands) {
11131113
SMLoc E = Parser.getTok().getEndLoc();
11141114
int64_t ASIVal = 0;
11151115

1116-
if (getParser().parseAbsoluteExpression(ASIVal)) {
1117-
Error(
1118-
S,
1119-
is64Bit()
1120-
? "malformed ASI tag, must be %asi or a constant integer expression"
1121-
: "malformed ASI tag, must be a constant integer expression");
1122-
return MatchOperand_ParseFail;
1123-
}
1116+
if (is64Bit() && (getLexer().getKind() == AsmToken::Hash)) {
1117+
// For now we only support named tags for 64-bit/V9 systems.
1118+
// TODO: add support for 32-bit/V8 systems.
1119+
SMLoc TagStart = getLexer().peekTok(false).getLoc();
1120+
Parser.Lex(); // Eat the '#'.
1121+
auto ASIName = Parser.getTok().getString();
1122+
auto ASITag = SparcASITag::lookupASITagByName(ASIName);
1123+
if (!ASITag)
1124+
ASITag = SparcASITag::lookupASITagByAltName(ASIName);
1125+
Parser.Lex(); // Eat the identifier token.
11241126

1125-
if (!isUInt<8>(ASIVal)) {
1126-
Error(S, "invalid ASI number, must be between 0 and 255");
1127+
if (!ASITag) {
1128+
Error(TagStart, "unknown ASI tag");
1129+
return MatchOperand_ParseFail;
1130+
}
1131+
1132+
ASIVal = ASITag->Encoding;
1133+
} else if (!getParser().parseAbsoluteExpression(ASIVal)) {
1134+
if (!isUInt<8>(ASIVal)) {
1135+
Error(S, "invalid ASI number, must be between 0 and 255");
1136+
return MatchOperand_ParseFail;
1137+
}
1138+
} else {
1139+
Error(S, is64Bit()
1140+
? "malformed ASI tag, must be %asi, a constant integer "
1141+
"expression, or a named tag"
1142+
: "malformed ASI tag, must be a constant integer expression");
11271143
return MatchOperand_ParseFail;
11281144
}
11291145

@@ -1239,8 +1255,8 @@ SparcAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
12391255
return MatchOperand_Success;
12401256
}
12411257

1242-
Error(S,
1243-
"malformed ASI tag, must be %asi or a constant integer expression");
1258+
Error(S, "malformed ASI tag, must be %asi, a constant integer "
1259+
"expression, or a named tag");
12441260
return MatchOperand_ParseFail;
12451261
}
12461262

llvm/lib/Target/Sparc/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ tablegen(LLVM SparcGenDisassemblerTables.inc -gen-disassembler)
1010
tablegen(LLVM SparcGenInstrInfo.inc -gen-instr-info)
1111
tablegen(LLVM SparcGenMCCodeEmitter.inc -gen-emitter)
1212
tablegen(LLVM SparcGenRegisterInfo.inc -gen-register-info)
13+
tablegen(LLVM SparcGenSearchableTables.inc -gen-searchable-tables)
1314
tablegen(LLVM SparcGenSubtargetInfo.inc -gen-subtarget)
1415

1516
add_public_tablegen_target(SparcCommonTableGen)

llvm/lib/Target/Sparc/MCTargetDesc/SparcInstPrinter.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,5 +255,9 @@ void SparcInstPrinter::printMembarTag(const MCInst *MI, int opNum,
255255
void SparcInstPrinter::printASITag(const MCInst *MI, int opNum,
256256
const MCSubtargetInfo &STI, raw_ostream &O) {
257257
unsigned Imm = MI->getOperand(opNum).getImm();
258-
O << Imm;
258+
auto ASITag = SparcASITag::lookupASITagByEncoding(Imm);
259+
if (isV9(STI) && ASITag)
260+
O << '#' << ASITag->Name;
261+
else
262+
O << Imm;
259263
}

llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@
2121
#include "llvm/MC/TargetRegistry.h"
2222
#include "llvm/Support/ErrorHandling.h"
2323

24+
namespace llvm {
25+
namespace SparcASITag {
26+
#define GET_ASITagsList_IMPL
27+
#include "SparcGenSearchableTables.inc"
28+
} // end namespace SparcASITag
29+
} // end namespace llvm
30+
2431
using namespace llvm;
2532

2633
#define GET_INSTRINFO_MC_DESC

llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#ifndef LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCTARGETDESC_H
1414
#define LLVM_LIB_TARGET_SPARC_MCTARGETDESC_SPARCMCTARGETDESC_H
1515

16+
#include "llvm/ADT/StringRef.h"
1617
#include "llvm/Support/DataTypes.h"
1718

1819
#include <memory>
@@ -35,6 +36,18 @@ MCAsmBackend *createSparcAsmBackend(const Target &T, const MCSubtargetInfo &STI,
3536
const MCTargetOptions &Options);
3637
std::unique_ptr<MCObjectTargetWriter> createSparcELFObjectWriter(bool Is64Bit,
3738
uint8_t OSABI);
39+
40+
// Defines symbolic names for Sparc v9 ASI tag names.
41+
namespace SparcASITag {
42+
struct ASITag {
43+
const char *Name;
44+
const char *AltName;
45+
unsigned Encoding;
46+
};
47+
48+
#define GET_ASITagsList_DECL
49+
#include "SparcGenSearchableTables.inc"
50+
} // end namespace SparcASITag
3851
} // End llvm namespace
3952

4053
// Defines symbolic names for Sparc registers. This defines a mapping from

llvm/lib/Target/Sparc/Sparc.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ include "LeonFeatures.td"
6969
// Register File, Calling Conv, Instruction Descriptions
7070
//===----------------------------------------------------------------------===//
7171

72+
include "SparcASITags.td"
7273
include "SparcRegisterInfo.td"
7374
include "SparcCallingConv.td"
7475
include "SparcSchedule.td"

llvm/lib/Target/Sparc/SparcASITags.td

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//===- SparcASITags.td -------------------------------------*- 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 symbolic operands permitted for various kinds of
10+
// SPARCv9 ASI.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
include "llvm/TableGen/SearchableTable.td"
15+
16+
class ASITag<string name, string alt_name, bits<8> op> {
17+
string Name = name;
18+
// A maximum of one alias is supported right now.
19+
string AltName = alt_name;
20+
bits<8> Encoding = op;
21+
}
22+
23+
def ASITagsList : GenericTable {
24+
let FilterClass = "ASITag";
25+
let Fields = ["Name", "AltName", "Encoding"];
26+
27+
let PrimaryKey = [ "Encoding" ];
28+
let PrimaryKeyName = "lookupASITagByEncoding";
29+
}
30+
31+
def lookupASITagByName : SearchIndex {
32+
let Table = ASITagsList;
33+
let Key = [ "Name" ];
34+
}
35+
36+
def lookupASITagByAltName : SearchIndex {
37+
let Table = ASITagsList;
38+
let Key = [ "AltName" ];
39+
}
40+
41+
def : ASITag<"ASI_N", "ASI_NUCLEUS", 0x4>;
42+
def : ASITag<"ASI_N_L", "ASI_NUCLEUS_LITTLE", 0xC>;
43+
def : ASITag<"ASI_AIUP", "ASI_AS_IF_USER_PRIMARY", 0x10>;
44+
def : ASITag<"ASI_AIUS", "ASI_AS_IF_USER_SECONDARY", 0x11>;
45+
def : ASITag<"ASI_AIUP_L", "ASI_AS_IF_USER_PRIMARY_LITTLE", 0x18>;
46+
def : ASITag<"ASI_AIUS_L", "ASI_AS_IF_USER_SECONDARY_LITTLE", 0x19>;
47+
def : ASITag<"ASI_P", "ASI_PRIMARY", 0x80>;
48+
def : ASITag<"ASI_S", "ASI_SECONDARY", 0x81>;
49+
def : ASITag<"ASI_PNF", "ASI_PRIMARY_NOFAULT", 0x82>;
50+
def : ASITag<"ASI_SNF", "ASI_SECONDARY_NOFAULT", 0x83>;
51+
def : ASITag<"ASI_P_L", "ASI_PRIMARY_LITTLE", 0x88>;
52+
def : ASITag<"ASI_S_L", "ASI_SECONDARY_LITTLE", 0x89>;
53+
def : ASITag<"ASI_PNF_L", "ASI_PRIMARY_NOFAULT_LITTLE", 0x8A>;
54+
def : ASITag<"ASI_SNF_L", "ASI_SECONDARY_NOFAULT_LITTLE", 0x8B>;

llvm/test/MC/Disassembler/Sparc/sparc-mem.txt

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# CHECK: ldsb [%g1], %o4
1313
0xd8 0x48 0x40 0x00
1414

15-
# CHECK: ldsba [%i0+%l6] 131, %o2
15+
# CHECK: ldsba [%i0+%l6] #ASI_SNF, %o2
1616
0xd4 0xce 0x10 0x76
1717

1818
# CHECK: ldsh [%i0+%l6], %o2
@@ -27,7 +27,7 @@
2727
# CHECK: ldsh [%g1], %o4
2828
0xd8 0x50 0x40 0x00
2929

30-
# CHECK: ldsha [%i0+%l6] 131, %o2
30+
# CHECK: ldsha [%i0+%l6] #ASI_SNF, %o2
3131
0xd4 0xd6 0x10 0x76
3232

3333
# CHECK: ldub [%i0+%l6], %o2
@@ -42,7 +42,7 @@
4242
# CHECK: ldub [%g1], %o2
4343
0xd4 0x08 0x40 0x00
4444

45-
# CHECK: lduba [%i0+%l6] 131, %o2
45+
# CHECK: lduba [%i0+%l6] #ASI_SNF, %o2
4646
0xd4 0x8e 0x10 0x76
4747

4848
# CHECK: lduh [%i0+%l6], %o2
@@ -57,7 +57,7 @@
5757
# CHECK: lduh [%g1], %o2
5858
0xd4 0x10 0x40 0x00
5959

60-
# CHECK: lduha [%i0+%l6] 131, %o2
60+
# CHECK: lduha [%i0+%l6] #ASI_SNF, %o2
6161
0xd4 0x96 0x10 0x76
6262

6363
# CHECK: ld [%i0+%l6], %o2
@@ -72,7 +72,7 @@
7272
# CHECK: ld [%g1], %o2
7373
0xd4 0x00 0x40 0x00
7474

75-
# CHECK: lda [%i0+%l6] 131, %o2
75+
# CHECK: lda [%i0+%l6] #ASI_SNF, %o2
7676
0xd4 0x86 0x10 0x76
7777

7878
# CHECK: ld [%i0+%l6], %f2
@@ -87,7 +87,7 @@
8787
# CHECK: ld [%g1], %f2
8888
0xc5 0x00 0x40 0x00
8989

90-
# CHECK: lda [%i0+%l6] 131, %f2
90+
# CHECK: lda [%i0+%l6] #ASI_SNF, %f2
9191
0xc5 0x86 0x10 0x76
9292

9393
# CHECK: ldd [%i0+%l6], %f2
@@ -102,7 +102,7 @@
102102
# CHECK: ldd [%g1], %f2
103103
0xc5 0x18 0x40 0x00
104104

105-
# CHECK: ldda [%i0+%l6] 131, %f2
105+
# CHECK: ldda [%i0+%l6] #ASI_SNF, %f2
106106
0xc5 0x9e 0x10 0x76
107107

108108
# CHECK: ldq [%i0+%l6], %f4
@@ -153,7 +153,7 @@
153153
# CHECK: stb %o2, [%g1]
154154
0xd4 0x28 0x40 0x00
155155

156-
# CHECK: stba %o2, [%i0+%l6] 131
156+
# CHECK: stba %o2, [%i0+%l6] #ASI_SNF
157157
0xd4 0xae 0x10 0x76
158158

159159
# CHECK: sth %o2, [%i0+%l6]
@@ -168,7 +168,7 @@
168168
# CHECK: sth %o2, [%g1]
169169
0xd4 0x30 0x40 0x00
170170

171-
# CHECK: stha %o2, [%i0+%l6] 131
171+
# CHECK: stha %o2, [%i0+%l6] #ASI_SNF
172172
0xd4 0xb6 0x10 0x76
173173

174174
# CHECK: st %o2, [%i0+%l6]
@@ -183,7 +183,7 @@
183183
# CHECK: st %o2, [%g1]
184184
0xd4 0x20 0x40 0x00
185185

186-
# CHECK: sta %o2, [%i0+%l6] 131
186+
# CHECK: sta %o2, [%i0+%l6] #ASI_SNF
187187
0xd4 0xa6 0x10 0x76
188188

189189
# CHECK: st %f2, [%i0+%l6]
@@ -198,7 +198,7 @@
198198
# CHECK: st %f2, [%g1]
199199
0xc5 0x20 0x40 0x00
200200

201-
# CHECK: sta %f2, [%i0+%l6] 131
201+
# CHECK: sta %f2, [%i0+%l6] #ASI_SNF
202202
0xc5 0xa6 0x10 0x76
203203

204204
# CHECK: std %f2, [%i0+%l6]
@@ -213,7 +213,7 @@
213213
# CHECK: std %f2, [%g1]
214214
0xc5 0x38 0x40 0x00
215215

216-
# CHECK: stda %f2, [%i0+%l6] 131
216+
# CHECK: stda %f2, [%i0+%l6] #ASI_SNF
217217
0xc5 0xbe 0x10 0x76
218218

219219
# CHECK: stq %f4, [%i0+%l6]
@@ -252,10 +252,10 @@
252252
# CHECK: swap [%g1], %o2
253253
0xd4 0x78 0x40 0x00
254254

255-
# CHECK: swapa [%i0+%l6] 131, %o2
255+
# CHECK: swapa [%i0+%l6] #ASI_SNF, %o2
256256
0xd4 0xfe 0x10 0x76
257257

258-
# CHECK: swapa [%g1] 131, %o2
258+
# CHECK: swapa [%g1] #ASI_SNF, %o2
259259
0xd4 0xf8 0x50 0x60
260260

261261
# CHECK: ldd [%i0+%l6], %o2
@@ -282,7 +282,7 @@
282282
# CHECK: std %o2, [%g1]
283283
0xd4 0x38 0x40 0x00
284284

285-
# CHECK: stda %o2, [%i0+%l6] 131
285+
# CHECK: stda %o2, [%i0+%l6] #ASI_SNF
286286
0xd4 0xbe 0x10 0x76
287287

288288
# CHECK: ldstub [%i0+%l6], %o2
@@ -297,10 +297,10 @@
297297
# CHECK: ldstub [%g1], %o2
298298
0xd4 0x68 0x40 0x00
299299

300-
# CHECK: ldstuba [%i0+%l6] 131, %o2
300+
# CHECK: ldstuba [%i0+%l6] #ASI_SNF, %o2
301301
0xd4 0xee 0x10 0x76
302302

303-
# CHECK: ldstuba [%g1] 131, %o2
303+
# CHECK: ldstuba [%g1] #ASI_SNF, %o2
304304
0xd4 0xe8 0x50 0x60
305305

306306
# CHECK: flush %g1+%g2
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# RUN: llvm-mc --disassemble %s -triple=sparcv9-unknown-linux | FileCheck %s --check-prefix=V9
2+
3+
## Disassembly prefers alternate mnemonic over explicit ASI tags
4+
## and short over long ASI tag names.
5+
# V9: casxa [%i0] #ASI_N, %l6, %o2
6+
0xd5 0xf6 0x00 0x96
7+
# V9: casxa [%i0] #ASI_N_L, %l6, %o2
8+
0xd5 0xf6 0x01 0x96
9+
# V9: casxa [%i0] #ASI_AIUP, %l6, %o2
10+
0xd5 0xf6 0x02 0x16
11+
# V9: casxa [%i0] #ASI_AIUS, %l6, %o2
12+
0xd5 0xf6 0x02 0x36
13+
# V9: casxa [%i0] #ASI_AIUP_L, %l6, %o2
14+
0xd5 0xf6 0x03 0x16
15+
# V9: casxa [%i0] #ASI_AIUS_L, %l6, %o2
16+
0xd5 0xf6 0x03 0x36
17+
## casx == casxa #ASI_P
18+
# V9: casx [%i0], %l6, %o2
19+
0xd5 0xf6 0x10 0x16
20+
# V9: casxa [%i0] #ASI_S, %l6, %o2
21+
0xd5 0xf6 0x10 0x36
22+
# V9: casxa [%i0] #ASI_PNF, %l6, %o2
23+
0xd5 0xf6 0x10 0x56
24+
# V9: casxa [%i0] #ASI_SNF, %l6, %o2
25+
0xd5 0xf6 0x10 0x76
26+
## casxl == casxa #ASI_L
27+
# V9: casxl [%i0], %l6, %o2
28+
0xd5 0xf6 0x11 0x16
29+
# V9: casxa [%i0] #ASI_S_L, %l6, %o2
30+
0xd5 0xf6 0x11 0x36
31+
# V9: casxa [%i0] #ASI_PNF_L, %l6, %o2
32+
0xd5 0xf6 0x11 0x56
33+
# V9: casxa [%i0] #ASI_SNF_L, %l6, %o2
34+
0xd5 0xf6 0x11 0x76

0 commit comments

Comments
 (0)