LLVM: lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

26#include

27using namespace llvm;

28

29#define DEBUG_TYPE "asm-printer"

30

31#include "NVPTXGenAsmWriter.inc"

32

36

38

39

40 unsigned RCId = (Reg.id() >> 28);

41 switch (RCId) {

43 case 0:

44

45

47 return;

48 case 1:

49 OS << "%p";

50 break;

51 case 2:

52 OS << "%rs";

53 break;

54 case 3:

55 OS << "%r";

56 break;

57 case 4:

58 OS << "%rd";

59 break;

60 case 5:

61 OS << "%f";

62 break;

63 case 6:

64 OS << "%fd";

65 break;

66 case 7:

67 OS << "%rq";

68 break;

69 }

70

71 unsigned VReg = Reg.id() & 0x0FFFFFFF;

72 OS << VReg;

73}

74

83

87 if (Op.isReg()) {

90 } else if (Op.isImm()) {

92 } else {

93 assert(Op.isExpr() && "Unknown operand kind in printOperand");

94 MAI.printExpr(O, *Op.getExpr());

95 }

96}

97

100 const MCOperand &MO = MI->getOperand(OpNum);

101 int64_t Imm = MO.getImm();

102

103 if (Modifier == "ftz") {

104

106 O << ".ftz";

107 return;

108 } else if (Modifier == "sat") {

109

111 O << ".sat";

112 return;

113 } else if (Modifier == "relu") {

114

116 O << ".relu";

117 return;

118 } else if (Modifier == "base") {

119

121 default:

122 return;

124 return;

126 O << ".rni";

127 return;

129 O << ".rzi";

130 return;

132 O << ".rmi";

133 return;

135 O << ".rpi";

136 return;

138 O << ".rn";

139 return;

141 O << ".rz";

142 return;

144 O << ".rm";

145 return;

147 O << ".rp";

148 return;

150 O << ".rna";

151 return;

153 O << ".rs";

154 return;

155 }

156 }

158}

159

162 const MCOperand &MO = MI->getOperand(OpNum);

163 const int Imm = MO.getImm();

164 if (Imm)

165 O << ".ftz";

166}

167

170 const MCOperand &MO = MI->getOperand(OpNum);

171 int64_t Imm = MO.getImm();

172

173 if (Modifier == "FCmp") {

174 switch (Imm) {

175 default:

176 return;

178 O << "eq";

179 return;

181 O << "ne";

182 return;

184 O << "lt";

185 return;

187 O << "le";

188 return;

190 O << "gt";

191 return;

193 O << "ge";

194 return;

196 O << "equ";

197 return;

199 O << "neu";

200 return;

202 O << "ltu";

203 return;

205 O << "leu";

206 return;

208 O << "gtu";

209 return;

211 O << "geu";

212 return;

214 O << "num";

215 return;

217 O << "nan";

218 return;

219 }

220 }

221 if (Modifier == "ICmp") {

222 switch (Imm) {

223 default:

226 O << "eq";

227 return;

229 O << "ne";

230 return;

233 O << "lt";

234 return;

237 O << "le";

238 return;

241 O << "gt";

242 return;

245 O << "ge";

246 return;

247 }

248 }

249 if (Modifier == "IType") {

250 switch (Imm) {

251 default:

255 O << "b";

256 return;

261 O << "s";

262 return;

267 O << "u";

268 return;

269 }

270 }

272}

273

276 const MCOperand &MO = MI->getOperand(OpNum);

277 int Imm = (int)MO.getImm();

278 if (Modifier == "sem") {

280 switch (Ordering) {

282 return;

284 O << ".relaxed";

285 return;

287 O << ".acquire";

288 return;

290 O << ".release";

291 return;

293 O << ".acq_rel";

294 return;

297 "NVPTX AtomicCode Printer does not support \"seq_cst\" ordering.");

298 return;

300 O << ".volatile";

301 return;

303 O << ".mmio.relaxed";

304 return;

305 }

306 } else if (Modifier == "scope") {

308 switch (S) {

311 return;

313 O << ".sys";

314 return;

316 O << ".cta";

317 return;

319 O << ".cluster";

320 return;

322 O << ".gpu";

323 return;

324 }

326 "NVPTX AtomicCode Printer does not support \"{}\" scope modifier.",

327 ScopeToString(S)));

328 } else if (Modifier == "addsp") {

330 switch (A) {

332 return;

339 O << "." << A;

340 return;

341 }

343 "NVPTX AtomicCode Printer does not support \"{}\" addsp modifier.",

344 AddressSpaceToString(A)));

345 } else if (Modifier == "sign") {

346 switch (Imm) {

348 O << "s";

349 return;

351 O << "u";

352 return;

354 O << "b";

355 return;

357 O << "f";

358 return;

359 default:

361 }

362 }

364}

365

368 const MCOperand &MO = MI->getOperand(OpNum);

369 int Imm = (int)MO.getImm();

370 if (Modifier.empty() || Modifier == "version") {

371 O << Imm;

372 return;

373 } else if (Modifier == "aligned") {

374

375 if (Imm >= 63)

376 O << ".aligned";

377 return;

378 }

380}

381

385

386 if (Modifier == "add") {

387 O << ", ";

389 } else {

390 if (MI->getOperand(OpNum + 1).isImm() &&

391 MI->getOperand(OpNum + 1).getImm() == 0)

392 return;

393 O << "+";

395 }

396}

397

400 auto &Op = MI->getOperand(OpNum);

401 assert(Op.isImm() && "Invalid operand");

403 if (Imm != UINT32_MAX) {

404 O << ".pragma \"used_bytes_mask " << format_hex(Imm, 1) << "\";\n\t";

405 }

406}

407

412 O << "_";

413 else

415}

416

419 int64_t Imm = MI->getOperand(OpNum).getImm();

421}

422

426 assert(Op.isExpr() && "Call prototype is not an MCExpr?");

427 const MCExpr *Expr = Op.getExpr();

430}

431

434 const MCOperand &MO = MI->getOperand(OpNum);

435 int64_t Imm = MO.getImm();

436

437 switch (Imm) {

438 default:

439 return;

441 return;

443 O << ".f4e";

444 return;

446 O << ".b4e";

447 return;

449 O << ".rc8";

450 return;

452 O << ".ecl";

453 return;

455 O << ".ecr";

456 return;

458 O << ".rc16";

459 return;

460 }

461}

462

465 const MCOperand &MO = MI->getOperand(OpNum);

467

468 switch (static_cast<RedTy>(MO.getImm())) {

469 case RedTy::ADD:

470 O << ".add";

471 return;

472 case RedTy::MIN:

473 O << ".min";

474 return;

475 case RedTy::MAX:

476 O << ".max";

477 return;

478 case RedTy::INC:

479 O << ".inc";

480 return;

481 case RedTy::DEC:

482 O << ".dec";

483 return;

484 case RedTy::AND:

485 O << ".and";

486 return;

487 case RedTy::OR:

488 O << ".or";

489 return;

490 case RedTy::XOR:

491 O << ".xor";

492 return;

493 }

495 "Invalid Reduction Op in printCpAsyncBulkTensorReductionMode");

496}

497

500 const MCOperand &MO = MI->getOperand(OpNum);

502

503 switch (static_cast<CGTy>(MO.getImm())) {

504 case CGTy::CG_NONE:

505 O << "";

506 return;

507 case CGTy::CG_1:

508 O << ".cta_group::1";

509 return;

510 case CGTy::CG_2:

511 O << ".cta_group::2";

512 return;

513 }

515}

516

519 const MCOperand &MO = MI->getOperand(OpNum);

521 const auto Imm = MO.getImm();

522

523 if (Modifier == "RetList") {

524 assert((Imm == 1 || Imm == 0) && "Invalid return list");

525 if (Imm)

526 O << " (retval0),";

527 return;

528 }

529

530 if (Modifier == "ParamList") {

531 assert(Imm >= 0 && "Invalid parameter list");

533 [&](const auto &I) { O << "param" << I; });

534 return;

535 }

537}

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")

This file contains the definitions of the enumerations and flags associated with NVVM Intrinsics,...

This class is intended to be used as a base class for asm properties and features specific to the tar...

Base class for the full range of assembler expressions which are needed for parsing.

WithMarkup markup(raw_ostream &OS, Markup M)

format_object< int64_t > formatHex(int64_t Value) const

const MCRegisterInfo & MRI

void printAnnotation(raw_ostream &OS, StringRef Annot)

Utility function for printing annotations.

format_object< int64_t > formatImm(int64_t Value) const

Utility function to print immediates in decimal or hex.

MCInstPrinter(const MCAsmInfo &mai, const MCInstrInfo &mii, const MCRegisterInfo &mri)

Instances of this class represent a single low-level machine instruction.

Interface to description of machine instruction set.

Instances of this class represent operands of the MCInst class.

MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...

Wrapper class representing physical registers. Should be passed by value.

static constexpr unsigned NoRegister

Generic base class for all target subtargets.

MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...

StringRef getName() const

getName - Get the symbol name.

void printFTZFlag(const MCInst *MI, int OpNum, raw_ostream &O)

Definition NVPTXInstPrinter.cpp:160

void printCmpMode(const MCInst *MI, int OpNum, raw_ostream &O, StringRef Modifier={})

Definition NVPTXInstPrinter.cpp:168

void printRegName(raw_ostream &OS, MCRegister Reg) override

Print the assembler register name.

Definition NVPTXInstPrinter.cpp:37

void printHexu32imm(const MCInst *MI, int OpNum, raw_ostream &O)

Definition NVPTXInstPrinter.cpp:417

void printCTAGroup(const MCInst *MI, int OpNum, raw_ostream &O)

Definition NVPTXInstPrinter.cpp:498

void printCvtMode(const MCInst *MI, int OpNum, raw_ostream &O, StringRef Modifier={})

Definition NVPTXInstPrinter.cpp:98

void printMmaCode(const MCInst *MI, int OpNum, raw_ostream &O, StringRef Modifier={})

Definition NVPTXInstPrinter.cpp:366

void printInstruction(const MCInst *MI, uint64_t Address, raw_ostream &O)

void printProtoIdent(const MCInst *MI, int OpNum, raw_ostream &O)

Definition NVPTXInstPrinter.cpp:423

void printAtomicCode(const MCInst *MI, int OpNum, raw_ostream &O, StringRef Modifier={})

Definition NVPTXInstPrinter.cpp:274

static const char * getRegisterName(MCRegister Reg)

void printCallOperand(const MCInst *MI, int OpNum, raw_ostream &O, StringRef Modifier={})

Definition NVPTXInstPrinter.cpp:517

void printTmaReductionMode(const MCInst *MI, int OpNum, raw_ostream &O)

Definition NVPTXInstPrinter.cpp:463

void printUsedBytesMaskPragma(const MCInst *MI, int OpNum, raw_ostream &O)

Definition NVPTXInstPrinter.cpp:398

void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, const MCSubtargetInfo &STI, raw_ostream &OS) override

Print the specified MCInst to the specified raw_ostream.

Definition NVPTXInstPrinter.cpp:75

void printRegisterOrSinkSymbol(const MCInst *MI, int OpNum, raw_ostream &O)

Definition NVPTXInstPrinter.cpp:408

NVPTXInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI)

Definition NVPTXInstPrinter.cpp:33

void printPrmtMode(const MCInst *MI, int OpNum, raw_ostream &O)

Definition NVPTXInstPrinter.cpp:432

void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O)

Definition NVPTXInstPrinter.cpp:84

void printMemOperand(const MCInst *MI, int OpNum, raw_ostream &O, StringRef Modifier={})

Definition NVPTXInstPrinter.cpp:382

StringRef - Represent a constant reference to a string, i.e.

constexpr bool empty() const

empty - Check if the string is empty.

This class implements an extremely fast bulk output stream that can only output to a stream.

#define llvm_unreachable(msg)

Marks that the current location is not supposed to be reachable.

This is an optimization pass for GlobalISel generic memory operations.

SmallVectorImpl< T >::const_pointer c_str(SmallVectorImpl< T > &str)

void interleaveComma(const Container &c, StreamT &os, UnaryFunctor each_fn)

auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)

LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)

FormattedNumber format_hex(uint64_t N, unsigned Width, bool Upper=false)

format_hex - Output N as a fixed width hexadecimal.

DWARFExpression::Operation Op

decltype(auto) cast(const From &Val)

cast - Return the argument parameter cast to the specified type.

auto seq(T Begin, T End)

Iterate over an integral type from Begin up to - but not including - End.