本文整理汇总了C++中Assembler::SubCCR方法的典型用法代码示例。如果您正苦于以下问题:C++ Assembler::SubCCR方法的具体用法?C++ Assembler::SubCCR怎么用?C++ Assembler::SubCCR使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Assembler
的用法示例。
在下文中一共展示了Assembler::SubCCR方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: gen
void AbstractArrayAtNode::gen() {
BasicNode::gen();
Label* argFail = NULL; // if arg isn't a smi
Label* indexFail = NULL; // if arg is out of bounds
Assembler* a = theAssembler;
Location arr = genHelper->moveToReg(_src, Temp2);
Location index = genHelper->moveToReg(arg, Temp1);
Location size = Temp3;
// load array size now (avoids load interlock for range check)
a->LoadI(arr, sizeOffset, size);
if (!intArg) {
// CP may have propagated a constant into arg
intArg = arg->isConstPReg() && ((ConstPReg*)arg)->constant->is_smi();
}
if (!intArg) {
// test arg for smiOop
if (SICCountTypeTests) {
a->startTypeTest(1, false, true);
a->doOneTypeTest();
}
if (SICCountIntTagTests) a->markTagTest(1);
a->AndCCI(index, Tag_Mask, G0);
argFail = argFail->unify(a->BneForward(false));
if (SICCountTypeTests) a->endTypeTest();
}
argFail = argFail->unify(testArg2());
a->SubCCR(index, size, G0);
indexFail = a->BgeuForward(false);
Location res = isRegister(_dest->loc) ? _dest->loc : Temp1;
bool needDestStore = genAccess(arr, index, res);
if (needDestStore && !isRegister(_dest->loc)) {
genHelper->moveRegToLoc(res, _dest->loc);
}
Label* done = a->BraForward(true);
MergeNode* failMerge = (MergeNode*)next1();
if (argFail) {
argFail->define();
if (error) {
Location err = isRegister(error->loc) ? error->loc : Temp1;
genHelper->loadImmediateOop(VMString[BADTYPEERROR], err);
if (err != error->loc) genHelper->moveRegToLoc(err, error->loc);
}
if (failMerge) // test added by dmu 4/27/96
failMerge->l = failMerge->l->unify(a->BraForward(true));
}
indexFail->define();
if (error) {
Location err = isRegister(error->loc) ? error->loc : Temp1;
genHelper->loadImmediateOop(VMString[BADINDEXERROR], err);
if (err != error->loc) genHelper->moveRegToLoc(err, error->loc);
}
if (failMerge) // test added by dmu 4/27/96
failMerge->l = failMerge->l->unify(a->BraForward(true));
done->define();
}
示例2: initComparing
void CountCodePattern::initComparing() {
instsSize = 13 * 4;
// 0: sethi count_addr, Temp1
// 1: ld [Temp1+lo(count_addr)], Temp2
// 2: setHi limit, Temp1
// 3: inc Temp2
// 4: cmp Temp2, Temp1
// 5: sethi count_addr, Temp1
// 6: st Temp2, [Temp1+lo(count_addr)]
// 7: beq 10
// 8: sethi jump_addr, Temp1
// 9: jmpl Temp1 + low(jump_addr), g0
//10: sethi recompile_addr, Temp2
//11: jmpl Temp2 + low(recompile_addr), linkReg
//12: nop
countAddr_offset = 0;
countAddr_offset2 = 5;
ld_offset = 1;
st_offset = 6;
nm_sethi_offset = 8;
nm_jmp_offset = 9;
limit_sethi_offset = 2;
recompile_offset = 10;
Assembler* a = new Assembler(instsSize, instsSize, false, true);
a->SetHiA(0, Temp1);
a->LoadI(Temp1, 0, Temp2);
a->SetHiA(0, Temp1);
a->AddI(Temp2, 1, Temp2);
a->SubCCR(Temp2, Temp1, G0);
a->SetHiA(0, Temp1);
a->StoreI(Temp1, 0, Temp2);
Label* l = a->BgeForward(false);
a->SetHiX(0, CodeAddressOperand, Temp1);
a->JmpLC(Temp1, 0, G0);
l->define();
a->SetHiP(Memory->code->trapdoors->Recompile_stub_td(), Temp2);
a->JmpLP(Temp2, Memory->code->trapdoors->Recompile_stub_td(), RecompileLinkReg);
a->Nop();
pattern = (pc_t)AllocateHeap(instsSize, "countStub pattern");
copy_words((int32*)a->instsStart, (int32*)pattern, instsSize / 4);
a->finalize();
}
示例3: checkRecompilation
void SICGenHelper::checkRecompilation(fint countID) {
// test for recompilation
// sethi &counter, t3
// load [t3 + lo%(&counter)], t4
// add t4, 1, t4
// cmp t4, recompileLimit
// bne ok
// store t4, [t3 + lo%(&counter)]
// <jumpTo recompiler>
// nop
// ok:
// di recompilation doesn't work right now - see recompile.c
if (theSIC->diLink) return;
Assembler* ass = theAssembler;
ass->Comment("test for recompilation");
void* counter = &useCount[countID];
ass->SetHiA(counter, Temp3);
ass->LoadA(Temp3, counter, Temp2);
ass->AddI(Temp2, 1, Temp2);
fint limit = recompileLimit(0);
if (limit < maxImmediate) {
ass->SubCCI(Temp2, limit, G0);
} else {
ass->SetHiI2(limit, Temp1); // limit is multiple of 1024
ass->SubCCR(Temp2, Temp1, G0);
}
Label* ok = ass->BneForward(false);
// call recompiler
void* fnaddr = first_inst_addr(
theSIC->diLink ? Memory->zone->DIRecompile_stub_td()
: Memory->zone-> Recompile_stub_td() );
Location linkReg = theSIC->diLink ? DIRecompileLinkReg : RecompileLinkReg;
jumpTo(fnaddr, linkReg, linkReg);
// The store below is always executed so that we will call the recompiler
// exactly once (even if it cannot recompile for some reason).
ok->define();
assert(Temp3 != linkReg, "counter addr reg will be trashed by jump");
ass->StoreA(Temp3, counter, Temp2);
}