本文整理汇总了C++中regno函数的典型用法代码示例。如果您正苦于以下问题:C++ regno函数的具体用法?C++ regno怎么用?C++ regno使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了regno函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: moveargs
static NODE *
moveargs(NODE *p, int *regp)
{
NODE *r, **rp;
int lastreg;
int reg;
if (p->n_op == CM) {
p->n_left = moveargs(p->n_left, regp);
r = p->n_right;
rp = &p->n_right;
} else {
r = p;
rp = &p;
}
lastreg = A0 + nargregs - 1;
reg = *regp;
if (reg > lastreg && r->n_op != STARG)
*rp = block(FUNARG, r, NIL, r->n_type, r->n_df, r->n_ap);
else if (r->n_op == STARG) {
*rp = movearg_struct(r, p, regp);
} else if (DEUNSIGN(r->n_type) == LONGLONG) {
*rp = movearg_64bit(r, regp);
} else if (r->n_type == DOUBLE || r->n_type == LDOUBLE) {
/* XXX bounce in and out of temporary to change to longlong */
NODE *t1 = tempnode(0, LONGLONG, 0, 0);
int tmpnr = regno(t1);
NODE *t2 = tempnode(tmpnr, r->n_type, r->n_df, r->n_ap);
t1 = movearg_64bit(t1, regp);
r = block(ASSIGN, t2, r, r->n_type, r->n_df, r->n_ap);
if (p->n_op == CM) {
p->n_left = buildtree(CM, p->n_left, t1);
p->n_right = r;
} else {
p = buildtree(CM, t1, r);
}
} else if (r->n_type == FLOAT) {
/* XXX bounce in and out of temporary to change to int */
NODE *t1 = tempnode(0, INT, 0, 0);
int tmpnr = regno(t1);
NODE *t2 = tempnode(tmpnr, r->n_type, r->n_df, r->n_ap);
t1 = movearg_32bit(t1, regp);
r = block(ASSIGN, t2, r, r->n_type, r->n_df, r->n_ap);
if (p->n_op == CM) {
p->n_left = buildtree(CM, p->n_left, t1);
p->n_right = r;
} else {
p = buildtree(CM, t1, r);
}
} else {
*rp = movearg_32bit(r, regp);
}
return p;
}
开发者ID:JamesLinus,项目名称:pcc,代码行数:57,代码来源:code.c
示例2: myormake
/*
* Do the actual conversion of offstar-found OREGs into real OREGs.
* For simple OREGs conversion should already be done.
*/
void
myormake(NODE *q)
{
static int shtbl[] = { 1,2,4,8 };
NODE *p, *r;
CONSZ c = 0;
int r1, r2, sh;
int mkconv = 0;
char *n = "";
#define risreg(p) (p->n_op == REG)
if (x2debug) {
printf("myormake(%p)\n", q);
fwalk(q, e2print, 0);
}
r1 = r2 = MAXREGS;
sh = 1;
r = p = q->n_left;
if ((p->n_op == PLUS || p->n_op == MINUS) && p->n_left->n_op == ICON) {
c = p->n_left->n_lval;
n = p->n_left->n_name;
p = p->n_right;
}
if (p->n_op == PLUS && risreg(p->n_left)) {
r1 = regno(p->n_left);
p = p->n_right;
}
if (findls(p, 1)) {
if (p->n_op == SCONV)
p = p->n_left;
sh = shtbl[(int)p->n_right->n_lval];
r2 = regno(p->n_left);
mkconv = 1;
} else if (risreg(p)) {
r2 = regno(p);
mkconv = 1;
} //else
// comperr("bad myormake tree");
if (mkconv == 0)
return;
q->n_op = OREG;
q->n_lval = c;
q->n_rval = R2PACK(r1, r2, sh);
q->n_name = n;
tfree(r);
if (x2debug) {
printf("myormake converted %p\n", q);
fwalk(q, e2print, 0);
}
}
开发者ID:MoochMcGee,项目名称:pcc-optimized,代码行数:60,代码来源:order.c
示例3: efcode
/*
* code for the end of a function
* deals with struct return here
* The return value is in (or pointed to by) RETREG.
*/
void
efcode(void)
{
struct symtab *sp;
extern int gotnr;
TWORD t;
NODE *p, *r, *l;
int typ, ssz, rno;
gotnr = 0; /* new number for next fun */
sp = cftnsp;
t = DECREF(sp->stype);
if (t != STRTY && t != UNIONTY)
return;
/* XXX should have one routine for this */
ngpr = nsse = 0;
if ((typ = argtyp(t, sp->sdf, sp->sap)) == STRREG || typ == STRCPX) {
/* Cast to long pointer and move to the registers */
/* XXX can overrun struct size */
/* XXX check carefully for SSE members */
if ((ssz = tsize(t, sp->sdf, sp->sap)) > SZLONG*2)
cerror("efcode1");
if (typ == STRCPX) {
t = DOUBLE;
rno = XMM0;
} else {
t = LONG;
rno = RAX;
}
if (ssz > SZLONG) {
p = block(REG, NIL, NIL, INCREF(t), 0, 0);
regno(p) = RAX;
p = buildtree(UMUL, buildtree(PLUS, p, bcon(1)), NIL);
ecomp(movtoreg(p, rno+1));
}
p = block(REG, NIL, NIL, INCREF(t), 0, 0);
regno(p) = RAX;
p = buildtree(UMUL, p, NIL);
ecomp(movtoreg(p, rno));
} else if (typ == STRMEM) {
r = block(REG, NIL, NIL, INCREF(t), sp->sdf, sp->sap);
regno(r) = RAX;
r = buildtree(UMUL, r, NIL);
l = tempnode(stroffset, INCREF(t), sp->sdf, sp->sap);
l = buildtree(UMUL, l, NIL);
ecomp(buildtree(ASSIGN, l, r));
l = block(REG, NIL, NIL, LONG, 0, 0);
regno(l) = RAX;
r = tempnode(stroffset, LONG, 0, 0);
ecomp(buildtree(ASSIGN, l, r));
} else
cerror("efcode");
}
开发者ID:rheoli,项目名称:pcc,代码行数:61,代码来源:code.c
示例4: param_retstruct
/* setup the hidden pointer to struct return parameter
* used by bfcode() */
static void
param_retstruct(void)
{
NODE *p, *q;
p = tempnode(0, PTR-FTN+cftnsp->stype, 0, cftnsp->sap);
rvnr = regno(p);
q = block(REG, NIL, NIL, PTR+STRTY, 0, cftnsp->sap);
regno(q) = R0;
p = buildtree(ASSIGN, p, q);
ecomp(p);
}
开发者ID:MoochMcGee,项目名称:pcc-optimized,代码行数:14,代码来源:code.c
示例5: param_float
/* setup a float param on the stack
* used by bfcode() */
static void
param_float(struct symtab *sym, int *argofsp, int dotemps)
{
NODE *p, *q, *t;
int tmpnr;
/*
* we have to dump the float from the general register
* into a temp, since the register allocator doesn't like
* floats to be in CLASSA. This may not work for -xtemps.
*/
t = tempnode(0, INT, 0, 0);
tmpnr = regno(t);
q = block(REG, NIL, NIL, INT, 0, 0);
q->n_rval = R0 + (*argofsp)++;
p = buildtree(ASSIGN, t, q);
ecomp(p);
if (dotemps) {
sym->soffset = tmpnr;
sym->sflags |= STNODE;
} else {
q = tempnode(tmpnr, sym->stype, sym->sdf, sym->sap);
p = nametree(sym);
p = buildtree(ASSIGN, p, q);
ecomp(p);
}
}
开发者ID:MoochMcGee,项目名称:pcc-optimized,代码行数:31,代码来源:code.c
示例6: builtin_return_address
NODE *
builtin_return_address(const struct bitable *bt, NODE *a)
{
NODE *f;
if (a->n_op != ICON)
goto bad;
if (a->n_lval != 0)
werror("unsupported argument");
tfree(a);
f = block(REG, NIL, NIL, INCREF(PTR+CHAR), 0, 0);
regno(f) = FPREG;
f = block(UMUL,
block(PLUS, f,
bcon(16), INCREF(PTR+CHAR), 0, 0), NIL, PTR+CHAR, 0, 0);
f = makety(f, PTR+VOID, 0, 0, 0);
return f;
bad:
uerror("bad argument to __builtin_return_address");
return bcon(0);
}
开发者ID:Sciumo,项目名称:pcc,代码行数:25,代码来源:code.c
示例7: efcode
/*
* code for the end of a function
* deals with struct return here
*/
void
efcode(void)
{
NODE *p, *q;
// int sz;
#if 0
/* restore ac3 */
p = block(REG, 0, 0, INT, 0, 0);
regno(p) = 3;
q = tempnode(ac3temp, INT, 0, 0);
ecomp(buildtree(ASSIGN, p, q));
#endif
if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
return;
cerror("efcode");
/* address of return struct is in eax */
/* create a call to memcpy() */
/* will get the result in eax */
p = block(REG, NIL, NIL, CHAR+PTR, 0, 0);
// p->n_rval = EAX;
q = block(OREG, NIL, NIL, CHAR+PTR, 0, 0);
// q->n_rval = EBP;
q->n_lval = 8; /* return buffer offset */
p = block(CM, q, p, INT, 0, 0);
// sz = (tsize(STRTY, cftnsp->sdf, cftnsp->ssue)+SZCHAR-1)/SZCHAR;
// p = block(CM, p, bcon(sz), INT, 0, 0);
p->n_right->n_name = "";
p = block(CALL, bcon(0), p, CHAR+PTR, 0, 0);
p->n_left->n_name = "memcpy";
p = clocal(p);
send_passt(IP_NODE, p);
}
开发者ID:JamesLinus,项目名称:pcc,代码行数:39,代码来源:code.c
示例8: builtin_frame_address
NODE *
builtin_frame_address(const struct bitable *bt, NODE *a)
{
int nframes;
NODE *f;
if (a->n_op != ICON)
goto bad;
nframes = a->n_lval;
tfree(a);
f = block(REG, NIL, NIL, PTR+CHAR, 0, 0);
regno(f) = FPREG;
while (nframes--) {
f = block(UMUL,
block(PLUS, f,
bcon(12), INCREF(PTR+CHAR), 0, 0),
NIL, PTR+CHAR, 0, 0);
f = makety(f, PTR+CHAR, 0, 0, 0);
}
return f;
bad:
uerror("bad argument to __builtin_frame_address");
return bcon(0);
}
开发者ID:Sciumo,项目名称:pcc,代码行数:29,代码来源:code.c
示例9: builtin_return_address
NODE *
builtin_return_address(const struct bitable *bt, NODE *a)
{
int nframes;
NODE *f;
if (a->n_op != ICON)
goto bad;
nframes = (int)a->n_lval;
tfree(a);
f = block(REG, NIL, NIL, PTR+VOID, 0, 0);
regno(f) = FPREG;
while (nframes--)
f = block(UMUL, f, NIL, PTR+VOID, 0, 0);
f = block(PLUS, f, bcon(2), INCREF(PTR+VOID), 0, 0);
f = buildtree(UMUL, f, NIL);
return f;
bad:
uerror("bad argument to __builtin_return_address");
return bcon(0);
}
开发者ID:ajinkya93,项目名称:netbsd-src,代码行数:27,代码来源:code.c
示例10: myormake
/*
* Do the actual conversion of offstar-found OREGs into real OREGs.
*/
void
myormake(NODE *p)
{
NODE *q = p->n_left;
if (x2debug) {
printf("myormake(%p)\n", p);
fwalk(p, e2print, 0);
}
if (inctree(q)) {
if (q->n_left->n_left->n_op == TEMP)
return;
p->n_op = OREG;
p->n_lval = 0; /* Add support for index offset */
p->n_rval = R2PACK(regno(q->n_left->n_left), 0, 1);
tfree(q);
return;
}
if (q->n_op != OREG)
return;
p->n_op = OREG;
p->n_lval = q->n_lval;
p->n_rval = R2PACK(q->n_rval, 0, 0);
nfree(q);
}
开发者ID:MoochMcGee,项目名称:pcc-optimized,代码行数:28,代码来源:order.c
示例11: bfcode
/*
* code for the beginning of a function; a is an array of
* indices in symtab for the arguments; n is the number
*/
void
bfcode(struct symtab **sp, int cnt)
{
struct symtab *sp2;
NODE *n;
int i;
if (cftnsp->stype == STRTY+FTN || cftnsp->stype == UNIONTY+FTN) {
/* Function returns struct, adjust arg offset */
for (i = 0; i < cnt; i++)
sp[i]->soffset += SZPOINT(INT);
}
if (xtemps == 0)
return;
/* put arguments in temporaries */
for (i = 0; i < cnt; i++) {
if (sp[i]->stype == STRTY || sp[i]->stype == UNIONTY ||
cisreg(sp[i]->stype) == 0)
continue;
sp2 = sp[i];
n = tempnode(0, sp[i]->stype, sp[i]->sdf, sp[i]->sap);
n = buildtree(ASSIGN, n, nametree(sp2));
sp[i]->soffset = regno(n->n_left);
sp[i]->sflags |= STNODE;
ecomp(n);
}
}
开发者ID:JamesLinus,项目名称:pcc,代码行数:33,代码来源:code.c
示例12: builtin_va_arg
static NODE *
builtin_va_arg(const struct bitable *bt, NODE *a)
{
NODE *p, *q, *r, *rv;
int sz, nodnum;
/* create a copy to a temp node of current ap */
p = ccopy(a->n_left);
q = tempnode(0, p->n_type, p->n_df, p->n_ap);
nodnum = regno(q);
rv = buildtree(ASSIGN, q, p);
r = a->n_right;
sz = (int)tsize(r->n_type, r->n_df, r->n_ap)/SZCHAR;
/* add one to ap */
#ifdef BACKAUTO
rv = buildtree(COMOP, rv , buildtree(PLUSEQ, a->n_left, bcon(sz)));
#else
#error fix wrong eval order in builtin_va_arg
ecomp(buildtree(MINUSEQ, a->n_left, bcon(sz)));
#endif
nfree(a->n_right);
nfree(a);
r = tempnode(nodnum, INCREF(r->n_type), r->n_df, r->n_ap);
return buildtree(COMOP, rv, buildtree(UMUL, r, NIL));
}
开发者ID:repos-holder,项目名称:openbsd-patches,代码行数:28,代码来源:builtins.c
示例13: efcode
/*
* code for the end of a function
* deals with struct return here
*/
void
efcode(void)
{
NODE *p, *q;
int tempnr;
int ty;
if (cftnsp->stype != STRTY+FTN && cftnsp->stype != UNIONTY+FTN)
return;
ty = cftnsp->stype - FTN;
q = block(REG, NIL, NIL, INCREF(ty), 0, cftnsp->sap);
q->n_rval = V0;
p = tempnode(0, INCREF(ty), 0, cftnsp->sap);
tempnr = regno(p);
p = buildtree(ASSIGN, p, q);
ecomp(p);
q = tempnode(tempnr, INCREF(ty), 0, cftnsp->sap);
q = buildtree(UMUL, q, NIL);
p = tempnode(rvnr, INCREF(ty), 0, cftnsp->sap);
p = buildtree(UMUL, p, NIL);
p = buildtree(ASSIGN, p, q);
ecomp(p);
q = tempnode(rvnr, INCREF(ty), 0, cftnsp->sap);
p = block(REG, NIL, NIL, INCREF(ty), 0, cftnsp->sap);
p->n_rval = V0;
p = buildtree(ASSIGN, p, q);
ecomp(p);
}
开发者ID:JamesLinus,项目名称:pcc,代码行数:38,代码来源:code.c
示例14: pusharg
/* called by moveargs() */
static NODE *
pusharg(NODE *p, int *regp)
{
NODE *q;
int sz;
/* convert to register size, if smaller */
sz = tsize(p->n_type, p->n_df, p->n_ap);
if (sz < SZINT)
p = block(SCONV, p, NIL, INT, 0, 0);
q = block(REG, NIL, NIL, INT, 0, 0);
regno(q) = SP;
if (szty(p->n_type) == 1) {
++(*regp);
q = block(MINUSEQ, q, bcon(4), INT, 0, 0);
} else {
(*regp) += 2;
q = block(MINUSEQ, q, bcon(8), INT, 0, 0);
}
q = block(UMUL, q, NIL, p->n_type, p->n_df, p->n_ap);
return buildtree(ASSIGN, q, p);
}
开发者ID:MoochMcGee,项目名称:pcc-optimized,代码行数:27,代码来源:code.c
示例15: param_32bit
/* setup a 32-bit param on the stack
* used by bfcode() */
static void
param_32bit(struct symtab *sym, int *argofsp, int dotemps)
{
NODE *p, *q;
q = block(REG, NIL, NIL, sym->stype, sym->sdf, sym->sap);
regno(q) = R0 + (*argofsp)++;
if (dotemps) {
p = tempnode(0, sym->stype, sym->sdf, sym->sap);
sym->soffset = regno(p);
sym->sflags |= STNODE;
} else {
p = nametree(sym);
}
p = buildtree(ASSIGN, p, q);
ecomp(p);
}
开发者ID:MoochMcGee,项目名称:pcc-optimized,代码行数:19,代码来源:code.c
示例16: bfcode
void
bfcode(struct symtab **sp, int n)
{
struct symtab *sp2;
NODE *p, *q;
int i, argbase, sz;
if (cftnsp->stype == STRTY+FTN || cftnsp->stype == UNIONTY+FTN) {
/* Move return address into temporary */
p = tempnode(0, INT, 0, 0);
strtemp = regno(p);
q = block(REG, 0, 0, INT, 0, 0);
regno(q) = R1;
ecomp(buildtree(ASSIGN, p, q));
}
/* correct arg alignment XXX should be done somewhere else */
argbase = ARGINIT;
for (i = 0; i < n; i++) {
sp2 = sp[i];
sz = tsize(sp2->stype, sp2->sdf, sp2->sap);
SETOFF(sz, SZINT);
sp2->soffset = argbase;
argbase += sz;
}
if (xtemps == 0)
return;
/* put arguments in temporaries */
for (i = 0; i < n; i++) {
if (sp[i]->stype == STRTY || sp[i]->stype == UNIONTY ||
cisreg(sp[i]->stype) == 0)
continue;
if (cqual(sp[i]->stype, sp[i]->squal) & VOL)
continue;
sp2 = sp[i];
p = tempnode(0, sp[i]->stype, sp[i]->sdf, sp[i]->sap);
p = buildtree(ASSIGN, p, nametree(sp2));
sp[i]->soffset = regno(p->n_left);
sp[i]->sflags |= STNODE;
ecomp(p);
}
}
开发者ID:ajinkya93,项目名称:netbsd-src,代码行数:46,代码来源:code.c
示例17: movearg_float
/* called from moveargs() */
static NODE *
movearg_float(NODE *p, int *regp)
{
NODE *q, *r;
TWORD ty = INCREF(p->n_type);
int tmpnr;
/*
* Floats are passed in the general registers for
* compatibily with libraries compiled to handle soft-float.
*/
if (xtemps) {
/* bounce on TOS */
r = block(REG, NIL, NIL, ty, p->n_df, p->n_ap);
regno(r) = SP;
r = block(PLUS, r, bcon(-4), ty, p->n_df, p->n_ap);
r = block(UMUL, r, NIL, p->n_type, p->n_df, p->n_ap);
r = buildtree(ASSIGN, r, p);
ecomp(r);
/* bounce into temp */
r = block(REG, NIL, NIL, PTR+INT, 0, 0);
regno(r) = SP;
r = block(PLUS, r, bcon(-8), PTR+INT, 0, 0);
r = block(UMUL, r, NIL, INT, 0, 0);
q = tempnode(0, INT, 0, 0);
tmpnr = regno(q);
r = buildtree(ASSIGN, q, r);
ecomp(r);
} else {
/* copy directly into temp */
q = tempnode(0, p->n_type, p->n_df, p->n_ap);
tmpnr = regno(q);
r = buildtree(ASSIGN, q, p);
ecomp(r);
}
/* copy from temp to register parameter */
r = tempnode(tmpnr, INT, 0, 0);
q = block(REG, NIL, NIL, INT, 0, 0);
regno(q) = (*regp)++;
p = buildtree(ASSIGN, q, r);
return p;
}
开发者ID:MoochMcGee,项目名称:pcc-optimized,代码行数:47,代码来源:code.c
示例18: movtoreg
static NODE *
movtoreg(NODE *p, int rno)
{
NODE *r;
r = block(REG, NIL, NIL, p->n_type, p->n_df, p->n_ap);
regno(r) = rno;
return clocal(buildtree(ASSIGN, r, p));
}
开发者ID:fhector,项目名称:helenOS-0.5-Hector,代码行数:9,代码来源:code.c
示例19: mkstkref
static NODE *
mkstkref(int off, TWORD typ)
{
NODE *p;
p = block(REG, NIL, NIL, PTR|typ, 0, MKAP(LONG));
regno(p) = FPREG;
return buildtree(PLUS, p, bcon(off/SZCHAR));
}
开发者ID:fhector,项目名称:helenOS-0.5-Hector,代码行数:9,代码来源:code.c
示例20: bfcode
/*
* code for the beginning of a function; 'a' is an array of
* indices in symtab for the arguments; n is the number
*/
void
bfcode(struct symtab **a, int cnt)
{
struct symtab *sp;
NODE *p, *q;
int i, n, sz;
if (cftnsp->stype == STRTY+FTN || cftnsp->stype == UNIONTY+FTN) {
/* Function returns struct, adjust arg offset */
for (i = 0; i < n; i++)
a[i]->soffset += SZPOINT(LONG);
}
/* recalculate the arg offset and create TEMP moves */
for (n = 0, i = 0; i < cnt; i++) {
sp = a[i];
sz = szty(sp->stype);
if (n % sz)
n++; /* XXX LDOUBLE */
if (n < 4) {
p = tempnode(0, sp->stype, sp->sdf, sp->ssue);
/* TODO p->n_left->n_lval = -(32 + n * 4); */
q = block(REG, NIL, NIL, sp->stype, sp->sdf, sp->ssue);
q->n_rval = argreg(sp->stype, &n);
p = buildtree(ASSIGN, p, q);
sp->soffset = regno(p->n_left);
sp->sflags |= STNODE;
ecomp(p);
} else {
sp->soffset += SZINT * n;
if (xtemps) {
/* put stack args in temps if optimizing */
p = tempnode(0, sp->stype, sp->sdf, sp->ssue);
p = buildtree(ASSIGN, p, buildtree(NAME, 0, 0));
sp->soffset = regno(p->n_left);
sp->sflags |= STNODE;
ecomp(p);
}
}
}
}
开发者ID:paploo,项目名称:pcc,代码行数:47,代码来源:code.c
注:本文中的regno函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论