1// -*- mode:c++ -*- 2 3// Copyright (c) 2007 The Hewlett-Packard Development Company 4// All rights reserved. 5// 6// Redistribution and use of this software in source and binary forms, 7// with or without modification, are permitted provided that the 8// following conditions are met: --- 57 unchanged lines hidden (view full) --- 66 { 67 panic("Tried to execute macroop directly!"); 68 return NoFault; 69 } 70}}; 71 72output header {{ 73 |
74 // Base class for combinationally generated macroops |
75 class MacroOp : public StaticInst 76 { 77 protected: 78 const uint32_t numMicroOps; 79 80 //Constructor. 81 MacroOp(const char *mnem, ExtMachInst _machInst, 82 uint32_t _numMicroOps) --- 25 unchanged lines hidden (view full) --- 108 } 109 110 %(MacroExecPanic)s 111 }; 112}}; 113 114// Basic instruction class declaration template. 115def template MacroDeclare {{ |
116 namespace X86Microop |
117 { |
118 /** 119 * Static instruction class for "%(mnemonic)s". 120 */ 121 class %(class_name)s : public %(base_class)s 122 { 123 public: 124 // Constructor. 125 %(class_name)s(ExtMachInst machInst); 126 }; |
127 }; 128}}; 129 130// Basic instruction class constructor template. 131def template MacroConstructor {{ 132 inline %(class_name)s::%(class_name)s(ExtMachInst machInst) 133 : %(base_class)s("%(mnemonic)s", machInst, %(num_micro_ops)s) 134 { --- 5 unchanged lines hidden (view full) --- 140}}; 141 142////////////////////////////////////////////////////////////////////////////// 143// 144// X86 specific 145// 146 147let {{ |
148 from micro_asm import Combinational_Macroop, Rom_Macroop 149 class X86Macroop(Combinational_Macroop): 150 def __init__(self, name): 151 super(X86Macroop, self).__init__(name) 152 self.directives = { 153 } 154 self.declared = False 155 def getAllocator(self, env): 156 return "new X86Macroop::%s(machInst)" % self.name 157 def getDeclaration(self): 158 #FIXME This first parameter should be the mnemonic. I need to 159 #write some code which pulls that out 160 iop = InstObjParams(self.name, self.name, "Macroop", {"code" : ""}) 161 return MacroDeclare.subst(iop); 162 def getDefinition(self): 163 #FIXME This first parameter should be the mnemonic. I need to 164 #write some code which pulls that out 165 numMicroops = len(self.microops) 166 allocMicroops = '' 167 micropc = 0 168 for op in self.microops: 169 allocMicroops += \ 170 "microOps[%d] = %s;\n" % \ 171 (micropc, op.getAllocator(True, False, 172 micropc == 0, 173 micropc == numMicroops - 1)) 174 micropc += 1 175 iop = InstObjParams(self.name, self.name, "Macroop", 176 {"code" : "", "num_micro_ops" : numMicroops, 177 "alloc_micro_ops" : allocMicroops}) 178 return MacroConstructor.subst(iop); |
179}}; |
180 181output header {{ 182 struct EmulEnv 183 { 184 X86ISA::RegIndex reg; 185 X86ISA::RegIndex regm; 186 uint64_t immediate; 187 uint64_t displacement; 188 int addressSize; 189 int dataSize; 190 191 EmulEnv(X86ISA::RegIndex _reg, X86ISA::RegIndex _regm, 192 uint64_t _immediate, uint64_t _displacement, 193 int _addressSize, int _dataSize) : 194 reg(_reg), regm(_regm), 195 immediate(_immediate), displacement(_displacement), 196 addressSize(_addressSize), dataSize(_dataSize) 197 {;} 198 }; 199}}; 200 201let {{ 202 class EmulEnv(object): 203 def __init__(self): 204 self.reg = "Not specified" 205 self.regm = "Not specified" 206 self.immediate = "IMMEDIATE" 207 self.displacement = "DISPLACEMENT" 208 self.addressSize = "ADDRSIZE" 209 self.dataSize = "OPSIZE" 210 def getAllocator(self): 211 return "EmulEmv(%(reg)s, %(regm)s, %(immediate)s, %(displacement)s, %(addressSize)s, %(dataSize)s)" % \ 212 self.__dict__() 213}}; 214 215let {{ 216 def genMacroop(Name, env): 217 if not macroopDict.has_key(Name): 218 raise Exception, "Unrecognized instruction: %s" % Name 219 macroop = macroopDict[Name] 220 if not macroop.declared: 221 global header_output 222 global decoder_output 223 header_output = macroop.getDeclaration() 224 decoder_output = macroop.getDefinition() 225 return "return %s;\n" % macroop.getAllocator(env) 226}}; |