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