basic.isa (7741:340b6f01d69b) | basic.isa (8621:2a6d9a7197fe) |
---|---|
1// Copyright (c) 2006-2007 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 --- 19 unchanged lines hidden (view full) --- 28// Gabe Black 29// Steve Reinhardt 30 31// Declarations for execute() methods. 32def template BasicExecDeclare {{ 33 Fault execute(%(CPU_exec_context)s *, Trace::InstRecord *) const; 34}}; 35 | 1// Copyright (c) 2006-2007 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 --- 19 unchanged lines hidden (view full) --- 28// Gabe Black 29// Steve Reinhardt 30 31// Declarations for execute() methods. 32def template BasicExecDeclare {{ 33 Fault execute(%(CPU_exec_context)s *, Trace::InstRecord *) const; 34}}; 35 |
36def template DoFpOpDeclare {{ 37 Fault doFpOp(%(CPU_exec_context)s *, Trace::InstRecord *) 38 const M5_NO_INLINE; 39}}; 40 |
|
36// Definitions of execute methods that panic. 37def template BasicExecPanic {{ 38 Fault 39 execute(%(CPU_exec_context)s *, Trace::InstRecord *) const 40 { 41 panic("Execute method called when it shouldn't!"); 42 M5_DUMMY_RETURN 43 } --- 9 unchanged lines hidden (view full) --- 53 public: 54 // Constructor. 55 %(class_name)s(ExtMachInst machInst); 56 %(BasicExecDeclare)s 57 }; 58}}; 59 60// Basic instruction class declaration template. | 41// Definitions of execute methods that panic. 42def template BasicExecPanic {{ 43 Fault 44 execute(%(CPU_exec_context)s *, Trace::InstRecord *) const 45 { 46 panic("Execute method called when it shouldn't!"); 47 M5_DUMMY_RETURN 48 } --- 9 unchanged lines hidden (view full) --- 58 public: 59 // Constructor. 60 %(class_name)s(ExtMachInst machInst); 61 %(BasicExecDeclare)s 62 }; 63}}; 64 65// Basic instruction class declaration template. |
66def template FpBasicDeclare {{ 67 /** 68 * Static instruction class for "%(mnemonic)s". 69 */ 70 class %(class_name)s : public %(base_class)s 71 { 72 public: 73 // Constructor. 74 %(class_name)s(ExtMachInst machInst); 75 %(BasicExecDeclare)s 76 %(DoFpOpDeclare)s 77 }; 78}}; 79 80// Basic instruction class declaration template. |
|
61def template BasicDeclareWithMnemonic {{ 62 /** 63 * Static instruction class for "%(mnemonic)s". 64 */ 65 class %(class_name)s : public %(base_class)s 66 { 67 public: 68 // Constructor. --- 36 unchanged lines hidden (view full) --- 105 106 if (fault == NoFault) { 107 %(op_wb)s; 108 } 109 return fault; 110 } 111}}; 112 | 81def template BasicDeclareWithMnemonic {{ 82 /** 83 * Static instruction class for "%(mnemonic)s". 84 */ 85 class %(class_name)s : public %(base_class)s 86 { 87 public: 88 // Constructor. --- 36 unchanged lines hidden (view full) --- 125 126 if (fault == NoFault) { 127 %(op_wb)s; 128 } 129 return fault; 130 } 131}}; 132 |
133def template DoFpOpExecute {{ 134 Fault 135 %(class_name)s::doFpOp(%(CPU_exec_context)s *xc, 136 Trace::InstRecord *traceData) const 137 { 138 Fault fault = NoFault; 139 %(op_decl)s; 140 %(op_rd)s; 141 %(fp_code)s; 142 if (fault == NoFault) { 143 %(op_wb)s; 144 } 145 return fault; 146 } 147}}; 148 |
|
113// Basic decode template. 114def template BasicDecode {{ 115 return new %(class_name)s(machInst); 116}}; 117 118// Basic decode template, passing mnemonic in as string arg to constructor. 119def template BasicDecodeWithMnemonic {{ 120 return new %(class_name)s("%(mnemonic)s", machInst); --- 5 unchanged lines hidden (view full) --- 126 iop = InstObjParams(name, Name, 'SparcStaticInst', code, flags) 127 header_output = BasicDeclare.subst(iop) 128 decoder_output = BasicConstructor.subst(iop) 129 decode_block = BasicDecode.subst(iop) 130 exec_output = BasicExecute.subst(iop) 131}}; 132 133def format FpBasic(code, *flags) {{ | 149// Basic decode template. 150def template BasicDecode {{ 151 return new %(class_name)s(machInst); 152}}; 153 154// Basic decode template, passing mnemonic in as string arg to constructor. 155def template BasicDecodeWithMnemonic {{ 156 return new %(class_name)s("%(mnemonic)s", machInst); --- 5 unchanged lines hidden (view full) --- 162 iop = InstObjParams(name, Name, 'SparcStaticInst', code, flags) 163 header_output = BasicDeclare.subst(iop) 164 decoder_output = BasicConstructor.subst(iop) 165 decode_block = BasicDecode.subst(iop) 166 exec_output = BasicExecute.subst(iop) 167}}; 168 169def format FpBasic(code, *flags) {{ |
134 fp_code = """ | 170 exec_code = """ |
135 Fsr |= bits(Fsr,4,0) << 5; | 171 Fsr |= bits(Fsr,4,0) << 5; |
136 Fsr = insertBits(Fsr,4,0,0); | 172 Fsr = insertBits(Fsr, 4, 0, 0); |
137 int newrnd = M5_FE_TONEAREST; 138 switch (Fsr<31:30>) { 139 case 0: newrnd = M5_FE_TONEAREST; break; 140 case 1: newrnd = M5_FE_TOWARDZERO; break; 141 case 2: newrnd = M5_FE_UPWARD; break; 142 case 3: newrnd = M5_FE_DOWNWARD; break; 143 } 144 int oldrnd = m5_fegetround(); 145 m5_fesetround(newrnd); | 173 int newrnd = M5_FE_TONEAREST; 174 switch (Fsr<31:30>) { 175 case 0: newrnd = M5_FE_TONEAREST; break; 176 case 1: newrnd = M5_FE_TOWARDZERO; break; 177 case 2: newrnd = M5_FE_UPWARD; break; 178 case 3: newrnd = M5_FE_DOWNWARD; break; 179 } 180 int oldrnd = m5_fegetround(); 181 m5_fesetround(newrnd); |
182 __asm__ __volatile__("" ::: "memory"); 183 fault = doFpOp(xc, traceData); 184 __asm__ __volatile__("" ::: "memory"); 185 m5_fesetround(oldrnd); 186 return fault; |
|
146""" | 187""" |
147 148 fp_code += code 149 150 151 fp_code += """ 152 m5_fesetround(oldrnd); 153""" 154 fp_code = filterDoubles(fp_code) 155 iop = InstObjParams(name, Name, 'SparcStaticInst', fp_code, flags) 156 header_output = BasicDeclare.subst(iop) 157 decoder_output = BasicConstructor.subst(iop) 158 decode_block = BasicDecode.subst(iop) 159 exec_output = BasicExecute.subst(iop) | 188 fp_code = filterDoubles(code) 189 iop = InstObjParams(name, Name, 'SparcStaticInst', 190 { "code" : exec_code, "fp_code" : fp_code }, flags) 191 header_output = FpBasicDeclare.subst(iop) 192 decoder_output = BasicConstructor.subst(iop) 193 decode_block = BasicDecode.subst(iop) 194 exec_output = BasicExecute.subst(iop) 195 exec_output += DoFpOpExecute.subst(iop) |
160}}; | 196}}; |