X86ATTInstPrinter.cpp revision ffc0574a12fb2c8cc1b76dfebf21bccd879f5de2
1fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner//===-- X86ATTInstPrinter.cpp - AT&T assembly instruction printing --------===//
2fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner//
3fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner//                     The LLVM Compiler Infrastructure
4fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner//
5fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner// This file is distributed under the University of Illinois Open Source
6fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner// License. See LICENSE.TXT for details.
7fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner//
8fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner//===----------------------------------------------------------------------===//
9fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner//
10fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner// This file includes code for rendering MCInst instances as AT&T-style
11fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner// assembly.
12fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner//
13fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner//===----------------------------------------------------------------------===//
14fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner
15fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner#define DEBUG_TYPE "asm-printer"
16cae05cb324031b16a71c56a2a01b489a7c28d365Chris Lattner#include "X86ATTInstPrinter.h"
17fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner#include "llvm/MC/MCInst.h"
18af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#include "llvm/MC/MCAsmInfo.h"
198c2eebe4074ef218b30d94358f6b2e45c079605cDaniel Dunbar#include "llvm/MC/MCExpr.h"
20ab7c09b6b6f4516a631fd6788918c237c83939afTorok Edwin#include "llvm/Support/ErrorHandling.h"
2171847813bc419f7a0667468136a07429c6d9f164David Greene#include "llvm/Support/FormattedStream.h"
22558b79a399b0b6642e193d4fe59ac01e1f9cbba4Shantonu Sen#include "X86GenInstrNames.inc"
23fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattnerusing namespace llvm;
24fadc83c699d16e07747b1ceca7fbb01390fdcb74Chris Lattner
25d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner// Include the auto-generated portion of the assembly writer.
26d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner#define MachineInstr MCInst
27d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner#define NO_ASM_WRITER_BOILERPLATE
28d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner#include "X86GenAsmWriter.inc"
29d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner#undef MachineInstr
30d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner
31c493fb2f4d67bfe4b695d9067eae178ced5970ccChris Lattnervoid X86ATTInstPrinter::printInst(const MCInst *MI) { printInstruction(MI); }
32c493fb2f4d67bfe4b695d9067eae178ced5970ccChris Lattner
33cae05cb324031b16a71c56a2a01b489a7c28d365Chris Lattnervoid X86ATTInstPrinter::printSSECC(const MCInst *MI, unsigned Op) {
34c12430644a9f49a056286f8ebe0e55ccc23bdde0Chris Lattner  switch (MI->getOperand(Op).getImm()) {
35c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  default: llvm_unreachable("Invalid ssecc argument!");
36f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  case 0: O << "eq"; break;
37f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  case 1: O << "lt"; break;
38f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  case 2: O << "le"; break;
39f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  case 3: O << "unord"; break;
40f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  case 4: O << "neq"; break;
41f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  case 5: O << "nlt"; break;
42f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  case 6: O << "nle"; break;
43f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  case 7: O << "ord"; break;
44d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner  }
45d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner}
46d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner
477680e733415e01a30183a73bfbe16f7829439db7Chris Lattner/// print_pcrel_imm - This is used to print an immediate value that ends up
48ffc0574a12fb2c8cc1b76dfebf21bccd879f5de2Chris Lattner/// being encoded as a pc-relative value (e.g. for jumps and calls).  These
49ffc0574a12fb2c8cc1b76dfebf21bccd879f5de2Chris Lattner/// print slightly differently than normal immediates.  For example, a $ is not
50ffc0574a12fb2c8cc1b76dfebf21bccd879f5de2Chris Lattner/// emitted.
51cae05cb324031b16a71c56a2a01b489a7c28d365Chris Lattnervoid X86ATTInstPrinter::print_pcrel_imm(const MCInst *MI, unsigned OpNo) {
527680e733415e01a30183a73bfbe16f7829439db7Chris Lattner  const MCOperand &Op = MI->getOperand(OpNo);
537680e733415e01a30183a73bfbe16f7829439db7Chris Lattner  if (Op.isImm())
54ffc0574a12fb2c8cc1b76dfebf21bccd879f5de2Chris Lattner    // Print this as a signed 32-bit value.
55ffc0574a12fb2c8cc1b76dfebf21bccd879f5de2Chris Lattner    O << (int)Op.getImm();
56f92c95f3070f2f797987d2b753780a3a5e482351Chris Lattner  else {
57f92c95f3070f2f797987d2b753780a3a5e482351Chris Lattner    assert(Op.isExpr() && "unknown pcrel immediate operand");
58c493fb2f4d67bfe4b695d9067eae178ced5970ccChris Lattner    Op.getExpr()->print(O, &MAI);
59f92c95f3070f2f797987d2b753780a3a5e482351Chris Lattner  }
607680e733415e01a30183a73bfbe16f7829439db7Chris Lattner}
617680e733415e01a30183a73bfbe16f7829439db7Chris Lattner
62172862a2a74f5deace29e3baaf8a77f6bd2cecbeChris Lattnervoid X86ATTInstPrinter::printOperand(const MCInst *MI, unsigned OpNo) {
63f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner
64f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  const MCOperand &Op = MI->getOperand(OpNo);
65f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  if (Op.isReg()) {
66c510f4cb6ef524800ff010ddb0551384bd38b1c1Chris Lattner    O << '%' << getRegisterName(Op.getReg());
67f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  } else if (Op.isImm()) {
683de47b8a85a186bac4ae6dbebf555a8363b176c5Chris Lattner    O << '$' << Op.getImm();
69f92c95f3070f2f797987d2b753780a3a5e482351Chris Lattner  } else {
70f92c95f3070f2f797987d2b753780a3a5e482351Chris Lattner    assert(Op.isExpr() && "unknown operand kind in printOperand");
7161466c50df9d00c4a07b1fd72536399cfb418ebdDaniel Dunbar    O << '$';
72c493fb2f4d67bfe4b695d9067eae178ced5970ccChris Lattner    Op.getExpr()->print(O, &MAI);
73f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  }
74d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner}
75d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner
76cae05cb324031b16a71c56a2a01b489a7c28d365Chris Lattnervoid X86ATTInstPrinter::printLeaMemReference(const MCInst *MI, unsigned Op) {
77f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  const MCOperand &BaseReg  = MI->getOperand(Op);
78f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  const MCOperand &IndexReg = MI->getOperand(Op+2);
79f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  const MCOperand &DispSpec = MI->getOperand(Op+3);
80f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner
81f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  if (DispSpec.isImm()) {
82f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner    int64_t DispVal = DispSpec.getImm();
83f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner    if (DispVal || (!IndexReg.getReg() && !BaseReg.getReg()))
84f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner      O << DispVal;
85f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  } else {
863de47b8a85a186bac4ae6dbebf555a8363b176c5Chris Lattner    assert(DispSpec.isExpr() && "non-immediate displacement for LEA?");
87c493fb2f4d67bfe4b695d9067eae178ced5970ccChris Lattner    DispSpec.getExpr()->print(O, &MAI);
88f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  }
89f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner
90f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  if (IndexReg.getReg() || BaseReg.getReg()) {
91f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner    O << '(';
92f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner    if (BaseReg.getReg())
93dc479f6ebf38c862e75eace7b24c3232249b7ec2Chris Lattner      printOperand(MI, Op);
94f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner
95f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner    if (IndexReg.getReg()) {
96f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner      O << ',';
97dc479f6ebf38c862e75eace7b24c3232249b7ec2Chris Lattner      printOperand(MI, Op+2);
987f8217f64bc6efabc680f4ffff77e199f6c53103Chris Lattner      unsigned ScaleVal = MI->getOperand(Op+1).getImm();
997f8217f64bc6efabc680f4ffff77e199f6c53103Chris Lattner      if (ScaleVal != 1)
100f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner        O << ',' << ScaleVal;
101f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner    }
102f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner    O << ')';
103f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  }
104d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner}
105d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner
106cae05cb324031b16a71c56a2a01b489a7c28d365Chris Lattnervoid X86ATTInstPrinter::printMemReference(const MCInst *MI, unsigned Op) {
107f92c95f3070f2f797987d2b753780a3a5e482351Chris Lattner  // If this has a segment register, print it.
108f92c95f3070f2f797987d2b753780a3a5e482351Chris Lattner  if (MI->getOperand(Op+4).getReg()) {
109c12430644a9f49a056286f8ebe0e55ccc23bdde0Chris Lattner    printOperand(MI, Op+4);
110f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner    O << ':';
111f38c03af2a142db2777ce839026706969f3aeaa9Chris Lattner  }
112c12430644a9f49a056286f8ebe0e55ccc23bdde0Chris Lattner  printLeaMemReference(MI, Op);
113d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner}
114