731a732,940
>
> // Atomic operations in memory
>
> def template AmoOpExecute {{
> Fault %(class_name)s::execute(ExecContext *xc,
> Trace::InstRecord *traceData) const
> {
> Addr EA;
> Fault fault = NoFault;
>
> %(op_decl)s;
> %(op_rd)s;
> %(ea_code)s;
>
> %(usrDecl)s;
> if (fault == NoFault) {
> %(memacc_code)s;
> }
>
> %(amo_code)s
> assert(amo_op);
>
> if (fault == NoFault) {
> fault = amoMemAtomic(xc, traceData, Mem, EA,
> memAccessFlags, amo_op);
> }
>
> if (fault == NoFault) {
> %(postacc_code)s;
> }
>
> if (fault == NoFault) {
> %(op_wb)s;
> }
>
> return fault;
> }
> }};
>
> def template AmoOpInitiateAcc {{
> Fault %(class_name)s::initiateAcc(ExecContext *xc,
> Trace::InstRecord *traceData) const
> {
> Addr EA;
> Fault fault = NoFault;
>
> %(op_src_decl)s;
> %(op_rd)s;
> %(ea_code)s;
> %(usrDecl)s;
>
> if (fault == NoFault) {
> %(memacc_code)s;
> }
>
> %(amo_code)s;
>
> assert(amo_op);
> if (fault == NoFault) {
> fault = initiateMemAMO(xc, traceData, EA, Mem, memAccessFlags,
> amo_op);
> }
>
> return fault;
> }
> }};
>
> def template AmoOpCompleteAcc {{
> Fault %(class_name)s::completeAcc(PacketPtr pkt, ExecContext *xc,
> Trace::InstRecord *traceData) const
> {
> Fault fault = NoFault;
>
> %(op_decl)s;
> %(op_rd)s;
>
> // ARM instructions will not have a pkt if the predicate is false
> getMem(pkt, Mem, traceData);
>
> if (fault == NoFault) {
> %(postacc_code)s;
> }
>
> if (fault == NoFault) {
> %(op_wb)s;
> }
>
> return fault;
> }
>
> }};
>
> def template AmoOpDeclare {{
> class %(class_name)s : public %(base_class)s
> {
> public:
>
> /// Constructor.
> %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
> IntRegIndex _base, IntRegIndex _result);
>
> Fault execute(ExecContext *, Trace::InstRecord *) const override;
> Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
> Fault completeAcc(PacketPtr, ExecContext *,
> Trace::InstRecord *) const override;
>
> void
> annotateFault(ArmFault *fault) override
> {
> %(fa_code)s
> }
> };
> }};
>
>
> def template AmoOpConstructor {{
> %(class_name)s::%(class_name)s(ExtMachInst machInst,
> IntRegIndex _dest, IntRegIndex _base, IntRegIndex _result)
> : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
> _dest, _base, _result)
> {
> %(constructor)s;
>
> }
> }};
>
> def template AmoPairOpDeclare {{
> class %(class_name)s : public %(base_class)s
> {
> public:
> uint32_t d2_src ;
> uint32_t r2_src ;
> uint32_t r2_dst ;
> /// Constructor.
> %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
> IntRegIndex _base, IntRegIndex _result);
>
> Fault execute(ExecContext *, Trace::InstRecord *) const override;
> Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
> Fault completeAcc(PacketPtr, ExecContext *,
> Trace::InstRecord *) const override;
>
> void
> annotateFault(ArmFault *fault) override
> {
> %(fa_code)s
> }
> };
> }};
>
>
> def template AmoPairOpConstructor {{
> %(class_name)s::%(class_name)s(ExtMachInst machInst,
> IntRegIndex _dest, IntRegIndex _base, IntRegIndex _result)
> : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
> _dest, _base, _result)
> {
> %(constructor)s;
>
> uint32_t d2 = RegId(IntRegClass, dest).index() + 1 ;
> uint32_t r2 = RegId(IntRegClass, result).index() + 1 ;
>
> d2_src = _numSrcRegs ;
> _srcRegIdx[_numSrcRegs++] = RegId(IntRegClass, d2);
> r2_src = _numSrcRegs ;
> _srcRegIdx[_numSrcRegs++] = RegId(IntRegClass, r2);
> r2_dst = _numDestRegs ;
> _destRegIdx[_numDestRegs++] = RegId(IntRegClass, r2);
>
> }
> }};
>
> def template AmoArithmeticOpDeclare {{
> class %(class_name)s : public %(base_class)s
> {
> public:
> bool isXZR ;
> /// Constructor.
> %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
> IntRegIndex _base, IntRegIndex _result);
>
> Fault execute(ExecContext *, Trace::InstRecord *) const override;
> Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
> Fault completeAcc(PacketPtr, ExecContext *,
> Trace::InstRecord *) const override;
>
> void
> annotateFault(ArmFault *fault) override
> {
> %(fa_code)s
> }
> };
> }};
>
> def template AmoArithmeticOpConstructor {{
> %(class_name)s::%(class_name)s(ExtMachInst machInst,
> IntRegIndex _dest, IntRegIndex _base, IntRegIndex _result)
> : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
> _dest, _base, _result)
> {
> %(constructor)s;
> isXZR = false;
> uint32_t r2 = RegId(IntRegClass, dest).index() ;
> if (r2 == 31){
> flags[IsReadBarrier] = false;
> isXZR = true;
> }
> }
> }};