blob: fae8b8af37f03aab76e582ab476b61e21cb93fd9 [file] [log] [blame]
Chris Lattnerb36cbd02005-07-01 22:44:09 +00001//===-- X86IntelAsmPrinter.h - Convert X86 LLVM code to Intel assembly ----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Intel assembly code printer class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef X86INTELASMPRINTER_H
15#define X86INTELASMPRINTER_H
16
17#include "X86AsmPrinter.h"
18#include "llvm/CodeGen/ValueTypes.h"
Chris Lattnerb36cbd02005-07-01 22:44:09 +000019#include "llvm/Target/MRegisterInfo.h"
20
21namespace llvm {
Chris Lattnerb36cbd02005-07-01 22:44:09 +000022
23struct X86IntelAsmPrinter : public X86SharedAsmPrinter {
Evan Chengc4c62572006-03-13 23:20:37 +000024 X86IntelAsmPrinter(std::ostream &O, X86TargetMachine &TM)
Chris Lattnerb36cbd02005-07-01 22:44:09 +000025 : X86SharedAsmPrinter(O, TM) { }
26
27 virtual const char *getPassName() const {
28 return "X86 Intel-Style Assembly Printer";
29 }
30
31 /// printInstruction - This method is automatically generated by tablegen
32 /// from the instruction set description. This method returns true if the
33 /// machine instruction was sufficiently described to print it, otherwise it
34 /// returns false.
35 bool printInstruction(const MachineInstr *MI);
36
37 // This method is used by the tablegen'erated instruction printer.
Chris Lattnera3b8c572006-02-06 23:41:19 +000038 void printOperand(const MachineInstr *MI, unsigned OpNo,
39 const char *Modifier = 0) {
Chris Lattnerb36cbd02005-07-01 22:44:09 +000040 const MachineOperand &MO = MI->getOperand(OpNo);
41 if (MO.getType() == MachineOperand::MO_MachineRegister) {
42 assert(MRegisterInfo::isPhysicalRegister(MO.getReg())&&"Not physref??");
43 // Bug Workaround: See note in Printer::doInitialization about %.
44 O << "%" << TM.getRegisterInfo()->get(MO.getReg()).Name;
45 } else {
Chris Lattnera3b8c572006-02-06 23:41:19 +000046 printOp(MO, Modifier);
Chris Lattnerb36cbd02005-07-01 22:44:09 +000047 }
48 }
49
Nate Begeman391c5d22005-11-30 18:54:35 +000050 void printi8mem(const MachineInstr *MI, unsigned OpNo) {
51 O << "BYTE PTR ";
52 printMemReference(MI, OpNo);
53 }
54 void printi16mem(const MachineInstr *MI, unsigned OpNo) {
55 O << "WORD PTR ";
56 printMemReference(MI, OpNo);
57 }
58 void printi32mem(const MachineInstr *MI, unsigned OpNo) {
Nate Begeman85a168a2005-11-30 18:57:39 +000059 O << "DWORD PTR ";
Nate Begeman391c5d22005-11-30 18:54:35 +000060 printMemReference(MI, OpNo);
61 }
62 void printi64mem(const MachineInstr *MI, unsigned OpNo) {
Nate Begeman85a168a2005-11-30 18:57:39 +000063 O << "QWORD PTR ";
Nate Begeman391c5d22005-11-30 18:54:35 +000064 printMemReference(MI, OpNo);
65 }
Evan Cheng470a6ad2006-02-22 02:26:30 +000066 void printi128mem(const MachineInstr *MI, unsigned OpNo) {
67 O << "XMMWORD PTR ";
68 printMemReference(MI, OpNo);
69 }
Nate Begeman391c5d22005-11-30 18:54:35 +000070 void printf32mem(const MachineInstr *MI, unsigned OpNo) {
71 O << "DWORD PTR ";
72 printMemReference(MI, OpNo);
73 }
74 void printf64mem(const MachineInstr *MI, unsigned OpNo) {
75 O << "QWORD PTR ";
76 printMemReference(MI, OpNo);
77 }
Evan Cheng223547a2006-01-31 22:28:30 +000078 void printf128mem(const MachineInstr *MI, unsigned OpNo) {
79 O << "XMMWORD PTR ";
Chris Lattnerb36cbd02005-07-01 22:44:09 +000080 printMemReference(MI, OpNo);
81 }
82
Evan Cheng55c25f22006-04-28 23:19:39 +000083 bool printAsmMRegister(const MachineOperand &MO, const char Mode);
Evan Cheng3d48a902006-04-28 21:19:05 +000084 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
85 unsigned AsmVariant, const char *ExtraCode);
86 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
87 unsigned AsmVariant, const char *ExtraCode);
88 void printMachineInstruction(const MachineInstr *MI);
Chris Lattnera3b8c572006-02-06 23:41:19 +000089 void printOp(const MachineOperand &MO, const char *Modifier = 0);
Nate Begeman391c5d22005-11-30 18:54:35 +000090 void printSSECC(const MachineInstr *MI, unsigned Op);
Chris Lattnerb36cbd02005-07-01 22:44:09 +000091 void printMemReference(const MachineInstr *MI, unsigned Op);
Evan Cheng7ccced62006-02-18 00:15:05 +000092 void printPICLabel(const MachineInstr *MI, unsigned Op);
Chris Lattnerb36cbd02005-07-01 22:44:09 +000093 bool runOnMachineFunction(MachineFunction &F);
94 bool doInitialization(Module &M);
95};
96
Chris Lattnerb36cbd02005-07-01 22:44:09 +000097} // end namespace llvm
98
99#endif