outputblock.isa revision 4366
1// Copyright (c) 2007 The Hewlett-Packard Development Company 2// All rights reserved. 3// 4// Redistribution and use of this software in source and binary forms, 5// with or without modification, are permitted provided that the 6// following conditions are met: 7// 8// The software must be used only for Non-Commercial Use which means any 9// use which is NOT directed to receiving any direct monetary 10// compensation for, or commercial advantage from such use. Illustrative 11// examples of non-commercial use are academic research, personal study, 12// teaching, education and corporate research & development. 13// Illustrative examples of commercial use are distributing products for 14// commercial advantage and providing services using the software for 15// commercial advantage. 16// 17// If you wish to use this software or functionality therein that may be 18// covered by patents for commercial use, please contact: 19// Director of Intellectual Property Licensing 20// Office of Strategy and Technology 21// Hewlett-Packard Company 22// 1501 Page Mill Road 23// Palo Alto, California 94304 24// 25// Redistributions of source code must retain the above copyright notice, 26// this list of conditions and the following disclaimer. Redistributions 27// in binary form must reproduce the above copyright notice, this list of 28// conditions and the following disclaimer in the documentation and/or 29// other materials provided with the distribution. Neither the name of 30// the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 31// contributors may be used to endorse or promote products derived from 32// this software without specific prior written permission. No right of 33// sublicense is granted herewith. Derivatives of the software and 34// output created using the software may be prepared, but only for 35// Non-Commercial Uses. Derivatives of the software may be shared with 36// others provided: (i) the others agree to abide by the list of 37// conditions herein which includes the Non-Commercial Use restrictions; 38// and (ii) such Derivatives of the software include the above copyright 39// notice to acknowledge the contribution from this software where 40// applicable, this list of conditions and the disclaimer below. 41// 42// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 43// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 44// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 45// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 46// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 47// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 48// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 49// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 50// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 51// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 52// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 53// 54// Authors: Gabe Black 55 56//////////////////////////////////////////////////////////////////// 57// 58// Base class for sparc instructions, and some support functions 59// 60 61let {{ 62 # This class will help make dealing with output a little less verbose 63 class OutputBlocks(object): 64 def __init__(self, header_output="", 65 decoder_output="", 66 decode_block="", 67 exec_output=""): 68 self.header_output = header_output 69 self.decoder_output = decoder_output 70 self.decode_block = decode_block 71 self.exec_output = exec_output 72 73 def append(self, blocks): 74 if isinstance(blocks, list) or isinstance(blocks, tuple): 75 assert(len(blocks) == 4) 76 self.header_output += blocks[0] 77 self.decoder_output += blocks[1] 78 self.decode_block += blocks[2] 79 self.exec_output += blocks[3] 80 else: 81 self.header_output += blocks.header_output 82 self.decoder_output += blocks.decoder_output 83 self.decode_block += blocks.decode_block 84 self.exec_output += blocks.exec_output 85 86 def makeList(self): 87 return (self.header_output, 88 self.decoder_output, 89 self.decode_block, 90 self.exec_output) 91}}; 92 93output header {{ 94 95 /** 96 * Base class for all X86 static instructions. 97 */ 98 class X86StaticInst : public StaticInst 99 { 100 protected: 101 // Constructor. 102 X86StaticInst(const char *mnem, 103 ExtMachInst _machInst, OpClass __opClass) 104 : StaticInst(mnem, _machInst, __opClass) 105 { 106 } 107 108 std::string generateDisassembly(Addr pc, 109 const SymbolTable *symtab) const; 110 111 void printReg(std::ostream &os, int reg) const; 112 void printSrcReg(std::ostream &os, int reg) const; 113 void printDestReg(std::ostream &os, int reg) const; 114 115 inline uint64_t merge(uint64_t into, uint64_t val, int size) const 116 { 117 //FIXME This needs to be significantly more sophisticated 118 return val; 119 } 120 121 }; 122}}; 123 124output decoder {{ 125 126 inline void printMnemonic(std::ostream &os, const char * mnemonic) 127 { 128 ccprintf(os, "\t%s ", mnemonic); 129 } 130 131 void 132 X86StaticInst::printSrcReg(std::ostream &os, int reg) const 133 { 134 if(_numSrcRegs > reg) 135 printReg(os, _srcRegIdx[reg]); 136 } 137 138 void 139 X86StaticInst::printDestReg(std::ostream &os, int reg) const 140 { 141 if(_numDestRegs > reg) 142 printReg(os, _destRegIdx[reg]); 143 } 144 145 void 146 X86StaticInst::printReg(std::ostream &os, int reg) const 147 { 148 if (reg < FP_Base_DepTag) { 149 //FIXME These should print differently depending on the 150 //mode etc, but for now this will get the point across 151 switch (reg) { 152 case INTREG_RAX: 153 ccprintf(os, "rax"); 154 break; 155 case INTREG_RBX: 156 ccprintf(os, "rbx"); 157 break; 158 case INTREG_RCX: 159 ccprintf(os, "rcx"); 160 break; 161 case INTREG_RDX: 162 ccprintf(os, "rdx"); 163 break; 164 case INTREG_RSP: 165 ccprintf(os, "rsp"); 166 break; 167 case INTREG_RBP: 168 ccprintf(os, "rbp"); 169 break; 170 case INTREG_RSI: 171 ccprintf(os, "rsi"); 172 break; 173 case INTREG_RDI: 174 ccprintf(os, "rdi"); 175 break; 176 case INTREG_R8W: 177 ccprintf(os, "r8"); 178 break; 179 case INTREG_R9W: 180 ccprintf(os, "r9"); 181 break; 182 case INTREG_R10W: 183 ccprintf(os, "r10"); 184 break; 185 case INTREG_R11W: 186 ccprintf(os, "r11"); 187 break; 188 case INTREG_R12W: 189 ccprintf(os, "r12"); 190 break; 191 case INTREG_R13W: 192 ccprintf(os, "r13"); 193 break; 194 case INTREG_R14W: 195 ccprintf(os, "r14"); 196 break; 197 case INTREG_R15W: 198 ccprintf(os, "r15"); 199 break; 200 } 201 } else if (reg < Ctrl_Base_DepTag) { 202 ccprintf(os, "%%f%d", reg - FP_Base_DepTag); 203 } else { 204 switch (reg - Ctrl_Base_DepTag) { 205 default: 206 ccprintf(os, "%%ctrl%d", reg - Ctrl_Base_DepTag); 207 } 208 } 209 } 210 211 std::string X86StaticInst::generateDisassembly(Addr pc, 212 const SymbolTable *symtab) const 213 { 214 std::stringstream ss; 215 216 printMnemonic(ss, mnemonic); 217 218 return ss.str(); 219 } 220}}; 221