131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//= X86IntelInstPrinter.h - Convert X86 MCInst to assembly syntax -*- C++ -*-=//
2e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner//
3e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner//                     The LLVM Compiler Infrastructure
4e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner//
5e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner// This file is distributed under the University of Illinois Open Source
6e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner// License. See LICENSE.TXT for details.
7e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner//
8e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner//===----------------------------------------------------------------------===//
9e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner//
107f74eade1f48b32e4c87db651f1a86e0a64b6fa7Chad Rosier// This class prints an X86 MCInst to Intel style .s file syntax.
11e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner//
12e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner//===----------------------------------------------------------------------===//
13e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner
14e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner#ifndef X86_INTEL_INST_PRINTER_H
15e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner#define X86_INTEL_INST_PRINTER_H
16e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner
17e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner#include "llvm/MC/MCInstPrinter.h"
18e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner#include "llvm/Support/raw_ostream.h"
19e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner
20e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattnernamespace llvm {
21a5c177e70a42f48e4885075c4c48aad0816a2817Bill Wendling
22a5c177e70a42f48e4885075c4c48aad0816a2817Bill Wendlingclass MCOperand;
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass X86IntelInstPrinter final : public MCInstPrinter {
25e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattnerpublic:
2617463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper  X86IntelInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
2717463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper                      const MCRegisterInfo &MRI)
2817463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper    : MCInstPrinter(MAI, MII, MRI) {}
2944dcfd36253570ccd5f00189eb918604473135e0Bill Wendling
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printRegName(raw_ostream &OS, unsigned RegNo) const override;
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printInst(const MCInst *MI, raw_ostream &OS, StringRef Annot) override;
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
33e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  // Autogenerated by tblgen.
3435c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printInstruction(const MCInst *MI, raw_ostream &O);
35e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  static const char *getRegisterName(unsigned RegNo);
36e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner
3735c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
3835c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printMemReference(const MCInst *MI, unsigned Op, raw_ostream &O);
3935c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printSSECC(const MCInst *MI, unsigned Op, raw_ostream &O);
40ac0740f2442dae01a4c44875f9b936d9ea352636Craig Topper  void printAVXCC(const MCInst *MI, unsigned Op, raw_ostream &O);
4135c688932a3d8f133905280f64f490f61270b2a9Chad Rosier  void printPCRelImm(const MCInst *MI, unsigned OpNo, raw_ostream &O);
42a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper  void printMemOffset(const MCInst *MI, unsigned OpNo, raw_ostream &O);
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printSrcIdx(const MCInst *MI, unsigned OpNo, raw_ostream &O);
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printDstIdx(const MCInst *MI, unsigned OpNo, raw_ostream &O);
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printRoundingControl(const MCInst *MI, unsigned Op, raw_ostream &OS);
46a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper
4735c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printopaquemem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
48418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "opaque ptr ";
4935c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner    printMemReference(MI, OpNo, O);
50e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  }
51e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner
5235c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printi8mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
53418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "byte ptr ";
5435c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner    printMemReference(MI, OpNo, O);
55e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  }
5635c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printi16mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
57418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "word ptr ";
5835c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner    printMemReference(MI, OpNo, O);
59e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  }
6035c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printi32mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
61418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "dword ptr ";
6235c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner    printMemReference(MI, OpNo, O);
63e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  }
6435c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printi64mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
65418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "qword ptr ";
6635c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner    printMemReference(MI, OpNo, O);
67e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  }
6835c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printi128mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
69418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "xmmword ptr ";
7035c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner    printMemReference(MI, OpNo, O);
71e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  }
7294143ee6254944a26adba2200037328c2c8ef289Bruno Cardoso Lopes  void printi256mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
73418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "ymmword ptr ";
7494143ee6254944a26adba2200037328c2c8ef289Bruno Cardoso Lopes    printMemReference(MI, OpNo, O);
7594143ee6254944a26adba2200037328c2c8ef289Bruno Cardoso Lopes  }
76c18f4efc5dd24adcc653806455fc7ae8508e9c66Elena Demikhovsky  void printi512mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
77418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "zmmword ptr ";
78c18f4efc5dd24adcc653806455fc7ae8508e9c66Elena Demikhovsky    printMemReference(MI, OpNo, O);
79c18f4efc5dd24adcc653806455fc7ae8508e9c66Elena Demikhovsky  }
8035c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printf32mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
81418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "dword ptr ";
8235c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner    printMemReference(MI, OpNo, O);
83e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  }
8435c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printf64mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
85418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "qword ptr ";
8635c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner    printMemReference(MI, OpNo, O);
87e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  }
8835c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printf80mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
89418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "xword ptr ";
9035c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner    printMemReference(MI, OpNo, O);
91e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  }
9235c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner  void printf128mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
93418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "xmmword ptr ";
9435c33bd772b3cfb34fdc6b5c9171f955454d0043Chris Lattner    printMemReference(MI, OpNo, O);
95e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner  }
96e86b01c153ba52307ecb6e7513ec33f57caedfddBruno Cardoso Lopes  void printf256mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
97418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "ymmword ptr ";
98e86b01c153ba52307ecb6e7513ec33f57caedfddBruno Cardoso Lopes    printMemReference(MI, OpNo, O);
99e86b01c153ba52307ecb6e7513ec33f57caedfddBruno Cardoso Lopes  }
100c18f4efc5dd24adcc653806455fc7ae8508e9c66Elena Demikhovsky  void printf512mem(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
101418eb3df746816293dd013b82264f43e501ec093Craig Topper    O << "zmmword ptr ";
102c18f4efc5dd24adcc653806455fc7ae8508e9c66Elena Demikhovsky    printMemReference(MI, OpNo, O);
103c18f4efc5dd24adcc653806455fc7ae8508e9c66Elena Demikhovsky  }
104a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printSrcIdx8(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    O << "byte ptr ";
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    printSrcIdx(MI, OpNo, O);
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printSrcIdx16(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    O << "word ptr ";
11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    printSrcIdx(MI, OpNo, O);
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printSrcIdx32(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    O << "dword ptr ";
11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    printSrcIdx(MI, OpNo, O);
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printSrcIdx64(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    O << "qword ptr ";
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    printSrcIdx(MI, OpNo, O);
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printDstIdx8(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    O << "byte ptr ";
12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    printDstIdx(MI, OpNo, O);
12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printDstIdx16(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    O << "word ptr ";
12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    printDstIdx(MI, OpNo, O);
12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printDstIdx32(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    O << "dword ptr ";
13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    printDstIdx(MI, OpNo, O);
13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void printDstIdx64(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    O << "qword ptr ";
13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    printDstIdx(MI, OpNo, O);
13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
138a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper  void printMemOffs8(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
139a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper    O << "byte ptr ";
140a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper    printMemOffset(MI, OpNo, O);
141a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper  }
142a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper  void printMemOffs16(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
143a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper    O << "word ptr ";
144a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper    printMemOffset(MI, OpNo, O);
145a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper  }
146a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper  void printMemOffs32(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
147a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper    O << "dword ptr ";
148a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper    printMemOffset(MI, OpNo, O);
149a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper  }
150a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper  void printMemOffs64(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
151a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper    O << "qword ptr ";
152a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper    printMemOffset(MI, OpNo, O);
153a4959f3f6eb9b6ab3cbbe085a2797208682e96c6Craig Topper  }
154e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner};
155e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner
156e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner}
157e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner
158e895c6151589c1b7f6ac9ca992b76106fa197a37Chris Lattner#endif
159