1// Copyright (c) 2006 The Regents of The University of Michigan 2// All rights reserved. 3// 4// Redistribution and use in source and binary forms, with or without 5// modification, are permitted provided that the following conditions are 6// met: redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer; 8// redistributions in binary form must reproduce the above copyright --- 118 unchanged lines hidden (view full) --- 127 class SetHi : public IntOpImm 128 { 129 protected: 130 // Constructor 131 SetHi(const char *mnem, ExtMachInst _machInst, 132 OpClass __opClass) : 133 IntOpImm(mnem, _machInst, __opClass) 134 { |
135 imm = (IMM22 & 0x3FFFFF) << 10; |
136 } 137 138 std::string generateDisassembly(Addr pc, 139 const SymbolTable *symtab) const; 140 }; 141}}; 142 143def template SetHiDecode {{ --- 8 unchanged lines hidden (view full) --- 152output decoder {{ 153 154 bool IntOp::printPseudoOps(std::ostream &os, Addr pc, 155 const SymbolTable *symbab) const 156 { 157 if(!strcmp(mnemonic, "or") && _srcRegIdx[0] == 0) 158 { 159 printMnemonic(os, "mov"); |
160 printSrcReg(os, 1); |
161 ccprintf(os, ", "); |
162 printDestReg(os, 0); |
163 return true; 164 } 165 return false; 166 } 167 168 bool IntOpImm::printPseudoOps(std::ostream &os, Addr pc, 169 const SymbolTable *symbab) const 170 { 171 if(!strcmp(mnemonic, "or")) 172 { |
173 if(_numSrcRegs > 0 && _srcRegIdx[0] == 0) |
174 { 175 if(imm == 0) |
176 printMnemonic(os, "clr"); |
177 else 178 { 179 printMnemonic(os, "mov"); |
180 ccprintf(os, " 0x%x, ", imm); |
181 } |
182 printDestReg(os, 0); 183 return true; |
184 } 185 else if(imm == 0) 186 { 187 printMnemonic(os, "mov"); |
188 printSrcReg(os, 0); |
189 ccprintf(os, ", "); |
190 printDestReg(os, 0); |
191 return true; 192 } 193 } 194 return false; 195 } 196 197 std::string IntOp::generateDisassembly(Addr pc, 198 const SymbolTable *symtab) const 199 { 200 std::stringstream response; 201 |
202 if(printPseudoOps(response, pc, symtab)) 203 return response.str(); 204 printMnemonic(response, mnemonic); 205 printRegArray(response, _srcRegIdx, _numSrcRegs); 206 if(_numDestRegs && _numSrcRegs) 207 response << ", "; 208 printDestReg(response, 0); |
209 return response.str(); 210 } 211 212 std::string IntOpImm::generateDisassembly(Addr pc, 213 const SymbolTable *symtab) const 214 { 215 std::stringstream response; 216 |
217 if(printPseudoOps(response, pc, symtab)) 218 return response.str(); 219 printMnemonic(response, mnemonic); 220 printRegArray(response, _srcRegIdx, _numSrcRegs); 221 if(_numSrcRegs > 0) 222 response << ", "; 223 ccprintf(response, "0x%x", imm); 224 if(_numDestRegs > 0) 225 response << ", "; 226 printDestReg(response, 0); |
227 return response.str(); 228 } 229 230 std::string SetHi::generateDisassembly(Addr pc, 231 const SymbolTable *symtab) const 232 { 233 std::stringstream response; 234 235 printMnemonic(response, mnemonic); |
236 ccprintf(response, "%%hi(0x%x), ", imm); |
237 printDestReg(response, 0); |
238 return response.str(); 239 } 240}}; 241 242def template IntOpExecute {{ 243 Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 244 Trace::InstRecord *traceData) const 245 { --- 29 unchanged lines hidden (view full) --- 275 decoder_output += BasicConstructor.subst(imm_iop) 276 exec_output += IntOpExecute.subst(imm_iop) 277 decode_block = ROrImmDecode.subst(iop) 278 else: 279 decode_block = BasicDecode.subst(iop) 280 return (header_output, decoder_output, exec_output, decode_block) 281 282 calcCcCode = ''' |
283 uint16_t _ic, _iv, _iz, _in, _xc, _xv, _xz, _xn; |
284 |
285 _in = (Rd >> 31) & 1; 286 _iz = ((Rd & 0xFFFFFFFF) == 0); 287 _xn = (Rd >> 63) & 1; 288 _xz = (Rd == 0); 289 _iv = %(ivValue)s & 1; 290 _ic = %(icValue)s & 1; 291 _xv = %(xvValue)s & 1; 292 _xc = %(xcValue)s & 1; |
293 |
294 Ccr = _ic << 0 | _iv << 1 | _iz << 2 | _in << 3 | 295 _xc << 4 | _xv << 5 | _xz << 6 | _xn << 7; |
296 297 |
298 DPRINTF(Sparc, "in = %%d\\n", _in); 299 DPRINTF(Sparc, "iz = %%d\\n", _iz); 300 DPRINTF(Sparc, "xn = %%d\\n", _xn); 301 DPRINTF(Sparc, "xz = %%d\\n", _xz); 302 DPRINTF(Sparc, "iv = %%d\\n", _iv); 303 DPRINTF(Sparc, "ic = %%d\\n", _ic); 304 DPRINTF(Sparc, "xv = %%d\\n", _xv); 305 DPRINTF(Sparc, "xc = %%d\\n", _xc); |
306 ''' 307}}; 308 309// Primary format for integer operate instructions: 310def format IntOp(code, *opt_flags) {{ 311 ccCode = '' 312 (header_output, 313 decoder_output, --- 37 unchanged lines hidden --- |