现在的位置: 首页 > 综合 > 正文

jsr 指令

2013年05月09日 ⁄ 综合 ⁄ 共 1125字 ⁄ 字号 评论关闭

This instruction makes a delayed branch to the subroutine procedure at the specified address after
execution of the following instruction. Return address (PC + 4) is saved in PR, and a branch is
made to the address indicated by general register Rn. JSR is used in combination with RTS for

subroutine procedure calls.

JSR @Rn PC+4 PR, Rn PC 0100nnnn00001011

    DEFINE_OPCODE(op_jsr) {
        /* jsr retAddrDst(r) target(offset)

           Places the address of the next instruction into the retAddrDst
           register and jumps to offset target from the current instruction.
        */
        int retAddrDst = vPC[1].u.operand;
        int target = vPC[2].u.operand;
        callFrame->r(retAddrDst) = vPC + OPCODE_LENGTH(op_jsr);

        vPC += target;

        NEXT_INSTRUCTION();
    }

retAddrDst is the ret address, target is branch address.

void JIT::emit_op_jsr(Instruction* currentInstruction)
{
    int retAddrDst = currentInstruction[1].u.operand;
    int target = currentInstruction[2].u.operand;
    DataLabelPtr storeLocation = storePtrWithPatch(ImmPtr(0), Address(callFrameRegister, sizeof(Register) * retAddrDst));
    addJump(jump(), target);
    m_jsrSites.append(JSRInfo(storeLocation, label()));
    printf("[FELIXS][%s][%d] m_jsrSites.size():%d.\n", __FUNCTION__, __LINE__, m_jsrSites.size());    
}

抱歉!评论已关闭.