amo.isa (12323:55d08b81ff39) | amo.isa (12385:288c62455dde) |
---|---|
1// -*- mode:c++ -*- 2 3// Copyright (c) 2015 Riscv Developers 4// Copyright (c) 2016 The University of Virginia 5// All rights reserved. 6// 7// Redistribution and use in source and binary forms, with or without 8// modification, are permitted provided that the following conditions are --- 38 unchanged lines hidden (view full) --- 47 48 class %(class_name)sLoad : public %(base_class)sMicro 49 { 50 public: 51 // Constructor 52 %(class_name)sLoad(ExtMachInst machInst, %(class_name)s *_p); 53 54 Fault execute(ExecContext *, Trace::InstRecord *) const; | 1// -*- mode:c++ -*- 2 3// Copyright (c) 2015 Riscv Developers 4// Copyright (c) 2016 The University of Virginia 5// All rights reserved. 6// 7// Redistribution and use in source and binary forms, with or without 8// modification, are permitted provided that the following conditions are --- 38 unchanged lines hidden (view full) --- 47 48 class %(class_name)sLoad : public %(base_class)sMicro 49 { 50 public: 51 // Constructor 52 %(class_name)sLoad(ExtMachInst machInst, %(class_name)s *_p); 53 54 Fault execute(ExecContext *, Trace::InstRecord *) const; |
55 Fault eaComp(ExecContext *, Trace::InstRecord *) const; | |
56 Fault initiateAcc(ExecContext *, Trace::InstRecord *) const; 57 Fault completeAcc(PacketPtr, ExecContext *, 58 Trace::InstRecord *) const; 59 }; 60 61 class %(class_name)sStore : public %(base_class)sMicro 62 { 63 public: 64 // Constructor 65 %(class_name)sStore(ExtMachInst machInst, %(class_name)s *_p); 66 67 Fault execute(ExecContext *, Trace::InstRecord *) const; | 55 Fault initiateAcc(ExecContext *, Trace::InstRecord *) const; 56 Fault completeAcc(PacketPtr, ExecContext *, 57 Trace::InstRecord *) const; 58 }; 59 60 class %(class_name)sStore : public %(base_class)sMicro 61 { 62 public: 63 // Constructor 64 %(class_name)sStore(ExtMachInst machInst, %(class_name)s *_p); 65 66 Fault execute(ExecContext *, Trace::InstRecord *) const; |
68 Fault eaComp(ExecContext *, Trace::InstRecord *) const; | |
69 Fault initiateAcc(ExecContext *, Trace::InstRecord *) const; 70 Fault completeAcc(PacketPtr, ExecContext *, 71 Trace::InstRecord *) const; 72 }; 73 }; 74}}; 75 76def template LRSCConstructor {{ --- 130 unchanged lines hidden (view full) --- 207 if (fault == NoFault) { 208 %(op_wb)s; 209 } 210 211 return fault; 212 } 213}}; 214 | 67 Fault initiateAcc(ExecContext *, Trace::InstRecord *) const; 68 Fault completeAcc(PacketPtr, ExecContext *, 69 Trace::InstRecord *) const; 70 }; 71 }; 72}}; 73 74def template LRSCConstructor {{ --- 130 unchanged lines hidden (view full) --- 205 if (fault == NoFault) { 206 %(op_wb)s; 207 } 208 209 return fault; 210 } 211}}; 212 |
215def template AtomicMemOpEACompExecute {{ 216 Fault 217 %(class_name)s::%(class_name)s%(op_name)s::eaComp(ExecContext *xc, 218 Trace::InstRecord *traceData) const 219 { 220 Addr EA; 221 Fault fault = NoFault; 222 223 %(op_decl)s; 224 %(op_rd)s; 225 %(ea_code)s; 226 227 if (fault == NoFault) { 228 %(op_wb)s; 229 xc->setEA(EA); 230 } 231 232 return fault; 233 } 234}}; 235 | |
236def template AtomicMemOpLoadInitiateAcc {{ 237 Fault %(class_name)s::%(class_name)sLoad::initiateAcc(ExecContext *xc, 238 Trace::InstRecord *traceData) const 239 { 240 Addr EA; 241 Fault fault = NoFault; 242 243 %(op_src_decl)s; --- 100 unchanged lines hidden (view full) --- 344 'postacc_code': postacc_code}, inst_flags) 345 iop.constructor += '\n\tmemAccessFlags = memAccessFlags | ' + \ 346 '|'.join(['Request::%s' % flag for flag in mem_flags]) + ';' 347 348 header_output = LoadStoreDeclare.subst(iop) 349 decoder_output = LRSCConstructor.subst(iop) 350 decode_block = BasicDecode.subst(iop) 351 exec_output = LoadExecute.subst(iop) \ | 213def template AtomicMemOpLoadInitiateAcc {{ 214 Fault %(class_name)s::%(class_name)sLoad::initiateAcc(ExecContext *xc, 215 Trace::InstRecord *traceData) const 216 { 217 Addr EA; 218 Fault fault = NoFault; 219 220 %(op_src_decl)s; --- 100 unchanged lines hidden (view full) --- 321 'postacc_code': postacc_code}, inst_flags) 322 iop.constructor += '\n\tmemAccessFlags = memAccessFlags | ' + \ 323 '|'.join(['Request::%s' % flag for flag in mem_flags]) + ';' 324 325 header_output = LoadStoreDeclare.subst(iop) 326 decoder_output = LRSCConstructor.subst(iop) 327 decode_block = BasicDecode.subst(iop) 328 exec_output = LoadExecute.subst(iop) \ |
352 + EACompExecute.subst(iop) \ | |
353 + LoadInitiateAcc.subst(iop) \ 354 + LoadCompleteAcc.subst(iop) 355}}; 356 357def format StoreCond(memacc_code, postacc_code={{ }}, ea_code={{EA = Rs1;}}, 358 mem_flags=[], inst_flags=[]) {{ 359 mem_flags = makeList(mem_flags) 360 inst_flags = makeList(inst_flags) 361 iop = InstObjParams(name, Name, 'StoreCond', 362 {'ea_code': ea_code, 'memacc_code': memacc_code, 363 'postacc_code': postacc_code}, inst_flags) 364 iop.constructor += '\n\tmemAccessFlags = memAccessFlags | ' + \ 365 '|'.join(['Request::%s' % flag for flag in mem_flags]) + ';' 366 367 header_output = LoadStoreDeclare.subst(iop) 368 decoder_output = LRSCConstructor.subst(iop) 369 decode_block = BasicDecode.subst(iop) 370 exec_output = StoreCondExecute.subst(iop) \ | 329 + LoadInitiateAcc.subst(iop) \ 330 + LoadCompleteAcc.subst(iop) 331}}; 332 333def format StoreCond(memacc_code, postacc_code={{ }}, ea_code={{EA = Rs1;}}, 334 mem_flags=[], inst_flags=[]) {{ 335 mem_flags = makeList(mem_flags) 336 inst_flags = makeList(inst_flags) 337 iop = InstObjParams(name, Name, 'StoreCond', 338 {'ea_code': ea_code, 'memacc_code': memacc_code, 339 'postacc_code': postacc_code}, inst_flags) 340 iop.constructor += '\n\tmemAccessFlags = memAccessFlags | ' + \ 341 '|'.join(['Request::%s' % flag for flag in mem_flags]) + ';' 342 343 header_output = LoadStoreDeclare.subst(iop) 344 decoder_output = LRSCConstructor.subst(iop) 345 decode_block = BasicDecode.subst(iop) 346 exec_output = StoreCondExecute.subst(iop) \ |
371 + EACompExecute.subst(iop) \ | |
372 + StoreInitiateAcc.subst(iop) \ 373 + StoreCondCompleteAcc.subst(iop) 374}}; 375 376def format AtomicMemOp(load_code, store_code, ea_code, load_flags=[], 377 store_flags=[], inst_flags=[]) {{ 378 macro_iop = InstObjParams(name, Name, 'AtomicMemOp', ea_code, inst_flags) 379 header_output = AtomicMemOpDeclare.subst(macro_iop) 380 decoder_output = AtomicMemOpMacroConstructor.subst(macro_iop) 381 decode_block = BasicDecode.subst(macro_iop) 382 exec_output = '' 383 384 load_inst_flags = makeList(inst_flags) + ["IsMemRef", "IsLoad"] 385 load_iop = InstObjParams(name, Name, 'AtomicMemOpMicro', 386 {'ea_code': ea_code, 'code': load_code, 'op_name': 'Load'}, 387 load_inst_flags) 388 decoder_output += AtomicMemOpLoadConstructor.subst(load_iop) 389 exec_output += AtomicMemOpLoadExecute.subst(load_iop) \ | 347 + StoreInitiateAcc.subst(iop) \ 348 + StoreCondCompleteAcc.subst(iop) 349}}; 350 351def format AtomicMemOp(load_code, store_code, ea_code, load_flags=[], 352 store_flags=[], inst_flags=[]) {{ 353 macro_iop = InstObjParams(name, Name, 'AtomicMemOp', ea_code, inst_flags) 354 header_output = AtomicMemOpDeclare.subst(macro_iop) 355 decoder_output = AtomicMemOpMacroConstructor.subst(macro_iop) 356 decode_block = BasicDecode.subst(macro_iop) 357 exec_output = '' 358 359 load_inst_flags = makeList(inst_flags) + ["IsMemRef", "IsLoad"] 360 load_iop = InstObjParams(name, Name, 'AtomicMemOpMicro', 361 {'ea_code': ea_code, 'code': load_code, 'op_name': 'Load'}, 362 load_inst_flags) 363 decoder_output += AtomicMemOpLoadConstructor.subst(load_iop) 364 exec_output += AtomicMemOpLoadExecute.subst(load_iop) \ |
390 + AtomicMemOpEACompExecute.subst(load_iop) \ | |
391 + AtomicMemOpLoadInitiateAcc.subst(load_iop) \ 392 + AtomicMemOpLoadCompleteAcc.subst(load_iop) 393 394 store_inst_flags = makeList(inst_flags) + ["IsMemRef", "IsStore"] 395 store_iop = InstObjParams(name, Name, 'AtomicMemOpMicro', 396 {'ea_code': ea_code, 'code': store_code, 'op_name': 'Store'}, 397 store_inst_flags) 398 decoder_output += AtomicMemOpStoreConstructor.subst(store_iop) 399 exec_output += AtomicMemOpStoreExecute.subst(store_iop) \ | 365 + AtomicMemOpLoadInitiateAcc.subst(load_iop) \ 366 + AtomicMemOpLoadCompleteAcc.subst(load_iop) 367 368 store_inst_flags = makeList(inst_flags) + ["IsMemRef", "IsStore"] 369 store_iop = InstObjParams(name, Name, 'AtomicMemOpMicro', 370 {'ea_code': ea_code, 'code': store_code, 'op_name': 'Store'}, 371 store_inst_flags) 372 decoder_output += AtomicMemOpStoreConstructor.subst(store_iop) 373 exec_output += AtomicMemOpStoreExecute.subst(store_iop) \ |
400 + AtomicMemOpEACompExecute.subst(store_iop) \ | |
401 + AtomicMemOpStoreInitiateAcc.subst(store_iop) \ 402 + AtomicMemOpStoreCompleteAcc.subst(store_iop) 403}}; | 374 + AtomicMemOpStoreInitiateAcc.subst(store_iop) \ 375 + AtomicMemOpStoreCompleteAcc.subst(store_iop) 376}}; |