您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ stubCall函数代码示例

51自学网 2021-06-03 08:32:53
  C++
这篇教程C++ stubCall函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中stubCall函数的典型用法代码示例。如果您正苦于以下问题:C++ stubCall函数的具体用法?C++ stubCall怎么用?C++ stubCall使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了stubCall函数的18个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: linkSlowCase

void JIT::compileOpCallSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter, unsigned callLinkInfoIndex, OpcodeID opcodeID){    int argCount = instruction[2].u.operand;    int registerOffset = instruction[3].u.operand;    linkSlowCase(iter);    // Fast check for JS function.    Jump callLinkFailNotObject = emitJumpIfNotJSCell(regT0);    Jump callLinkFailNotJSFunction = branchPtr(NotEqual, Address(regT0), TrustedImmPtr(m_globalData->jsFunctionVPtr));    // Speculatively roll the callframe, assuming argCount will match the arity.    storePtr(callFrameRegister, Address(callFrameRegister, (RegisterFile::CallerFrame + registerOffset) * static_cast<int>(sizeof(Register))));    addPtr(Imm32(registerOffset * static_cast<int>(sizeof(Register))), callFrameRegister);    move(Imm32(argCount), regT1);    m_callStructureStubCompilationInfo[callLinkInfoIndex].callReturnLocation = emitNakedCall(opcodeID == op_construct ? m_globalData->jitStubs->ctiVirtualConstructLink() : m_globalData->jitStubs->ctiVirtualCallLink());    // Done! - return back to the hot path.    ASSERT(OPCODE_LENGTH(op_call) == OPCODE_LENGTH(op_call_eval));    ASSERT(OPCODE_LENGTH(op_call) == OPCODE_LENGTH(op_construct));    emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_call));    // This handles host functions    callLinkFailNotObject.link(this);    callLinkFailNotJSFunction.link(this);    JITStubCall stubCall(this, opcodeID == op_construct ? cti_op_construct_NotJSConstruct : cti_op_call_NotJSFunction);    stubCall.addArgument(regT0);    stubCall.addArgument(JIT::Imm32(registerOffset));    stubCall.addArgument(JIT::Imm32(argCount));    stubCall.call();    sampleCodeBlock(m_codeBlock);}
开发者ID:mulriple,项目名称:Webkit-Projects,代码行数:35,


示例2: stubCall

void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned){    int callee = instruction[1].u.operand;    int argCount = instruction[2].u.operand;    int registerOffset = instruction[3].u.operand;    // Handle eval    Jump wasEval;    if (opcodeID == op_call_eval) {        JITStubCall stubCall(this, cti_op_call_eval);        stubCall.addArgument(callee, regT0);        stubCall.addArgument(JIT::Imm32(registerOffset));        stubCall.addArgument(JIT::Imm32(argCount));        stubCall.call();        wasEval = branchPtr(NotEqual, regT0, TrustedImmPtr(JSValue::encode(JSValue())));    }    emitGetVirtualRegister(callee, regT0);    // Check for JSFunctions.    emitJumpSlowCaseIfNotJSCell(regT0);    addSlowCase(branchPtr(NotEqual, Address(regT0), TrustedImmPtr(m_globalData->jsFunctionVPtr)));    // Speculatively roll the callframe, assuming argCount will match the arity.    storePtr(callFrameRegister, Address(callFrameRegister, (RegisterFile::CallerFrame + registerOffset) * static_cast<int>(sizeof(Register))));    addPtr(Imm32(registerOffset * static_cast<int>(sizeof(Register))), callFrameRegister);    move(Imm32(argCount), regT1);    emitNakedCall(opcodeID == op_construct ? m_globalData->jitStubs->ctiVirtualConstruct() : m_globalData->jitStubs->ctiVirtualCall());    if (opcodeID == op_call_eval)        wasEval.link(this);    sampleCodeBlock(m_codeBlock);}
开发者ID:mulriple,项目名称:Webkit-Projects,代码行数:35,


示例3: breakpoint

void JIT::emitSlow_op_div(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter){    unsigned result = currentInstruction[1].u.operand;    unsigned op1 = currentInstruction[2].u.operand;    unsigned op2 = currentInstruction[3].u.operand;    OperandTypes types = OperandTypes::fromInt(currentInstruction[4].u.operand);    if (types.first().definitelyIsNumber() && types.second().definitelyIsNumber()) {#ifndef NDEBUG        breakpoint();#endif        return;    }    if (!isOperandConstantImmediateDouble(op1) && !isOperandConstantImmediateInt(op1)) {        if (!types.first().definitelyIsNumber())            linkSlowCase(iter);    }    if (!isOperandConstantImmediateDouble(op2) && !isOperandConstantImmediateInt(op2)) {        if (!types.second().definitelyIsNumber())            linkSlowCase(iter);    }    // There is an extra slow case for (op1 * -N) or (-N * op2), to check for 0 since this should produce a result of -0.    JITStubCall stubCall(this, cti_op_div);    stubCall.addArgument(op1, regT2);    stubCall.addArgument(op2, regT2);    stubCall.call(result);}
开发者ID:pelegri,项目名称:WebKit-PlayBook,代码行数:26,


示例4: stubCall

void JIT::emitSlow_op_rshift(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter){    unsigned result = currentInstruction[1].u.operand;    unsigned op1 = currentInstruction[2].u.operand;    unsigned op2 = currentInstruction[3].u.operand;    JITStubCall stubCall(this, cti_op_rshift);    if (isOperandConstantImmediateInt(op2)) {        linkSlowCase(iter);        stubCall.addArgument(regT0);        stubCall.addArgument(op2, regT2);    } else {        if (supportsFloatingPointTruncate()) {            linkSlowCase(iter);            linkSlowCase(iter);            linkSlowCase(iter);            // We're reloading op1 to regT0 as we can no longer guarantee that            // we have not munged the operand.  It may have already been shifted            // correctly, but it still will not have been tagged.            stubCall.addArgument(op1, regT0);            stubCall.addArgument(regT2);        } else {            linkSlowCase(iter);            linkSlowCase(iter);            stubCall.addArgument(regT0);            stubCall.addArgument(regT2);        }    }    stubCall.call(result);}
开发者ID:pelegri,项目名称:WebKit-PlayBook,代码行数:32,


示例5: emitLoadTag

void JIT::compileLoadVarargs(Instruction* instruction){    int thisValue = instruction[2].u.operand;    int arguments = instruction[3].u.operand;    int firstFreeRegister = instruction[4].u.operand;    JumpList slowCase;    JumpList end;    if (m_codeBlock->usesArguments() && arguments == m_codeBlock->argumentsRegister()) {        emitLoadTag(arguments, regT1);        slowCase.append(branch32(NotEqual, regT1, TrustedImm32(JSValue::EmptyValueTag)));        load32(payloadFor(RegisterFile::ArgumentCount), regT2);        slowCase.append(branch32(Above, regT2, TrustedImm32(Arguments::MaxArguments + 1)));        // regT2: argumentCountIncludingThis        move(regT2, regT3);        add32(TrustedImm32(firstFreeRegister + RegisterFile::CallFrameHeaderSize), regT3);        lshift32(TrustedImm32(3), regT3);        addPtr(callFrameRegister, regT3);        // regT3: newCallFrame        slowCase.append(branchPtr(Below, AbsoluteAddress(m_globalData->interpreter->registerFile().addressOfEnd()), regT3));        // Initialize ArgumentCount.        store32(regT2, payloadFor(RegisterFile::ArgumentCount, regT3));        // Initialize 'this'.        emitLoad(thisValue, regT1, regT0);        store32(regT0, Address(regT3, OBJECT_OFFSETOF(JSValue, u.asBits.payload) + (CallFrame::thisArgumentOffset() * static_cast<int>(sizeof(Register)))));        store32(regT1, Address(regT3, OBJECT_OFFSETOF(JSValue, u.asBits.tag) + (CallFrame::thisArgumentOffset() * static_cast<int>(sizeof(Register)))));        // Copy arguments.        neg32(regT2);        end.append(branchAdd32(Zero, TrustedImm32(1), regT2));        // regT2: -argumentCount;        Label copyLoop = label();        load32(BaseIndex(callFrameRegister, regT2, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.payload) +(CallFrame::thisArgumentOffset() * static_cast<int>(sizeof(Register)))), regT0);        load32(BaseIndex(callFrameRegister, regT2, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag) +(CallFrame::thisArgumentOffset() * static_cast<int>(sizeof(Register)))), regT1);        store32(regT0, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.payload) +(CallFrame::thisArgumentOffset() * static_cast<int>(sizeof(Register)))));        store32(regT1, BaseIndex(regT3, regT2, TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag) +(CallFrame::thisArgumentOffset() * static_cast<int>(sizeof(Register)))));        branchAdd32(NonZero, TrustedImm32(1), regT2).linkTo(copyLoop, this);        end.append(jump());    }    if (m_codeBlock->usesArguments() && arguments == m_codeBlock->argumentsRegister())        slowCase.link(this);    JITStubCall stubCall(this, cti_op_load_varargs);    stubCall.addArgument(thisValue);    stubCall.addArgument(arguments);    stubCall.addArgument(Imm32(firstFreeRegister));    stubCall.call(regT3);    if (m_codeBlock->usesArguments() && arguments == m_codeBlock->argumentsRegister())        end.link(this);}
开发者ID:xiaolu31,项目名称:webkit-node,代码行数:59,


示例6: stubCall

void JIT::compileOpCall(OpcodeID opcodeID, Instruction* instruction, unsigned callLinkInfoIndex){    int callee = instruction[1].u.operand;    int argCount = instruction[2].u.operand;    int registerOffset = instruction[3].u.operand;    Jump wasEval;    if (opcodeID == op_call_eval) {        JITStubCall stubCall(this, cti_op_call_eval);        stubCall.addArgument(callee);        stubCall.addArgument(JIT::Imm32(registerOffset));        stubCall.addArgument(JIT::Imm32(argCount));        stubCall.call();        wasEval = branch32(NotEqual, regT1, TrustedImm32(JSValue::EmptyValueTag));    }    emitLoad(callee, regT1, regT0);    DataLabelPtr addressOfLinkedFunctionCheck;    BEGIN_UNINTERRUPTED_SEQUENCE(sequenceOpCall);    Jump jumpToSlow = branchPtrWithPatch(NotEqual, regT0, addressOfLinkedFunctionCheck, TrustedImmPtr(0));    END_UNINTERRUPTED_SEQUENCE(sequenceOpCall);    addSlowCase(jumpToSlow);    ASSERT_JIT_OFFSET(differenceBetween(addressOfLinkedFunctionCheck, jumpToSlow), patchOffsetOpCallCompareToJump);    ASSERT(m_callStructureStubCompilationInfo.size() == callLinkInfoIndex);    m_callStructureStubCompilationInfo.append(StructureStubCompilationInfo());    m_callStructureStubCompilationInfo[callLinkInfoIndex].hotPathBegin = addressOfLinkedFunctionCheck;    m_callStructureStubCompilationInfo[callLinkInfoIndex].isCall = opcodeID != op_construct;    m_callStructureStubCompilationInfo[callLinkInfoIndex].bytecodeIndex = m_bytecodeOffset;    addSlowCase(branch32(NotEqual, regT1, TrustedImm32(JSValue::CellTag)));    // The following is the fast case, only used whan a callee can be linked.    // Fast version of stack frame initialization, directly relative to edi.    // Note that this omits to set up RegisterFile::CodeBlock, which is set in the callee    loadPtr(Address(regT0, OBJECT_OFFSETOF(JSFunction, m_scopeChain)), regT2);    store32(TrustedImm32(JSValue::Int32Tag), tagFor(registerOffset + RegisterFile::ArgumentCount));    store32(Imm32(argCount), payloadFor(registerOffset + RegisterFile::ArgumentCount));    storePtr(callFrameRegister, payloadFor(RegisterFile::CallerFrame + registerOffset, callFrameRegister));    emitStore(registerOffset + RegisterFile::Callee, regT1, regT0);    store32(TrustedImm32(JSValue::CellTag), tagFor(registerOffset + RegisterFile::ScopeChain));    store32(regT2, payloadFor(registerOffset + RegisterFile::ScopeChain));    addPtr(Imm32(registerOffset * sizeof(Register)), callFrameRegister);    // Call to the callee    m_callStructureStubCompilationInfo[callLinkInfoIndex].hotPathOther = emitNakedCall();        if (opcodeID == op_call_eval)        wasEval.link(this);    sampleCodeBlock(m_codeBlock);}
开发者ID:1833183060,项目名称:wke,代码行数:58,


示例7: getConstantOperand

void JIT::emitSlow_op_urshift(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter){    unsigned dst = currentInstruction[1].u.operand;    unsigned op1 = currentInstruction[2].u.operand;    unsigned op2 = currentInstruction[3].u.operand;    if (isOperandConstantImmediateInt(op2)) {        int shift = getConstantOperand(op2).asInt32();        // op1 = regT0        linkSlowCase(iter); // int32 check        if (supportsFloatingPointTruncate()) {            JumpList failures;            failures.append(emitJumpIfNotImmediateNumber(regT0)); // op1 is not a double            addPtr(tagTypeNumberRegister, regT0);            movePtrToDouble(regT0, fpRegT0);            failures.append(branchTruncateDoubleToInt32(fpRegT0, regT0));            if (shift)                urshift32(Imm32(shift & 0x1f), regT0);            if (shift < 0 || !(shift & 31))                failures.append(branch32(LessThan, regT0, Imm32(0)));            emitFastArithReTagImmediate(regT0, regT0);            emitPutVirtualRegister(dst, regT0);            emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_rshift));            failures.link(this);        }        if (shift < 0 || !(shift & 31))            linkSlowCase(iter); // failed to box in hot path    } else {        // op1 = regT0        // op2 = regT1        if (!isOperandConstantImmediateInt(op1)) {            linkSlowCase(iter); // int32 check -- op1 is not an int            if (supportsFloatingPointTruncate()) {                JumpList failures;                failures.append(emitJumpIfNotImmediateNumber(regT0)); // op1 is not a double                addPtr(tagTypeNumberRegister, regT0);                movePtrToDouble(regT0, fpRegT0);                failures.append(branchTruncateDoubleToInt32(fpRegT0, regT0));                failures.append(emitJumpIfNotImmediateInteger(regT1)); // op2 is not an int                emitFastArithImmToInt(regT1);                urshift32(regT1, regT0);                failures.append(branch32(LessThan, regT0, Imm32(0)));                emitFastArithReTagImmediate(regT0, regT0);                emitPutVirtualRegister(dst, regT0);                emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_rshift));                failures.link(this);            }        }                linkSlowCase(iter); // int32 check - op2 is not an int        linkSlowCase(iter); // Can't represent unsigned result as an immediate    }        JITStubCall stubCall(this, cti_op_urshift);    stubCall.addArgument(op1, regT0);    stubCall.addArgument(op2, regT1);    stubCall.call(dst);}
开发者ID:pelegri,项目名称:WebKit-PlayBook,代码行数:57,


示例8: stubCall

void JIT::compileCallEval(){    JITStubCall stubCall(this, cti_op_call_eval); // Initializes ScopeChain; ReturnPC; CodeBlock.    stubCall.call();    addSlowCase(branch64(Equal, regT0, TrustedImm64(JSValue::encode(JSValue()))));    emitGetFromCallFrameHeaderPtr(JSStack::CallerFrame, callFrameRegister);    sampleCodeBlock(m_codeBlock);}
开发者ID:fatman2021,项目名称:webkitgtk,代码行数:9,


示例9: stubCall

void JIT::compileCallEval(){    JITStubCall stubCall(this, cti_op_call_eval); // Initializes ScopeChain; ReturnPC; CodeBlock.    stubCall.call();    addSlowCase(branch32(Equal, regT1, TrustedImm32(JSValue::EmptyValueTag)));    emitGetFromCallFrameHeaderPtr(RegisterFile::CallerFrame, callFrameRegister);    sampleCodeBlock(m_codeBlock);}
开发者ID:xiaolu31,项目名称:webkit-node,代码行数:9,


示例10: stubCall

void JIT::emit_op_load_varargs(Instruction* currentInstruction){    int argCountDst = currentInstruction[1].u.operand;    int argsOffset = currentInstruction[2].u.operand;    JITStubCall stubCall(this, cti_op_load_varargs);    stubCall.addArgument(Imm32(argsOffset));    stubCall.call();    // Stores a naked int32 in the register file.    store32(returnValueRegister, Address(callFrameRegister, argCountDst * sizeof(Register)));}
开发者ID:youtube,项目名称:h5vcc_hh,代码行数:11,


示例11: linkSlowCase

void JIT::emitSlow_op_mod(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter){    unsigned result = currentInstruction[1].u.operand;    linkSlowCase(iter);    linkSlowCase(iter);    linkSlowCase(iter);    JITStubCall stubCall(this, cti_op_mod);    stubCall.addArgument(regT0);    stubCall.addArgument(regT2);    stubCall.call(result);}
开发者ID:pelegri,项目名称:WebKit-PlayBook,代码行数:12,


示例12: getSlowCase

void JIT::emitSlow_op_pre_dec(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter){    unsigned srcDst = currentInstruction[1].u.operand;    Jump notImm = getSlowCase(iter);    linkSlowCase(iter);    emitGetVirtualRegister(srcDst, regT0);    notImm.link(this);    JITStubCall stubCall(this, cti_op_pre_dec);    stubCall.addArgument(regT0);    stubCall.call(srcDst);}
开发者ID:pelegri,项目名称:WebKit-PlayBook,代码行数:12,


示例13: UNUSED_PARAM

void JIT::emitSlow_op_lshift(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter){    unsigned result = currentInstruction[1].u.operand;    unsigned op1 = currentInstruction[2].u.operand;    unsigned op2 = currentInstruction[3].u.operand;    UNUSED_PARAM(op1);    UNUSED_PARAM(op2);    linkSlowCase(iter);    linkSlowCase(iter);    JITStubCall stubCall(this, cti_op_lshift);    stubCall.addArgument(regT0);    stubCall.addArgument(regT2);    stubCall.call(result);}
开发者ID:pelegri,项目名称:WebKit-PlayBook,代码行数:15,


示例14: linkSlowCaseIfNotJSCell

void JIT::compileOpCallVarargsSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter){    int callee = instruction[1].u.operand;    linkSlowCaseIfNotJSCell(iter, callee);    linkSlowCase(iter);    JITStubCall stubCall(this, cti_op_call_NotJSFunction);    stubCall.addArgument(regT1, regT0);    stubCall.addArgument(regT3);    stubCall.addArgument(regT2);    stubCall.call();    sampleCodeBlock(m_codeBlock);}
开发者ID:Irrelon,项目名称:iOS-JavaScript-Bridge,代码行数:15,


示例15: ENABLE

void JIT::emitSlow_op_mod(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter){#if ENABLE(JIT_USE_SOFT_MODULO)    unsigned result = currentInstruction[1].u.operand;    unsigned op1 = currentInstruction[2].u.operand;    unsigned op2 = currentInstruction[3].u.operand;    linkSlowCase(iter);    linkSlowCase(iter);    linkSlowCase(iter);    JITStubCall stubCall(this, cti_op_mod);    stubCall.addArgument(op1, regT2);    stubCall.addArgument(op2, regT2);    stubCall.call(result);#else    ASSERT_NOT_REACHED();#endif}
开发者ID:pelegri,项目名称:WebKit-PlayBook,代码行数:17,


示例16: linkSlowCaseIfNotJSCell

void JIT::compileOpCallVarargsSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter){    int callee = instruction[1].u.operand;    linkSlowCaseIfNotJSCell(iter, callee);    Jump notCell = jump();    linkSlowCase(iter);    move(TrustedImm32(JSValue::CellTag), regT1); // Need to restore cell tag in regT1 because it was clobbered.    notCell.link(this);    JITStubCall stubCall(this, cti_op_call_NotJSFunction);    stubCall.addArgument(regT1, regT0);    stubCall.addArgument(regT3);    stubCall.addArgument(regT2);    stubCall.call();    sampleCodeBlock(m_codeBlock);}
开发者ID:1833183060,项目名称:wke,代码行数:18,


示例17: COMPILE_ASSERT

void JIT::compileBinaryArithOpSlowCase(OpcodeID opcodeID, Vector<SlowCaseEntry>::iterator& iter, unsigned result, unsigned op1, unsigned op2, OperandTypes types, bool op1HasImmediateIntFastCase, bool op2HasImmediateIntFastCase){    // We assume that subtracting TagTypeNumber is equivalent to adding DoubleEncodeOffset.    COMPILE_ASSERT(((JSImmediate::TagTypeNumber + JSImmediate::DoubleEncodeOffset) == 0), TagTypeNumber_PLUS_DoubleEncodeOffset_EQUALS_0);    Jump notImm1;    Jump notImm2;    if (op1HasImmediateIntFastCase) {        notImm2 = getSlowCase(iter);    } else if (op2HasImmediateIntFastCase) {        notImm1 = getSlowCase(iter);    } else {        notImm1 = getSlowCase(iter);        notImm2 = getSlowCase(iter);    }    linkSlowCase(iter); // Integer overflow case - we could handle this in JIT code, but this is likely rare.    if (opcodeID == op_mul && !op1HasImmediateIntFastCase && !op2HasImmediateIntFastCase) // op_mul has an extra slow case to handle 0 * negative number.        linkSlowCase(iter);    emitGetVirtualRegister(op1, regT0);    Label stubFunctionCall(this);    JITStubCall stubCall(this, opcodeID == op_add ? cti_op_add : opcodeID == op_sub ? cti_op_sub : cti_op_mul);    if (op1HasImmediateIntFastCase || op2HasImmediateIntFastCase) {        emitGetVirtualRegister(op1, regT0);        emitGetVirtualRegister(op2, regT1);    }    stubCall.addArgument(regT0);    stubCall.addArgument(regT1);    stubCall.call(result);    Jump end = jump();    if (op1HasImmediateIntFastCase) {        notImm2.link(this);        if (!types.second().definitelyIsNumber())            emitJumpIfNotImmediateNumber(regT0).linkTo(stubFunctionCall, this);        emitGetVirtualRegister(op1, regT1);        convertInt32ToDouble(regT1, fpRegT1);        addPtr(tagTypeNumberRegister, regT0);        movePtrToDouble(regT0, fpRegT2);    } else if (op2HasImmediateIntFastCase) {        notImm1.link(this);        if (!types.first().definitelyIsNumber())            emitJumpIfNotImmediateNumber(regT0).linkTo(stubFunctionCall, this);        emitGetVirtualRegister(op2, regT1);        convertInt32ToDouble(regT1, fpRegT1);        addPtr(tagTypeNumberRegister, regT0);        movePtrToDouble(regT0, fpRegT2);    } else {        // if we get here, eax is not an int32, edx not yet checked.        notImm1.link(this);        if (!types.first().definitelyIsNumber())            emitJumpIfNotImmediateNumber(regT0).linkTo(stubFunctionCall, this);        if (!types.second().definitelyIsNumber())            emitJumpIfNotImmediateNumber(regT1).linkTo(stubFunctionCall, this);        addPtr(tagTypeNumberRegister, regT0);        movePtrToDouble(regT0, fpRegT1);        Jump op2isDouble = emitJumpIfNotImmediateInteger(regT1);        convertInt32ToDouble(regT1, fpRegT2);        Jump op2wasInteger = jump();        // if we get here, eax IS an int32, edx is not.        notImm2.link(this);        if (!types.second().definitelyIsNumber())            emitJumpIfNotImmediateNumber(regT1).linkTo(stubFunctionCall, this);        convertInt32ToDouble(regT0, fpRegT1);        op2isDouble.link(this);        addPtr(tagTypeNumberRegister, regT1);        movePtrToDouble(regT1, fpRegT2);        op2wasInteger.link(this);    }    if (opcodeID == op_add)        addDouble(fpRegT2, fpRegT1);    else if (opcodeID == op_sub)        subDouble(fpRegT2, fpRegT1);    else if (opcodeID == op_mul)        mulDouble(fpRegT2, fpRegT1);    else {        ASSERT(opcodeID == op_div);        divDouble(fpRegT2, fpRegT1);    }    moveDoubleToPtr(fpRegT1, regT0);    subPtr(tagTypeNumberRegister, regT0);    emitPutVirtualRegister(result, regT0);    end.link(this);}
开发者ID:pelegri,项目名称:WebKit-PlayBook,代码行数:88,


示例18: killLastResultRegister

void JIT::compileLoadVarargs(Instruction* instruction){    int thisValue = instruction[3].u.operand;    int arguments = instruction[4].u.operand;    int firstFreeRegister = instruction[5].u.operand;    killLastResultRegister();    JumpList slowCase;    JumpList end;    bool canOptimize = m_codeBlock->usesArguments()        && arguments == m_codeBlock->argumentsRegister().offset()        && !m_codeBlock->symbolTable()->slowArguments();    if (canOptimize) {        emitGetVirtualRegister(arguments, regT0);        slowCase.append(branch64(NotEqual, regT0, TrustedImm64(JSValue::encode(JSValue()))));        emitGetFromCallFrameHeader32(JSStack::ArgumentCount, regT0);        slowCase.append(branch32(Above, regT0, TrustedImm32(Arguments::MaxArguments + 1)));        // regT0: argumentCountIncludingThis        move(regT0, regT1);        neg64(regT1);        add64(TrustedImm32(firstFreeRegister - JSStack::CallFrameHeaderSize), regT1);        lshift64(TrustedImm32(3), regT1);        addPtr(callFrameRegister, regT1);        // regT1: newCallFrame        slowCase.append(branchPtr(Above, AbsoluteAddress(m_vm->interpreter->stack().addressOfEnd()), regT1));        // Initialize ArgumentCount.        store32(regT0, Address(regT1, JSStack::ArgumentCount * static_cast<int>(sizeof(Register)) + OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload)));        // Initialize 'this'.        emitGetVirtualRegister(thisValue, regT2);        store64(regT2, Address(regT1, CallFrame::thisArgumentOffset() * static_cast<int>(sizeof(Register))));        // Copy arguments.        signExtend32ToPtr(regT0, regT0);        end.append(branchSub64(Zero, TrustedImm32(1), regT0));        // regT0: argumentCount        Label copyLoop = label();        load64(BaseIndex(callFrameRegister, regT0, TimesEight, CallFrame::thisArgumentOffset() * static_cast<int>(sizeof(Register))), regT2);        store64(regT2, BaseIndex(regT1, regT0, TimesEight, CallFrame::thisArgumentOffset() * static_cast<int>(sizeof(Register))));        branchSub64(NonZero, TrustedImm32(1), regT0).linkTo(copyLoop, this);        end.append(jump());    }    if (canOptimize)        slowCase.link(this);    JITStubCall stubCall(this, cti_op_load_varargs);    stubCall.addArgument(thisValue, regT0);    stubCall.addArgument(arguments, regT0);    stubCall.addArgument(Imm32(firstFreeRegister));    stubCall.call(regT1);    if (canOptimize)        end.link(this);}
开发者ID:webOS-ports,项目名称:webkit,代码行数:63,



注:本文中的stubCall函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ style函数代码示例
C++ strv_length函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。