sve_mem.isa (14106:293e3f4b1321) | sve_mem.isa (14108:881e7d85baf7) |
---|---|
1// Copyright (c) 2017-2018 ARM Limited 2// All rights reserved 3// 4// The license below extends only to copyright in the software and shall 5// not be construed as granting a license to any other intellectual 6// property including but not limited to intellectual property relating 7// to a hardware implementation of the functionality of the software 8// licensed hereunder. You may use the software subject to the license --- 1461 unchanged lines hidden (view full) --- 1470 substDict = {'targs': type, 1471 'class_name': 'SveLoadRegImmMicroop' if offsetIsImm 1472 else 'SveLoadRegRegMicroop'} 1473 exec_output += SveStructMemExecDeclare.subst(substDict) 1474 substDict['class_name'] = ('SveStoreRegImmMicroop' if offsetIsImm 1475 else 'SveStoreRegRegMicroop') 1476 exec_output += SveStructMemExecDeclare.subst(substDict) 1477 | 1// Copyright (c) 2017-2018 ARM Limited 2// All rights reserved 3// 4// The license below extends only to copyright in the software and shall 5// not be construed as granting a license to any other intellectual 6// property including but not limited to intellectual property relating 7// to a hardware implementation of the functionality of the software 8// licensed hereunder. You may use the software subject to the license --- 1461 unchanged lines hidden (view full) --- 1470 substDict = {'targs': type, 1471 'class_name': 'SveLoadRegImmMicroop' if offsetIsImm 1472 else 'SveLoadRegRegMicroop'} 1473 exec_output += SveStructMemExecDeclare.subst(substDict) 1474 substDict['class_name'] = ('SveStoreRegImmMicroop' if offsetIsImm 1475 else 'SveStoreRegRegMicroop') 1476 exec_output += SveStructMemExecDeclare.subst(substDict) 1477 |
1478 # Generates definitions for SVE load-and-replicate quadword instructions 1479 def emitSveLoadAndReplQuad(offsetIsImm): 1480 global header_output, exec_output, decoders 1481 tplHeader = 'template <class RegElemType, class MemElemType>' 1482 tplArgs = '<RegElemType, MemElemType>' 1483 eaCode = SPAlignmentCheckCode + ''' 1484 int memAccessSize = 16; 1485 EA = XBase + ''' 1486 if offsetIsImm: 1487 eaCode += '(((int64_t) this->imm) * 16);' 1488 else: 1489 eaCode += '(XOffset * sizeof(MemElemType));' 1490 loadRdEnableCode = ''' 1491 eCount = 16/sizeof(RegElemType); 1492 auto rdEn = std::vector<bool>(16, true); 1493 for (int i = 0; i < eCount; ++i) { 1494 if (!GpOp_x[i]) { 1495 for (int j = 0; j < sizeof(RegElemType); ++j) { 1496 rdEn[sizeof(RegElemType) * i + j] = false; 1497 } 1498 } 1499 } 1500 ''' 1501 memAccCode = ''' 1502 __uint128_t qword; 1503 RegElemType* qp = reinterpret_cast<RegElemType*>(&qword); 1504 for (int i = 0; i < 16/sizeof(RegElemType); ++i) { 1505 if (GpOp_x[i]) { 1506 qp[i] = memDataView[i]; 1507 } else { 1508 qp[i] = 0; 1509 } 1510 } 1511 eCount = ArmStaticInst::getCurSveVecLen<__uint128_t>( 1512 xc->tcBase()); 1513 for (int i = 0; i < eCount; ++i) { 1514 AA64FpDest_uq[i] = qword; 1515 } 1516 ''' 1517 iop = InstObjParams('ld1rq', 1518 'SveLd1RqSI' if offsetIsImm else 'SveLd1RqSS', 1519 'SveContigMemSI' if offsetIsImm else 'SveContigMemSS', 1520 {'tpl_header': tplHeader, 1521 'tpl_args': tplArgs, 1522 'rden_code': loadRdEnableCode, 1523 'memacc_code': memAccCode, 1524 'ea_code': sveEnabledCheckCode + eaCode, 1525 'fault_code': '', 1526 'fa_code': ''}, 1527 ['IsMemRef', 'IsLoad']) 1528 if offsetIsImm: 1529 header_output += SveContigMemSIOpDeclare.subst(iop) 1530 else: 1531 header_output += SveContigMemSSOpDeclare.subst(iop) 1532 exec_output += ( 1533 SveContigLoadExecute.subst(iop) + 1534 SveContigLoadInitiateAcc.subst(iop) + 1535 SveContigLoadCompleteAcc.subst(iop)) 1536 for ttype in ('uint8_t', 'uint16_t', 'uint32_t', 'uint64_t'): 1537 substDict = {'tpl_args': '<%s, %s>' % (ttype, ttype), 1538 'class_name': 'SveLd1RqSI' if offsetIsImm 1539 else 'SveLd1RqSS'} 1540 exec_output += SveContigMemExecDeclare.subst(substDict) 1541 |
|
1478 # LD1[S]{B,H,W,D} (scalar plus immediate) 1479 # ST1[S]{B,H,W,D} (scalar plus immediate) 1480 # LDNF1[S]{B,H,W,D} (scalar plus immediate) 1481 emitSveContigMemInsts(True) 1482 # LD1[S]{B,H,W,D} (scalar plus scalar) 1483 # ST1[S]{B,H,W,D} (scalar plus scalar) 1484 # LDFF1[S]{B,H,W,D} (scalar plus vector) 1485 emitSveContigMemInsts(False) 1486 1487 # LD1R[S]{B,H,W,D} 1488 emitSveLoadAndRepl() 1489 | 1542 # LD1[S]{B,H,W,D} (scalar plus immediate) 1543 # ST1[S]{B,H,W,D} (scalar plus immediate) 1544 # LDNF1[S]{B,H,W,D} (scalar plus immediate) 1545 emitSveContigMemInsts(True) 1546 # LD1[S]{B,H,W,D} (scalar plus scalar) 1547 # ST1[S]{B,H,W,D} (scalar plus scalar) 1548 # LDFF1[S]{B,H,W,D} (scalar plus vector) 1549 emitSveContigMemInsts(False) 1550 1551 # LD1R[S]{B,H,W,D} 1552 emitSveLoadAndRepl() 1553 |
1554 # LD1RQ{B,H,W,D} (scalar plus immediate) 1555 emitSveLoadAndReplQuad(offsetIsImm = True) 1556 # LD1RQ{B,H,W,D} (scalar plus scalar) 1557 emitSveLoadAndReplQuad(offsetIsImm = False) 1558 |
|
1490 # LD{2,3,4}{B,H,W,D} (scalar plus immediate) 1491 # ST{2,3,4}{B,H,W,D} (scalar plus immediate) 1492 emitSveStructMemInsts(offsetIsImm = True) 1493 # LD{2,3,4}{B,H,W,D} (scalar plus scalar) 1494 # ST{2,3,4}{B,H,W,D} (scalar plus scalar) 1495 emitSveStructMemInsts(offsetIsImm = False) 1496 1497 # LDR (predicate), STR (predicate) --- 23 unchanged lines hidden --- | 1559 # LD{2,3,4}{B,H,W,D} (scalar plus immediate) 1560 # ST{2,3,4}{B,H,W,D} (scalar plus immediate) 1561 emitSveStructMemInsts(offsetIsImm = True) 1562 # LD{2,3,4}{B,H,W,D} (scalar plus scalar) 1563 # ST{2,3,4}{B,H,W,D} (scalar plus scalar) 1564 emitSveStructMemInsts(offsetIsImm = False) 1565 1566 # LDR (predicate), STR (predicate) --- 23 unchanged lines hidden --- |