gem5-users@gem5.org

The gem5 Users mailing list

View all threads

Extract Instructions

AD
Alexandra-Nicoleta DAVID
Wed, Jun 14, 2023 10:34 AM

I tried to extract the fmul type instructions and display them in the
format:
[image: image.png]
I have these functions in execute.cc

    // Cod adaugat
    std::string disassembledInst =

inst->staticInst->disassemble(inst->pc->instAddr(),
&loader::debugSymbolTable);
if(inst->staticInst->opClass()==FloatMultOp){
if (disassembledInst.find("fmul") != std::string::npos) {

            // Instruction details
            DPRINTF(MinorExecuteOp, "Exec inst: %s\n", *inst);

            // Op Class
            DPRINTF(MinorExecuteOp, "  Op Class inst: %s\n",

enums::OpClassStrings[inst->staticInst->opClass()]);

            // Op Dissasembled
            DPRINTF(MinorExecuteOp, "Dissasembled: %s\n",

inst->staticInst->disassemble(inst->pc->instAddr(),
&loader::debugSymbolTable));

            // Cast from StaticInstPtr to StaticInst
            StaticInst* leInst = inst->staticInst.get();


            // Print source register values
            for (int i = 0; i < leInst->numSrcRegs(); i++) {
                RegId regId = leInst->srcRegIdx(i);
                float regValue;
                context.getFloatRegOperand(leInst, i, &regValue);
                DPRINTF(MinorExecuteOp, "  SrcReg%d=%d (%s)\n",/*i,

regValue,*/ printRegName(regId));
}

            // Print destination register values
            for (int i = 0; i < leInst->numDestRegs(); i++) {
                RegId regId = leInst->destRegIdx(i);
                float regValue;
                context.getFloatRegOperand(leInst, i, &regValue);
                DPRINTF(MinorExecuteOp, "  DestReg%d=%d (%s)\n", /*i,

regValue,*/ printRegName(regId));

            }
        }
    }

    fault = inst->staticInst->execute(&context,
        inst->traceData);

    /*Set the predicate for tracing and dump*/
    if(inst->traceData){
        inst->traceData->setPredicate(context.readPredicate());
    }

    // Cod adaugat
    // Print destination register values
    if(inst->staticInst->opClass()==FloatMultOp){
        if (disassembledInst.find("fmul") != std::string::npos) {

            // Cast from StaticInstPtr to StaticInst
            StaticInst* leInst = inst->staticInst.get();


            for (int i = 0; i < leInst->numDestRegs(); i++) {
                RegId regId = leInst->destRegIdx(i);
                float regValue;
                context.getFloatRegOperand(leInst, i, &regValue);
                DPRINTF(MinorExecuteOp, "  DestReg%d=%d (%s)\n", /*i,

regValue,*/ printRegName(regId));

            }
        }
    }
    // Cod adaugat

and the getFloatRegOperand looks like this
[image: image.png]
has anyone tried to do this before and can help me?
Thank you very much! Have a nice day!

I tried to extract the fmul type instructions and display them in the format: [image: image.png] I have these functions in execute.cc // Cod adaugat std::string disassembledInst = inst->staticInst->disassemble(inst->pc->instAddr(), &loader::debugSymbolTable); if(inst->staticInst->opClass()==FloatMultOp){ if (disassembledInst.find("fmul") != std::string::npos) { // Instruction details DPRINTF(MinorExecuteOp, "Exec inst: %s\n", *inst); // Op Class DPRINTF(MinorExecuteOp, " Op Class inst: %s\n", enums::OpClassStrings[inst->staticInst->opClass()]); // Op Dissasembled DPRINTF(MinorExecuteOp, "Dissasembled: %s\n", inst->staticInst->disassemble(inst->pc->instAddr(), &loader::debugSymbolTable)); // Cast from StaticInstPtr to StaticInst StaticInst* leInst = inst->staticInst.get(); // Print source register values for (int i = 0; i < leInst->numSrcRegs(); i++) { RegId regId = leInst->srcRegIdx(i); float regValue; context.getFloatRegOperand(leInst, i, &regValue); DPRINTF(MinorExecuteOp, " SrcReg%d=%d (%s)\n",/*i, regValue,*/ printRegName(regId)); } // Print destination register values for (int i = 0; i < leInst->numDestRegs(); i++) { RegId regId = leInst->destRegIdx(i); float regValue; context.getFloatRegOperand(leInst, i, &regValue); DPRINTF(MinorExecuteOp, " DestReg%d=%d (%s)\n", /*i, regValue,*/ printRegName(regId)); } } } fault = inst->staticInst->execute(&context, inst->traceData); /*Set the predicate for tracing and dump*/ if(inst->traceData){ inst->traceData->setPredicate(context.readPredicate()); } // Cod adaugat // Print destination register values if(inst->staticInst->opClass()==FloatMultOp){ if (disassembledInst.find("fmul") != std::string::npos) { // Cast from StaticInstPtr to StaticInst StaticInst* leInst = inst->staticInst.get(); for (int i = 0; i < leInst->numDestRegs(); i++) { RegId regId = leInst->destRegIdx(i); float regValue; context.getFloatRegOperand(leInst, i, &regValue); DPRINTF(MinorExecuteOp, " DestReg%d=%d (%s)\n", /*i, regValue,*/ printRegName(regId)); } } } // Cod adaugat and the getFloatRegOperand looks like this [image: image.png] has anyone tried to do this before and can help me? Thank you very much! Have a nice day!