operands.isa (11514:eb53b59ea625) | operands.isa (12110:c24ee249b8ba) |
---|---|
1// -*- mode:c++ -*- | 1// -*- mode:c++ -*- |
2// Copyright (c) 2010-2014 ARM Limited | 2// Copyright (c) 2010-2014, 2016 ARM Limited |
3// All rights reserved 4// 5// The license below extends only to copyright in the software and shall 6// not be construed as granting a license to any other intellectual 7// property including but not limited to intellectual property relating 8// to a hardware implementation of the functionality of the software 9// licensed hereunder. You may use the software subject to the license 10// terms below provided that you ensure that this notice is replicated --- 33 unchanged lines hidden (view full) --- 44 'ub' : 'uint8_t', 45 'sh' : 'int16_t', 46 'uh' : 'uint16_t', 47 'sw' : 'int32_t', 48 'uw' : 'uint32_t', 49 'ud' : 'uint64_t', 50 'tud' : 'Twin64_t', 51 'sf' : 'float', | 3// All rights reserved 4// 5// The license below extends only to copyright in the software and shall 6// not be construed as granting a license to any other intellectual 7// property including but not limited to intellectual property relating 8// to a hardware implementation of the functionality of the software 9// licensed hereunder. You may use the software subject to the license 10// terms below provided that you ensure that this notice is replicated --- 33 unchanged lines hidden (view full) --- 44 'ub' : 'uint8_t', 45 'sh' : 'int16_t', 46 'uh' : 'uint16_t', 47 'sw' : 'int32_t', 48 'uw' : 'uint32_t', 49 'ud' : 'uint64_t', 50 'tud' : 'Twin64_t', 51 'sf' : 'float', |
52 'df' : 'double' | 52 'df' : 'double', 53 'vc' : 'TheISA::VecRegContainer', 54 # For operations that are implemented as a template 55 'x' : 'TPElem', |
53}}; 54 55let {{ 56 maybePCRead = ''' 57 ((%(reg_idx)s == PCReg) ? readPC(xc) : xc->%(func)s(this, %(op_idx)s)) 58 ''' 59 maybeAlignedPCRead = ''' 60 ((%(reg_idx)s == PCReg) ? (roundDown(readPC(xc), 4)) : --- 51 unchanged lines hidden (view full) --- 112 #R15, the updates are layered properly and the R15 update isn't lost. 113 srtNormal = 5 114 srtCpsr = 4 115 srtBase = 3 116 srtPC = 2 117 srtMode = 1 118 srtEPC = 0 119 | 56}}; 57 58let {{ 59 maybePCRead = ''' 60 ((%(reg_idx)s == PCReg) ? readPC(xc) : xc->%(func)s(this, %(op_idx)s)) 61 ''' 62 maybeAlignedPCRead = ''' 63 ((%(reg_idx)s == PCReg) ? (roundDown(readPC(xc), 4)) : --- 51 unchanged lines hidden (view full) --- 115 #R15, the updates are layered properly and the R15 update isn't lost. 116 srtNormal = 5 117 srtCpsr = 4 118 srtBase = 3 119 srtPC = 2 120 srtMode = 1 121 srtEPC = 0 122 |
123 def vectorElem(idx, elem): 124 return ('VecElem', 'sf', (idx, elem), 'IsVectorElem', srtNormal) 125 126 def vectorReg(idx, elems = None): 127 return ('VecReg', 'vc', (idx, elems) , 'IsVector', srtNormal) 128 129 def vectorRegElem(elem, ext = 'sf', zeroing = False): 130 return (elem, ext, zeroing) 131 |
|
120 def floatReg(idx): 121 return ('FloatReg', 'sf', idx, 'IsFloating', srtNormal) 122 123 def intReg(idx): 124 return ('IntReg', 'uw', idx, 'IsInteger', srtNormal, 125 maybePCRead, maybePCWrite) 126 127 def intReg64(idx): --- 164 unchanged lines hidden (view full) --- 292 293 'FpOp2': floatReg('(op2 + 0)'), 294 'FpOp2P0': floatReg('(op2 + 0)'), 295 'FpOp2P1': floatReg('(op2 + 1)'), 296 'FpOp2P2': floatReg('(op2 + 2)'), 297 'FpOp2P3': floatReg('(op2 + 3)'), 298 299 # Create AArch64 unpacked view of the FP registers | 132 def floatReg(idx): 133 return ('FloatReg', 'sf', idx, 'IsFloating', srtNormal) 134 135 def intReg(idx): 136 return ('IntReg', 'uw', idx, 'IsInteger', srtNormal, 137 maybePCRead, maybePCWrite) 138 139 def intReg64(idx): --- 164 unchanged lines hidden (view full) --- 304 305 'FpOp2': floatReg('(op2 + 0)'), 306 'FpOp2P0': floatReg('(op2 + 0)'), 307 'FpOp2P1': floatReg('(op2 + 1)'), 308 'FpOp2P2': floatReg('(op2 + 2)'), 309 'FpOp2P3': floatReg('(op2 + 3)'), 310 311 # Create AArch64 unpacked view of the FP registers |
300 'AA64FpOp1P0': floatReg('((op1 * 4) + 0)'), 301 'AA64FpOp1P1': floatReg('((op1 * 4) + 1)'), 302 'AA64FpOp1P2': floatReg('((op1 * 4) + 2)'), 303 'AA64FpOp1P3': floatReg('((op1 * 4) + 3)'), 304 'AA64FpOp2P0': floatReg('((op2 * 4) + 0)'), 305 'AA64FpOp2P1': floatReg('((op2 * 4) + 1)'), 306 'AA64FpOp2P2': floatReg('((op2 * 4) + 2)'), 307 'AA64FpOp2P3': floatReg('((op2 * 4) + 3)'), 308 'AA64FpOp3P0': floatReg('((op3 * 4) + 0)'), 309 'AA64FpOp3P1': floatReg('((op3 * 4) + 1)'), 310 'AA64FpOp3P2': floatReg('((op3 * 4) + 2)'), 311 'AA64FpOp3P3': floatReg('((op3 * 4) + 3)'), 312 'AA64FpDestP0': floatReg('((dest * 4) + 0)'), 313 'AA64FpDestP1': floatReg('((dest * 4) + 1)'), 314 'AA64FpDestP2': floatReg('((dest * 4) + 2)'), 315 'AA64FpDestP3': floatReg('((dest * 4) + 3)'), 316 'AA64FpDest2P0': floatReg('((dest2 * 4) + 0)'), 317 'AA64FpDest2P1': floatReg('((dest2 * 4) + 1)'), 318 'AA64FpDest2P2': floatReg('((dest2 * 4) + 2)'), 319 'AA64FpDest2P3': floatReg('((dest2 * 4) + 3)'), | 312 # Name ::= 'AA64Vec' OpSpec [LaneSpec] 313 # OpSpec ::= IOSpec [Index] [Plus] 314 # IOSpec ::= 'S' | 'D' 315 # Index ::= '0' | ... | '9' 316 # Plus ::= [PlusAmount] ['l'] 317 # PlusAmount ::= 'p' [PlusAmount] 318 # LaneSpec ::= 'L' Index 319 # 320 # All the constituents are hierarchically defined as part of the Vector 321 # Register they belong to |
320 | 322 |
321 'AA64FpOp1P0V0': floatReg('((((op1+0)) * 4) + 0)'), 322 'AA64FpOp1P1V0': floatReg('((((op1+0)) * 4) + 1)'), 323 'AA64FpOp1P2V0': floatReg('((((op1+0)) * 4) + 2)'), 324 'AA64FpOp1P3V0': floatReg('((((op1+0)) * 4) + 3)'), | 323 'AA64FpOp1': vectorReg('op1', 324 { 325 'AA64FpOp1P0': vectorRegElem('0'), 326 'AA64FpOp1P1': vectorRegElem('1'), 327 'AA64FpOp1P2': vectorRegElem('2'), 328 'AA64FpOp1P3': vectorRegElem('3'), 329 'AA64FpOp1S': vectorRegElem('0', 'sf', zeroing = True), 330 'AA64FpOp1D': vectorRegElem('0', 'df', zeroing = True), 331 'AA64FpOp1Q': vectorRegElem('0', 'tud', zeroing = True) 332 }), |
325 | 333 |
326 'AA64FpOp1P0V1': floatReg('((((op1+1)) * 4) + 0)'), 327 'AA64FpOp1P1V1': floatReg('((((op1+1)) * 4) + 1)'), 328 'AA64FpOp1P2V1': floatReg('((((op1+1)) * 4) + 2)'), 329 'AA64FpOp1P3V1': floatReg('((((op1+1)) * 4) + 3)'), | 334 'AA64FpOp2': vectorReg('op2', 335 { 336 'AA64FpOp2P0': vectorRegElem('0'), 337 'AA64FpOp2P1': vectorRegElem('1'), 338 'AA64FpOp2P2': vectorRegElem('2'), 339 'AA64FpOp2P3': vectorRegElem('3'), 340 'AA64FpOp2S': vectorRegElem('0', 'sf', zeroing = True), 341 'AA64FpOp2D': vectorRegElem('0', 'df', zeroing = True), 342 'AA64FpOp2Q': vectorRegElem('0', 'tud', zeroing = True) 343 }), |
330 | 344 |
331 'AA64FpOp1P0V2': floatReg('((((op1+2)) * 4) + 0)'), 332 'AA64FpOp1P1V2': floatReg('((((op1+2)) * 4) + 1)'), 333 'AA64FpOp1P2V2': floatReg('((((op1+2)) * 4) + 2)'), 334 'AA64FpOp1P3V2': floatReg('((((op1+2)) * 4) + 3)'), | 345 'AA64FpOp3': vectorReg('op3', 346 { 347 'AA64FpOp3P0': vectorRegElem('0'), 348 'AA64FpOp3P1': vectorRegElem('1'), 349 'AA64FpOp3P2': vectorRegElem('2'), 350 'AA64FpOp3P3': vectorRegElem('3'), 351 'AA64FpOp3S': vectorRegElem('0', 'sf', zeroing = True), 352 'AA64FpOp3D': vectorRegElem('0', 'df', zeroing = True), 353 'AA64FpOp3Q': vectorRegElem('0', 'tud', zeroing = True) 354 }), |
335 | 355 |
336 'AA64FpOp1P0V3': floatReg('((((op1+3)) * 4) + 0)'), 337 'AA64FpOp1P1V3': floatReg('((((op1+3)) * 4) + 1)'), 338 'AA64FpOp1P2V3': floatReg('((((op1+3)) * 4) + 2)'), 339 'AA64FpOp1P3V3': floatReg('((((op1+3)) * 4) + 3)'), | 356 'AA64FpDest': vectorReg('dest', 357 { 358 'AA64FpDestP0': vectorRegElem('0'), 359 'AA64FpDestP1': vectorRegElem('1'), 360 'AA64FpDestP2': vectorRegElem('2'), 361 'AA64FpDestP3': vectorRegElem('3'), 362 'AA64FpDestS': vectorRegElem('0', 'sf', zeroing = True), 363 'AA64FpDestD': vectorRegElem('0', 'df', zeroing = True), 364 'AA64FpDestQ': vectorRegElem('0', 'tud', zeroing = True) 365 }), |
340 | 366 |
341 'AA64FpOp1P0V0S': floatReg('((((op1+0)%32) * 4) + 0)'), 342 'AA64FpOp1P1V0S': floatReg('((((op1+0)%32) * 4) + 1)'), 343 'AA64FpOp1P2V0S': floatReg('((((op1+0)%32) * 4) + 2)'), 344 'AA64FpOp1P3V0S': floatReg('((((op1+0)%32) * 4) + 3)'), | 367 'AA64FpDest2': vectorReg('dest2', 368 { 369 'AA64FpDest2P0': vectorRegElem('0'), 370 'AA64FpDest2P1': vectorRegElem('1'), 371 'AA64FpDest2P2': vectorRegElem('2'), 372 'AA64FpDest2P3': vectorRegElem('3'), 373 'AA64FpDest2S': vectorRegElem('0', 'sf', zeroing = True), 374 'AA64FpDest2D': vectorRegElem('0', 'df', zeroing = True), 375 'AA64FpDest2Q': vectorRegElem('0', 'tud', zeroing = True) 376 }), |
345 | 377 |
346 'AA64FpOp1P0V1S': floatReg('((((op1+1)%32) * 4) + 0)'), 347 'AA64FpOp1P1V1S': floatReg('((((op1+1)%32) * 4) + 1)'), 348 'AA64FpOp1P2V1S': floatReg('((((op1+1)%32) * 4) + 2)'), 349 'AA64FpOp1P3V1S': floatReg('((((op1+1)%32) * 4) + 3)'), | 378 'AA64FpOp1V0': vectorReg('op1', 379 { 380 'AA64FpOp1P0V0': vectorRegElem('0'), 381 'AA64FpOp1P1V0': vectorRegElem('1'), 382 'AA64FpOp1P2V0': vectorRegElem('2'), 383 'AA64FpOp1P3V0': vectorRegElem('3'), 384 'AA64FpOp1SV0': vectorRegElem('0', 'sf', zeroing = True), 385 'AA64FpOp1DV0': vectorRegElem('0', 'df', zeroing = True), 386 'AA64FpOp1QV0': vectorRegElem('0', 'tud', zeroing = True) 387 }), |
350 | 388 |
351 'AA64FpOp1P0V2S': floatReg('((((op1+2)%32) * 4) + 0)'), 352 'AA64FpOp1P1V2S': floatReg('((((op1+2)%32) * 4) + 1)'), 353 'AA64FpOp1P2V2S': floatReg('((((op1+2)%32) * 4) + 2)'), 354 'AA64FpOp1P3V2S': floatReg('((((op1+2)%32) * 4) + 3)'), | 389 'AA64FpOp1V1': vectorReg('op1+1', 390 { 391 'AA64FpOp1P0V1': vectorRegElem('0'), 392 'AA64FpOp1P1V1': vectorRegElem('1'), 393 'AA64FpOp1P2V1': vectorRegElem('2'), 394 'AA64FpOp1P3V1': vectorRegElem('3'), 395 'AA64FpOp1SV1': vectorRegElem('0', 'sf', zeroing = True), 396 'AA64FpOp1DV1': vectorRegElem('0', 'df', zeroing = True), 397 'AA64FpOp1QV1': vectorRegElem('0', 'tud', zeroing = True) 398 }), |
355 | 399 |
356 'AA64FpOp1P0V3S': floatReg('((((op1+3)%32) * 4) + 0)'), 357 'AA64FpOp1P1V3S': floatReg('((((op1+3)%32) * 4) + 1)'), 358 'AA64FpOp1P2V3S': floatReg('((((op1+3)%32) * 4) + 2)'), 359 'AA64FpOp1P3V3S': floatReg('((((op1+3)%32) * 4) + 3)'), | 400 'AA64FpOp1V2': vectorReg('op1+2', 401 { 402 'AA64FpOp1P0V2': vectorRegElem('0'), 403 'AA64FpOp1P1V2': vectorRegElem('1'), 404 'AA64FpOp1P2V2': vectorRegElem('2'), 405 'AA64FpOp1P3V2': vectorRegElem('3'), 406 'AA64FpOp1SV2': vectorRegElem('0', 'sf', zeroing = True), 407 'AA64FpOp1DV2': vectorRegElem('0', 'df', zeroing = True), 408 'AA64FpOp1QV2': vectorRegElem('0', 'tud', zeroing = True) 409 }), |
360 | 410 |
361 'AA64FpDestP0V0': floatReg('((((dest+0)) * 4) + 0)'), 362 'AA64FpDestP1V0': floatReg('((((dest+0)) * 4) + 1)'), 363 'AA64FpDestP2V0': floatReg('((((dest+0)) * 4) + 2)'), 364 'AA64FpDestP3V0': floatReg('((((dest+0)) * 4) + 3)'), | 411 'AA64FpOp1V3': vectorReg('op1+3', 412 { 413 'AA64FpOp1P0V3': vectorRegElem('0'), 414 'AA64FpOp1P1V3': vectorRegElem('1'), 415 'AA64FpOp1P2V3': vectorRegElem('2'), 416 'AA64FpOp1P3V3': vectorRegElem('3'), 417 'AA64FpOp1SV3': vectorRegElem('0', 'sf', zeroing = True), 418 'AA64FpOp1DV3': vectorRegElem('0', 'df', zeroing = True), 419 'AA64FpOp1QV3': vectorRegElem('0', 'tud', zeroing = True) 420 }), |
365 | 421 |
366 'AA64FpDestP0V1': floatReg('((((dest+1)) * 4) + 0)'), 367 'AA64FpDestP1V1': floatReg('((((dest+1)) * 4) + 1)'), 368 'AA64FpDestP2V1': floatReg('((((dest+1)) * 4) + 2)'), 369 'AA64FpDestP3V1': floatReg('((((dest+1)) * 4) + 3)'), | 422 'AA64FpOp1V0S': vectorReg('(op1+0)%32', 423 { 424 'AA64FpOp1P0V0S': vectorRegElem('0'), 425 'AA64FpOp1P1V0S': vectorRegElem('1'), 426 'AA64FpOp1P2V0S': vectorRegElem('2'), 427 'AA64FpOp1P3V0S': vectorRegElem('3'), 428 'AA64FpOp1SV0S': vectorRegElem('0', 'sf', zeroing = True), 429 'AA64FpOp1DV0S': vectorRegElem('0', 'df', zeroing = True), 430 'AA64FpOp1QV0S': vectorRegElem('0', 'tud', zeroing = True) 431 }), |
370 | 432 |
371 'AA64FpDestP0V0L': floatReg('((((dest+0)%32) * 4) + 0)'), 372 'AA64FpDestP1V0L': floatReg('((((dest+0)%32) * 4) + 1)'), 373 'AA64FpDestP2V0L': floatReg('((((dest+0)%32) * 4) + 2)'), 374 'AA64FpDestP3V0L': floatReg('((((dest+0)%32) * 4) + 3)'), | 433 'AA64FpOp1V1S': vectorReg('(op1+1)%32', 434 { 435 'AA64FpOp1P0V1S': vectorRegElem('0'), 436 'AA64FpOp1P1V1S': vectorRegElem('1'), 437 'AA64FpOp1P2V1S': vectorRegElem('2'), 438 'AA64FpOp1P3V1S': vectorRegElem('3'), 439 'AA64FpOp1SV1S': vectorRegElem('0', 'sf', zeroing = True), 440 'AA64FpOp1DV1S': vectorRegElem('0', 'df', zeroing = True), 441 'AA64FpOp1QV1S': vectorRegElem('0', 'tud', zeroing = True) 442 }), |
375 | 443 |
376 'AA64FpDestP0V1L': floatReg('((((dest+1)%32) * 4) + 0)'), 377 'AA64FpDestP1V1L': floatReg('((((dest+1)%32) * 4) + 1)'), 378 'AA64FpDestP2V1L': floatReg('((((dest+1)%32) * 4) + 2)'), 379 'AA64FpDestP3V1L': floatReg('((((dest+1)%32) * 4) + 3)'), | 444 'AA64FpOp1V2S': vectorReg('(op1+2)%32', 445 { 446 'AA64FpOp1P0V2S': vectorRegElem('0'), 447 'AA64FpOp1P1V2S': vectorRegElem('1'), 448 'AA64FpOp1P2V2S': vectorRegElem('2'), 449 'AA64FpOp1P3V2S': vectorRegElem('3'), 450 'AA64FpOp1SV2S': vectorRegElem('0', 'sf', zeroing = True), 451 'AA64FpOp1DV2S': vectorRegElem('0', 'df', zeroing = True), 452 'AA64FpOp1QV2S': vectorRegElem('0', 'tud', zeroing = True) 453 }), |
380 | 454 |
455 'AA64FpOp1V3S': vectorReg('(op1+3)%32', 456 { 457 'AA64FpOp1P0V3S': vectorRegElem('0'), 458 'AA64FpOp1P1V3S': vectorRegElem('1'), 459 'AA64FpOp1P2V3S': vectorRegElem('2'), 460 'AA64FpOp1P3V3S': vectorRegElem('3'), 461 'AA64FpOp1SV3S': vectorRegElem('0', 'sf', zeroing = True), 462 'AA64FpOp1DV3S': vectorRegElem('0', 'df', zeroing = True), 463 'AA64FpOp1QV3S': vectorRegElem('0', 'tud', zeroing = True) 464 }), 465 466 'AA64FpDestV0': vectorReg('(dest+0)', 467 { 468 'AA64FpDestP0V0': vectorRegElem('0'), 469 'AA64FpDestP1V0': vectorRegElem('1'), 470 'AA64FpDestP2V0': vectorRegElem('2'), 471 'AA64FpDestP3V0': vectorRegElem('3'), 472 'AA64FpDestSV0': vectorRegElem('0', 'sf', zeroing = True), 473 'AA64FpDestDV0': vectorRegElem('0', 'df', zeroing = True), 474 'AA64FpDestQV0': vectorRegElem('0', 'tud', zeroing = True) 475 }), 476 477 'AA64FpDestV1': vectorReg('(dest+1)', 478 { 479 'AA64FpDestP0V1': vectorRegElem('0'), 480 'AA64FpDestP1V1': vectorRegElem('1'), 481 'AA64FpDestP2V1': vectorRegElem('2'), 482 'AA64FpDestP3V1': vectorRegElem('3'), 483 'AA64FpDestSV1': vectorRegElem('0', 'sf', zeroing = True), 484 'AA64FpDestDV1': vectorRegElem('0', 'df', zeroing = True), 485 'AA64FpDestQV1': vectorRegElem('0', 'tud', zeroing = True) 486 }), 487 488 'AA64FpDestV0L': vectorReg('(dest+0)%32', 489 { 490 'AA64FpDestP0V0L': vectorRegElem('0'), 491 'AA64FpDestP1V0L': vectorRegElem('1'), 492 'AA64FpDestP2V0L': vectorRegElem('2'), 493 'AA64FpDestP3V0L': vectorRegElem('3'), 494 'AA64FpDestSV0L': vectorRegElem('0', 'sf', zeroing = True), 495 'AA64FpDestDV0L': vectorRegElem('0', 'df', zeroing = True), 496 'AA64FpDestQV0L': vectorRegElem('0', 'tud', zeroing = True) 497 }), 498 499 'AA64FpDestV1L': vectorReg('(dest+1)%32', 500 { 501 'AA64FpDestP0V1L': vectorRegElem('0'), 502 'AA64FpDestP1V1L': vectorRegElem('1'), 503 'AA64FpDestP2V1L': vectorRegElem('2'), 504 'AA64FpDestP3V1L': vectorRegElem('3'), 505 'AA64FpDestSV1L': vectorRegElem('0', 'sf', zeroing = True), 506 'AA64FpDestDV1L': vectorRegElem('0', 'df', zeroing = True), 507 'AA64FpDestQV1L': vectorRegElem('0', 'tud', zeroing = True) 508 }), 509 |
|
381 #Abstracted control reg operands 382 'MiscDest': cntrlReg('dest'), 383 'MiscOp1': cntrlReg('op1'), 384 'MiscNsBankedDest': cntrlNsBankedReg('dest'), 385 'MiscNsBankedOp1': cntrlNsBankedReg('op1'), 386 'MiscNsBankedDest64': cntrlNsBankedReg64('dest'), 387 'MiscNsBankedOp164': cntrlNsBankedReg64('op1'), 388 --- 65 unchanged lines hidden --- | 510 #Abstracted control reg operands 511 'MiscDest': cntrlReg('dest'), 512 'MiscOp1': cntrlReg('op1'), 513 'MiscNsBankedDest': cntrlNsBankedReg('dest'), 514 'MiscNsBankedOp1': cntrlNsBankedReg('op1'), 515 'MiscNsBankedDest64': cntrlNsBankedReg64('dest'), 516 'MiscNsBankedOp164': cntrlNsBankedReg64('op1'), 517 --- 65 unchanged lines hidden --- |