1// -*- mode: c++ -*- 2 3// Copyright (c) 2012-2013 ARM Limited 4// All rights reserved 5// 6// The license below extends only to copyright in the software and shall 7// not be construed as granting a license to any other intellectual 8// property including but not limited to intellectual property relating 9// to a hardware implementation of the functionality of the software 10// licensed hereunder. You may use the software subject to the license 11// terms below provided that you ensure that this notice is replicated 12// unmodified and in its entirety in all distributions of the software, 13// modified or unmodified, in source code or in binary form. 14// 15// Redistribution and use in source and binary forms, with or without 16// modification, are permitted provided that the following conditions are 17// met: redistributions of source code must retain the above copyright 18// notice, this list of conditions and the following disclaimer; 19// redistributions in binary form must reproduce the above copyright 20// notice, this list of conditions and the following disclaimer in the 21// documentation and/or other materials provided with the distribution; 22// neither the name of the copyright holders nor the names of its 23// contributors may be used to endorse or promote products derived from 24// this software without specific prior written permission. 25// 26// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 27// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 28// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 29// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 30// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 31// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 32// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 33// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 34// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 35// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 36// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37// 38// Authors: Mbou Eyole 39// Giacomo Gabrielli 40 41let {{ 42 simd64EnabledCheckCode = vfp64EnabledCheckCode 43}}; 44 45def template NeonX2RegOpDeclare {{ 46template <class _Element> 47class %(class_name)s : public %(base_class)s 48{ 49 protected: 50 typedef _Element Element; 51 public: 52 // Constructor 53 %(class_name)s(ExtMachInst machInst, 54 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2) 55 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 56 _dest, _op1, _op2) 57 { 58 %(constructor)s; 59 } 60
| 1// -*- mode: c++ -*- 2 3// Copyright (c) 2012-2013 ARM Limited 4// All rights reserved 5// 6// The license below extends only to copyright in the software and shall 7// not be construed as granting a license to any other intellectual 8// property including but not limited to intellectual property relating 9// to a hardware implementation of the functionality of the software 10// licensed hereunder. You may use the software subject to the license 11// terms below provided that you ensure that this notice is replicated 12// unmodified and in its entirety in all distributions of the software, 13// modified or unmodified, in source code or in binary form. 14// 15// Redistribution and use in source and binary forms, with or without 16// modification, are permitted provided that the following conditions are 17// met: redistributions of source code must retain the above copyright 18// notice, this list of conditions and the following disclaimer; 19// redistributions in binary form must reproduce the above copyright 20// notice, this list of conditions and the following disclaimer in the 21// documentation and/or other materials provided with the distribution; 22// neither the name of the copyright holders nor the names of its 23// contributors may be used to endorse or promote products derived from 24// this software without specific prior written permission. 25// 26// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 27// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 28// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 29// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 30// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 31// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 32// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 33// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 34// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 35// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 36// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37// 38// Authors: Mbou Eyole 39// Giacomo Gabrielli 40 41let {{ 42 simd64EnabledCheckCode = vfp64EnabledCheckCode 43}}; 44 45def template NeonX2RegOpDeclare {{ 46template <class _Element> 47class %(class_name)s : public %(base_class)s 48{ 49 protected: 50 typedef _Element Element; 51 public: 52 // Constructor 53 %(class_name)s(ExtMachInst machInst, 54 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2) 55 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 56 _dest, _op1, _op2) 57 { 58 %(constructor)s; 59 } 60
|
61 Fault execute(ExecContext *, Trace::InstRecord *) const;
| 61 Fault execute(ExecContext *, Trace::InstRecord *) const override;
|
62}; 63}}; 64 65def template NeonX2RegImmOpDeclare {{ 66template <class _Element> 67class %(class_name)s : public %(base_class)s 68{ 69 protected: 70 typedef _Element Element; 71 public: 72 // Constructor 73 %(class_name)s(ExtMachInst machInst, 74 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2, 75 uint64_t _imm) 76 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 77 _dest, _op1, _op2, _imm) 78 { 79 %(constructor)s; 80 } 81
| 62}; 63}}; 64 65def template NeonX2RegImmOpDeclare {{ 66template <class _Element> 67class %(class_name)s : public %(base_class)s 68{ 69 protected: 70 typedef _Element Element; 71 public: 72 // Constructor 73 %(class_name)s(ExtMachInst machInst, 74 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2, 75 uint64_t _imm) 76 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 77 _dest, _op1, _op2, _imm) 78 { 79 %(constructor)s; 80 } 81
|
82 Fault execute(ExecContext *, Trace::InstRecord *) const;
| 82 Fault execute(ExecContext *, Trace::InstRecord *) const override;
|
83}; 84}}; 85 86def template NeonX1RegOpDeclare {{ 87template <class _Element> 88class %(class_name)s : public %(base_class)s 89{ 90 protected: 91 typedef _Element Element; 92 public: 93 // Constructor 94 %(class_name)s(ExtMachInst machInst, 95 IntRegIndex _dest, IntRegIndex _op1) 96 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 97 _dest, _op1) 98 { 99 %(constructor)s; 100 } 101
| 83}; 84}}; 85 86def template NeonX1RegOpDeclare {{ 87template <class _Element> 88class %(class_name)s : public %(base_class)s 89{ 90 protected: 91 typedef _Element Element; 92 public: 93 // Constructor 94 %(class_name)s(ExtMachInst machInst, 95 IntRegIndex _dest, IntRegIndex _op1) 96 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 97 _dest, _op1) 98 { 99 %(constructor)s; 100 } 101
|
102 Fault execute(ExecContext *, Trace::InstRecord *) const;
| 102 Fault execute(ExecContext *, Trace::InstRecord *) const override;
|
103}; 104}}; 105 106def template NeonX1RegImmOpDeclare {{ 107template <class _Element> 108class %(class_name)s : public %(base_class)s 109{ 110 protected: 111 typedef _Element Element; 112 public: 113 // Constructor 114 %(class_name)s(ExtMachInst machInst, 115 IntRegIndex _dest, IntRegIndex _op1, uint64_t _imm) 116 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 117 _dest, _op1, _imm) 118 { 119 %(constructor)s; 120 } 121
| 103}; 104}}; 105 106def template NeonX1RegImmOpDeclare {{ 107template <class _Element> 108class %(class_name)s : public %(base_class)s 109{ 110 protected: 111 typedef _Element Element; 112 public: 113 // Constructor 114 %(class_name)s(ExtMachInst machInst, 115 IntRegIndex _dest, IntRegIndex _op1, uint64_t _imm) 116 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 117 _dest, _op1, _imm) 118 { 119 %(constructor)s; 120 } 121
|
122 Fault execute(ExecContext *, Trace::InstRecord *) const;
| 122 Fault execute(ExecContext *, Trace::InstRecord *) const override;
|
123}; 124}}; 125 126def template NeonX1Reg2ImmOpDeclare {{ 127template <class _Element> 128class %(class_name)s : public %(base_class)s 129{ 130 protected: 131 typedef _Element Element; 132 public: 133 // Constructor 134 %(class_name)s(ExtMachInst machInst, 135 IntRegIndex _dest, IntRegIndex _op1, uint64_t _imm1, 136 uint64_t _imm2) 137 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 138 _dest, _op1, _imm1, _imm2) 139 { 140 %(constructor)s; 141 } 142
| 123}; 124}}; 125 126def template NeonX1Reg2ImmOpDeclare {{ 127template <class _Element> 128class %(class_name)s : public %(base_class)s 129{ 130 protected: 131 typedef _Element Element; 132 public: 133 // Constructor 134 %(class_name)s(ExtMachInst machInst, 135 IntRegIndex _dest, IntRegIndex _op1, uint64_t _imm1, 136 uint64_t _imm2) 137 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 138 _dest, _op1, _imm1, _imm2) 139 { 140 %(constructor)s; 141 } 142
|
143 Fault execute(ExecContext *, Trace::InstRecord *) const;
| 143 Fault execute(ExecContext *, Trace::InstRecord *) const override;
|
144}; 145}}; 146 147def template NeonX1RegImmOnlyOpDeclare {{ 148template <class _Element> 149class %(class_name)s : public %(base_class)s 150{ 151 protected: 152 typedef _Element Element; 153 public: 154 // Constructor 155 %(class_name)s(ExtMachInst machInst, 156 IntRegIndex _dest, uint64_t _imm) 157 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 158 _dest, _imm) 159 { 160 %(constructor)s; 161 } 162
| 144}; 145}}; 146 147def template NeonX1RegImmOnlyOpDeclare {{ 148template <class _Element> 149class %(class_name)s : public %(base_class)s 150{ 151 protected: 152 typedef _Element Element; 153 public: 154 // Constructor 155 %(class_name)s(ExtMachInst machInst, 156 IntRegIndex _dest, uint64_t _imm) 157 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 158 _dest, _imm) 159 { 160 %(constructor)s; 161 } 162
|
163 Fault execute(ExecContext *, Trace::InstRecord *) const;
| 163 Fault execute(ExecContext *, Trace::InstRecord *) const override;
|
164}; 165}}; 166 167def template NeonXExecDeclare {{ 168 template 169 Fault %(class_name)s<%(targs)s>::execute( 170 ExecContext *, Trace::InstRecord *) const; 171}}; 172 173def template NeonXEqualRegOpExecute {{ 174 template <class Element> 175 Fault %(class_name)s<Element>::execute(ExecContext *xc, 176 Trace::InstRecord *traceData) const 177 { 178 Fault fault = NoFault; 179 %(op_decl)s; 180 %(op_rd)s; 181 182 const unsigned rCount = %(r_count)d; 183 const unsigned eCount = rCount * sizeof(FloatRegBits) / sizeof(Element); 184 const unsigned eCountFull = 4 * sizeof(FloatRegBits) / sizeof(Element); 185 186 union RegVect { 187 FloatRegBits regs[rCount]; 188 Element elements[eCount]; 189 }; 190 191 union FullRegVect { 192 FloatRegBits regs[4]; 193 Element elements[eCountFull]; 194 }; 195 196 %(code)s; 197 if (fault == NoFault) 198 { 199 %(op_wb)s; 200 } 201 202 return fault; 203 } 204}}; 205 206def template NeonXUnequalRegOpExecute {{ 207 template <class Element> 208 Fault %(class_name)s<Element>::execute(ExecContext *xc, 209 Trace::InstRecord *traceData) const 210 { 211 typedef typename bigger_type_t<Element>::type BigElement; 212 Fault fault = NoFault; 213 %(op_decl)s; 214 %(op_rd)s; 215 216 const unsigned rCount = %(r_count)d; 217 const unsigned eCount = rCount * sizeof(FloatRegBits) / sizeof(Element); 218 const unsigned eCountFull = 4 * sizeof(FloatRegBits) / sizeof(Element); 219 220 union RegVect { 221 FloatRegBits regs[rCount]; 222 Element elements[eCount]; 223 BigElement bigElements[eCount / 2]; 224 }; 225 226 union BigRegVect { 227 FloatRegBits regs[2 * rCount]; 228 BigElement elements[eCount]; 229 }; 230 231 union FullRegVect { 232 FloatRegBits regs[4]; 233 Element elements[eCountFull]; 234 }; 235 236 %(code)s; 237 if (fault == NoFault) 238 { 239 %(op_wb)s; 240 } 241 242 return fault; 243 } 244}}; 245 246def template MicroNeonMemDeclare64 {{ 247 class %(class_name)s : public %(base_class)s 248 { 249 protected: 250 // True if the base register is SP (used for SP alignment checking) 251 bool baseIsSP; 252 // Access size in bytes 253 uint8_t accSize; 254 // Vector element size (0 -> 8-bit, 1 -> 16-bit, 2 -> 32-bit, 255 // 3 -> 64-bit) 256 uint8_t eSize; 257 258 public: 259 %(class_name)s(ExtMachInst machInst, RegIndex _dest, RegIndex _ura, 260 uint32_t _imm, unsigned extraMemFlags, bool _baseIsSP, 261 uint8_t _accSize, uint8_t _eSize) 262 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, 263 _ura, _imm), 264 baseIsSP(_baseIsSP), accSize(_accSize), eSize(_eSize) 265 { 266 memAccessFlags |= extraMemFlags; 267 %(constructor)s; 268 } 269
| 164}; 165}}; 166 167def template NeonXExecDeclare {{ 168 template 169 Fault %(class_name)s<%(targs)s>::execute( 170 ExecContext *, Trace::InstRecord *) const; 171}}; 172 173def template NeonXEqualRegOpExecute {{ 174 template <class Element> 175 Fault %(class_name)s<Element>::execute(ExecContext *xc, 176 Trace::InstRecord *traceData) const 177 { 178 Fault fault = NoFault; 179 %(op_decl)s; 180 %(op_rd)s; 181 182 const unsigned rCount = %(r_count)d; 183 const unsigned eCount = rCount * sizeof(FloatRegBits) / sizeof(Element); 184 const unsigned eCountFull = 4 * sizeof(FloatRegBits) / sizeof(Element); 185 186 union RegVect { 187 FloatRegBits regs[rCount]; 188 Element elements[eCount]; 189 }; 190 191 union FullRegVect { 192 FloatRegBits regs[4]; 193 Element elements[eCountFull]; 194 }; 195 196 %(code)s; 197 if (fault == NoFault) 198 { 199 %(op_wb)s; 200 } 201 202 return fault; 203 } 204}}; 205 206def template NeonXUnequalRegOpExecute {{ 207 template <class Element> 208 Fault %(class_name)s<Element>::execute(ExecContext *xc, 209 Trace::InstRecord *traceData) const 210 { 211 typedef typename bigger_type_t<Element>::type BigElement; 212 Fault fault = NoFault; 213 %(op_decl)s; 214 %(op_rd)s; 215 216 const unsigned rCount = %(r_count)d; 217 const unsigned eCount = rCount * sizeof(FloatRegBits) / sizeof(Element); 218 const unsigned eCountFull = 4 * sizeof(FloatRegBits) / sizeof(Element); 219 220 union RegVect { 221 FloatRegBits regs[rCount]; 222 Element elements[eCount]; 223 BigElement bigElements[eCount / 2]; 224 }; 225 226 union BigRegVect { 227 FloatRegBits regs[2 * rCount]; 228 BigElement elements[eCount]; 229 }; 230 231 union FullRegVect { 232 FloatRegBits regs[4]; 233 Element elements[eCountFull]; 234 }; 235 236 %(code)s; 237 if (fault == NoFault) 238 { 239 %(op_wb)s; 240 } 241 242 return fault; 243 } 244}}; 245 246def template MicroNeonMemDeclare64 {{ 247 class %(class_name)s : public %(base_class)s 248 { 249 protected: 250 // True if the base register is SP (used for SP alignment checking) 251 bool baseIsSP; 252 // Access size in bytes 253 uint8_t accSize; 254 // Vector element size (0 -> 8-bit, 1 -> 16-bit, 2 -> 32-bit, 255 // 3 -> 64-bit) 256 uint8_t eSize; 257 258 public: 259 %(class_name)s(ExtMachInst machInst, RegIndex _dest, RegIndex _ura, 260 uint32_t _imm, unsigned extraMemFlags, bool _baseIsSP, 261 uint8_t _accSize, uint8_t _eSize) 262 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, 263 _ura, _imm), 264 baseIsSP(_baseIsSP), accSize(_accSize), eSize(_eSize) 265 { 266 memAccessFlags |= extraMemFlags; 267 %(constructor)s; 268 } 269
|
270 Fault execute(ExecContext *, Trace::InstRecord *) const; 271 Fault initiateAcc(ExecContext *, Trace::InstRecord *) const; 272 Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const;
| 270 Fault execute(ExecContext *, Trace::InstRecord *) const override; 271 Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override; 272 Fault completeAcc(PacketPtr, ExecContext *, 273 Trace::InstRecord *) const override;
|
273 }; 274}}; 275 276def template NeonLoadExecute64 {{ 277 Fault %(class_name)s::execute( 278 ExecContext *xc, Trace::InstRecord *traceData) const 279 { 280 Addr EA; 281 Fault fault = NoFault; 282 283 %(op_decl)s; 284 %(mem_decl)s; 285 %(op_rd)s; 286 %(ea_code)s; 287 288 MemUnion memUnion; 289 uint8_t *dataPtr = memUnion.bytes; 290 291 if (fault == NoFault) { 292 fault = xc->readMem(EA, dataPtr, accSize, memAccessFlags); 293 %(memacc_code)s; 294 } 295 296 if (fault == NoFault) { 297 %(op_wb)s; 298 } 299 300 return fault; 301 } 302}}; 303 304def template NeonLoadInitiateAcc64 {{ 305 Fault %(class_name)s::initiateAcc( 306 ExecContext *xc, Trace::InstRecord *traceData) const 307 { 308 Addr EA; 309 Fault fault = NoFault; 310 311 %(op_decl)s; 312 %(mem_decl)s; 313 %(op_rd)s; 314 %(ea_code)s; 315 316 if (fault == NoFault) { 317 fault = xc->initiateMemRead(EA, accSize, memAccessFlags); 318 } 319 320 return fault; 321 } 322}}; 323 324def template NeonLoadCompleteAcc64 {{ 325 Fault %(class_name)s::completeAcc( 326 PacketPtr pkt, ExecContext *xc, Trace::InstRecord *traceData) const 327 { 328 Fault fault = NoFault; 329 330 %(mem_decl)s; 331 %(op_decl)s; 332 %(op_rd)s; 333 334 MemUnion memUnion { { } }; 335 memcpy(&memUnion, pkt->getPtr<uint8_t>(), pkt->getSize()); 336 337 if (fault == NoFault) { 338 %(memacc_code)s; 339 } 340 341 if (fault == NoFault) { 342 %(op_wb)s; 343 } 344 345 return fault; 346 } 347}}; 348 349def template NeonStoreExecute64 {{ 350 Fault %(class_name)s::execute( 351 ExecContext *xc, Trace::InstRecord *traceData) const 352 { 353 Addr EA; 354 Fault fault = NoFault; 355 356 %(op_decl)s; 357 %(mem_decl)s; 358 %(op_rd)s; 359 %(ea_code)s; 360 361 MemUnion memUnion; 362 uint8_t *dataPtr = memUnion.bytes; 363 364 if (fault == NoFault) { 365 %(memacc_code)s; 366 } 367 368 if (fault == NoFault) { 369 fault = xc->writeMem(dataPtr, accSize, EA, memAccessFlags, 370 NULL); 371 } 372 373 if (fault == NoFault) { 374 %(op_wb)s; 375 } 376 377 return fault; 378 } 379}}; 380 381def template NeonStoreInitiateAcc64 {{ 382 Fault %(class_name)s::initiateAcc( 383 ExecContext *xc, Trace::InstRecord *traceData) const 384 { 385 Addr EA; 386 Fault fault = NoFault; 387 388 %(op_decl)s; 389 %(mem_decl)s; 390 %(op_rd)s; 391 %(ea_code)s; 392 393 MemUnion memUnion; 394 if (fault == NoFault) { 395 %(memacc_code)s; 396 } 397 398 if (fault == NoFault) { 399 fault = xc->writeMem(memUnion.bytes, accSize, EA, memAccessFlags, 400 NULL); 401 } 402 403 return fault; 404 } 405}}; 406 407def template NeonStoreCompleteAcc64 {{ 408 Fault %(class_name)s::completeAcc( 409 PacketPtr pkt, ExecContext *xc, Trace::InstRecord *traceData) const 410 { 411 return NoFault; 412 } 413}}; 414 415def template VMemMultDeclare64 {{ 416 class %(class_name)s : public %(base_class)s 417 { 418 public: 419 // Constructor 420 %(class_name)s(ExtMachInst machInst, RegIndex rn, RegIndex vd, 421 RegIndex rm, uint8_t eSize, uint8_t dataSize, 422 uint8_t numStructElems, uint8_t numRegs, bool wb); 423 }; 424}}; 425 426def template VMemSingleDeclare64 {{ 427 class %(class_name)s : public %(base_class)s 428 { 429 public: 430 // Constructor 431 %(class_name)s(ExtMachInst machInst, RegIndex rn, RegIndex vd, 432 RegIndex rm, uint8_t eSize, uint8_t dataSize, 433 uint8_t numStructElems, uint8_t index, bool wb, 434 bool replicate = false); 435 }; 436}}; 437 438def template VMemMultConstructor64 {{ 439 %(class_name)s::%(class_name)s( 440 ExtMachInst machInst, RegIndex rn, RegIndex vd, RegIndex rm, 441 uint8_t _eSize, uint8_t _dataSize, uint8_t _numStructElems, 442 uint8_t _numRegs, bool _wb) : 443 %(base_class)s( 444 "%(mnemonic)s", machInst, %(op_class)s, rn, vd, rm, 445 _eSize, _dataSize, _numStructElems, _numRegs, _wb) 446 { 447 %(constructor)s; 448 } 449}}; 450 451def template VMemSingleConstructor64 {{ 452 %(class_name)s::%(class_name)s( 453 ExtMachInst machInst, RegIndex rn, RegIndex vd, RegIndex rm, 454 uint8_t _eSize, uint8_t _dataSize, uint8_t _numStructElems, 455 uint8_t _index, bool _wb, bool _replicate) : 456 %(base_class)s( 457 "%(mnemonic)s", machInst, %(op_class)s, rn, vd, rm, 458 _eSize, _dataSize, _numStructElems, _index, _wb, 459 _replicate) 460 { 461 %(constructor)s; 462 } 463}}; 464 465def template MicroNeonMixDeclare64 {{ 466 class %(class_name)s : public %(base_class)s 467 { 468 public: 469 %(class_name)s(ExtMachInst machInst, RegIndex _dest, RegIndex _op1, 470 uint8_t _eSize, uint8_t _dataSize, 471 uint8_t _numStructElems, uint8_t _numRegs, 472 uint8_t _step) : 473 %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 474 _dest, _op1, _eSize, _dataSize, _numStructElems, 475 _numRegs, _step) 476 { 477 %(constructor)s; 478 } 479
| 274 }; 275}}; 276 277def template NeonLoadExecute64 {{ 278 Fault %(class_name)s::execute( 279 ExecContext *xc, Trace::InstRecord *traceData) const 280 { 281 Addr EA; 282 Fault fault = NoFault; 283 284 %(op_decl)s; 285 %(mem_decl)s; 286 %(op_rd)s; 287 %(ea_code)s; 288 289 MemUnion memUnion; 290 uint8_t *dataPtr = memUnion.bytes; 291 292 if (fault == NoFault) { 293 fault = xc->readMem(EA, dataPtr, accSize, memAccessFlags); 294 %(memacc_code)s; 295 } 296 297 if (fault == NoFault) { 298 %(op_wb)s; 299 } 300 301 return fault; 302 } 303}}; 304 305def template NeonLoadInitiateAcc64 {{ 306 Fault %(class_name)s::initiateAcc( 307 ExecContext *xc, Trace::InstRecord *traceData) const 308 { 309 Addr EA; 310 Fault fault = NoFault; 311 312 %(op_decl)s; 313 %(mem_decl)s; 314 %(op_rd)s; 315 %(ea_code)s; 316 317 if (fault == NoFault) { 318 fault = xc->initiateMemRead(EA, accSize, memAccessFlags); 319 } 320 321 return fault; 322 } 323}}; 324 325def template NeonLoadCompleteAcc64 {{ 326 Fault %(class_name)s::completeAcc( 327 PacketPtr pkt, ExecContext *xc, Trace::InstRecord *traceData) const 328 { 329 Fault fault = NoFault; 330 331 %(mem_decl)s; 332 %(op_decl)s; 333 %(op_rd)s; 334 335 MemUnion memUnion { { } }; 336 memcpy(&memUnion, pkt->getPtr<uint8_t>(), pkt->getSize()); 337 338 if (fault == NoFault) { 339 %(memacc_code)s; 340 } 341 342 if (fault == NoFault) { 343 %(op_wb)s; 344 } 345 346 return fault; 347 } 348}}; 349 350def template NeonStoreExecute64 {{ 351 Fault %(class_name)s::execute( 352 ExecContext *xc, Trace::InstRecord *traceData) const 353 { 354 Addr EA; 355 Fault fault = NoFault; 356 357 %(op_decl)s; 358 %(mem_decl)s; 359 %(op_rd)s; 360 %(ea_code)s; 361 362 MemUnion memUnion; 363 uint8_t *dataPtr = memUnion.bytes; 364 365 if (fault == NoFault) { 366 %(memacc_code)s; 367 } 368 369 if (fault == NoFault) { 370 fault = xc->writeMem(dataPtr, accSize, EA, memAccessFlags, 371 NULL); 372 } 373 374 if (fault == NoFault) { 375 %(op_wb)s; 376 } 377 378 return fault; 379 } 380}}; 381 382def template NeonStoreInitiateAcc64 {{ 383 Fault %(class_name)s::initiateAcc( 384 ExecContext *xc, Trace::InstRecord *traceData) const 385 { 386 Addr EA; 387 Fault fault = NoFault; 388 389 %(op_decl)s; 390 %(mem_decl)s; 391 %(op_rd)s; 392 %(ea_code)s; 393 394 MemUnion memUnion; 395 if (fault == NoFault) { 396 %(memacc_code)s; 397 } 398 399 if (fault == NoFault) { 400 fault = xc->writeMem(memUnion.bytes, accSize, EA, memAccessFlags, 401 NULL); 402 } 403 404 return fault; 405 } 406}}; 407 408def template NeonStoreCompleteAcc64 {{ 409 Fault %(class_name)s::completeAcc( 410 PacketPtr pkt, ExecContext *xc, Trace::InstRecord *traceData) const 411 { 412 return NoFault; 413 } 414}}; 415 416def template VMemMultDeclare64 {{ 417 class %(class_name)s : public %(base_class)s 418 { 419 public: 420 // Constructor 421 %(class_name)s(ExtMachInst machInst, RegIndex rn, RegIndex vd, 422 RegIndex rm, uint8_t eSize, uint8_t dataSize, 423 uint8_t numStructElems, uint8_t numRegs, bool wb); 424 }; 425}}; 426 427def template VMemSingleDeclare64 {{ 428 class %(class_name)s : public %(base_class)s 429 { 430 public: 431 // Constructor 432 %(class_name)s(ExtMachInst machInst, RegIndex rn, RegIndex vd, 433 RegIndex rm, uint8_t eSize, uint8_t dataSize, 434 uint8_t numStructElems, uint8_t index, bool wb, 435 bool replicate = false); 436 }; 437}}; 438 439def template VMemMultConstructor64 {{ 440 %(class_name)s::%(class_name)s( 441 ExtMachInst machInst, RegIndex rn, RegIndex vd, RegIndex rm, 442 uint8_t _eSize, uint8_t _dataSize, uint8_t _numStructElems, 443 uint8_t _numRegs, bool _wb) : 444 %(base_class)s( 445 "%(mnemonic)s", machInst, %(op_class)s, rn, vd, rm, 446 _eSize, _dataSize, _numStructElems, _numRegs, _wb) 447 { 448 %(constructor)s; 449 } 450}}; 451 452def template VMemSingleConstructor64 {{ 453 %(class_name)s::%(class_name)s( 454 ExtMachInst machInst, RegIndex rn, RegIndex vd, RegIndex rm, 455 uint8_t _eSize, uint8_t _dataSize, uint8_t _numStructElems, 456 uint8_t _index, bool _wb, bool _replicate) : 457 %(base_class)s( 458 "%(mnemonic)s", machInst, %(op_class)s, rn, vd, rm, 459 _eSize, _dataSize, _numStructElems, _index, _wb, 460 _replicate) 461 { 462 %(constructor)s; 463 } 464}}; 465 466def template MicroNeonMixDeclare64 {{ 467 class %(class_name)s : public %(base_class)s 468 { 469 public: 470 %(class_name)s(ExtMachInst machInst, RegIndex _dest, RegIndex _op1, 471 uint8_t _eSize, uint8_t _dataSize, 472 uint8_t _numStructElems, uint8_t _numRegs, 473 uint8_t _step) : 474 %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 475 _dest, _op1, _eSize, _dataSize, _numStructElems, 476 _numRegs, _step) 477 { 478 %(constructor)s; 479 } 480
|
480 Fault execute(ExecContext *, Trace::InstRecord *) const;
| 481 Fault execute(ExecContext *, Trace::InstRecord *) const override;
|
481 }; 482}}; 483 484def template MicroNeonMixLaneDeclare64 {{ 485 class %(class_name)s : public %(base_class)s 486 { 487 public: 488 %(class_name)s(ExtMachInst machInst, RegIndex _dest, RegIndex _op1, 489 uint8_t _eSize, uint8_t _dataSize, 490 uint8_t _numStructElems, uint8_t _lane, uint8_t _step, 491 bool _replicate = false) : 492 %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 493 _dest, _op1, _eSize, _dataSize, _numStructElems, 494 _lane, _step, _replicate) 495 { 496 %(constructor)s; 497 } 498
| 482 }; 483}}; 484 485def template MicroNeonMixLaneDeclare64 {{ 486 class %(class_name)s : public %(base_class)s 487 { 488 public: 489 %(class_name)s(ExtMachInst machInst, RegIndex _dest, RegIndex _op1, 490 uint8_t _eSize, uint8_t _dataSize, 491 uint8_t _numStructElems, uint8_t _lane, uint8_t _step, 492 bool _replicate = false) : 493 %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 494 _dest, _op1, _eSize, _dataSize, _numStructElems, 495 _lane, _step, _replicate) 496 { 497 %(constructor)s; 498 } 499
|
499 Fault execute(ExecContext *, Trace::InstRecord *) const;
| 500 Fault execute(ExecContext *, Trace::InstRecord *) const override;
|
500 }; 501}}; 502 503def template MicroNeonMixExecute64 {{ 504 Fault %(class_name)s::execute(ExecContext *xc, 505 Trace::InstRecord *traceData) const 506 { 507 Fault fault = NoFault; 508 uint64_t resTemp = 0; 509 resTemp = resTemp; 510 %(op_decl)s; 511 %(op_rd)s; 512 513 %(code)s; 514 if (fault == NoFault) 515 { 516 %(op_wb)s; 517 } 518 519 return fault; 520 } 521}};
| 501 }; 502}}; 503 504def template MicroNeonMixExecute64 {{ 505 Fault %(class_name)s::execute(ExecContext *xc, 506 Trace::InstRecord *traceData) const 507 { 508 Fault fault = NoFault; 509 uint64_t resTemp = 0; 510 resTemp = resTemp; 511 %(op_decl)s; 512 %(op_rd)s; 513 514 %(code)s; 515 if (fault == NoFault) 516 { 517 %(op_wb)s; 518 } 519 520 return fault; 521 } 522}};
|