本文整理汇总了C++中regalloc函数的典型用法代码示例。如果您正苦于以下问题:C++ regalloc函数的具体用法?C++ regalloc怎么用?C++ regalloc使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了regalloc函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: udivgen
void
udivgen(Node *l, Node *r, Node *ax, Node *dx)
{
int a, s, t;
uint32 m;
Node nod;
a = udiv(r->vconst, &m, &s, &t);
//print("a=%ud i=%ld p=%d s=%d m=%lux\n", a, (int32)r->vconst, t, s, m);
if(t != 0) {
gins(AMOVL, l, ax);
gins(ASHRL, nodconst(t), ax);
gins(AMOVL, nodconst(m), dx);
gins(AMULL, dx, Z);
}
else if(a) {
if(l->op != OREGISTER) {
regalloc(&nod, l, Z);
gins(AMOVL, l, &nod);
l = &nod;
}
gins(AMOVL, nodconst(m), ax);
gins(AMULL, l, Z);
gins(AADDL, l, dx);
gins(ARCRL, nodconst(1), dx);
if(l == &nod)
regfree(l);
}
else {
gins(AMOVL, nodconst(m), ax);
gins(AMULL, l, Z);
}
if(s != 0)
gins(ASHRL, nodconst(s), dx);
}
开发者ID:8l,项目名称:go-learn,代码行数:35,代码来源:div.c
示例2: bitstore
void
bitstore(Node *b, Node *n1, Node *n2, Node *n3, Node *nn)
{
int32_t v;
Node nod;
int sh;
regalloc(&nod, b->left, Z);
v = ~0 + (1L << b->type->nbits);
gopcode(OAND, types[TLONG], nodconst(v), n1);
gmove(n1, &nod);
if(nn != Z)
gmove(n1, nn);
sh = b->type->shift;
if(sh > 0)
gopcode(OASHL, types[TLONG], nodconst(sh), &nod);
v <<= sh;
gopcode(OAND, types[TLONG], nodconst(~v), n3);
gopcode(OOR, types[TLONG], n3, &nod);
gmove(&nod, n2);
regfree(&nod);
regfree(n1);
regfree(n2);
regfree(n3);
}
开发者ID:carriercomm,项目名称:legacy,代码行数:26,代码来源:swt.c
示例3: bitstore
void
bitstore(Node *b, Node *n1, Node *n2, Node *n3, Node *nn)
{
long v;
Node nod, *l;
int sh;
/*
* n1 has adjusted/masked value
* n2 has address of cell
* n3 has contents of cell
*/
l = b->left;
regalloc(&nod, l, Z);
v = ~0 + (1L << b->type->nbits);
gopcode(OAND, nodconst(v), Z, n1);
gopcode(OAS, n1, Z, &nod);
if(nn != Z)
gopcode(OAS, n1, Z, nn);
sh = b->type->shift;
if(sh > 0)
gopcode(OASHL, nodconst(sh), Z, &nod);
v <<= sh;
gopcode(OAND, nodconst(~v), Z, n3);
gopcode(OOR, n3, Z, &nod);
gopcode(OAS, &nod, Z, n2);
regfree(&nod);
regfree(n1);
regfree(n2);
regfree(n3);
}
开发者ID:AustenConrad,项目名称:plan-9,代码行数:32,代码来源:swt.c
示例4: swit1
void
swit1(C1 *q, int nc, long def, Node *n)
{
Node tn;
regalloc(&tn, ®node, Z);
swit2(q, nc, def, n, &tn);
regfree(&tn);
}
开发者ID:AustenConrad,项目名称:plan-9,代码行数:9,代码来源:swt.c
示例5: bitstore
void
bitstore(Node *b, int n1, int n2, int n3, int result, Node *nn)
{
long v;
Node *l;
Type *t;
int sh, g, gs;
/*
* n1 has adjusted/masked value
* n2 has address of cell
* n3 has contents of cell
*/
t = tfield;
l = b->left;
g = regalloc(t, D_NONE);
v = ~0 + (1L << b->type->nbits);
gopcode(OAND, t, D_CONST, nodconst(v), n1, l);
gmove(t, t, n1, l, g, l);
if(result != D_NONE)
gmove(t, nn->type, n1, l, result, nn);
sh = b->type->shift;
if(sh > 0) {
if(sh >= 8) {
gs = regalloc(t, D_NONE);
gmove(t, t, D_CONST, nodconst(sh), gs, l);
gopcode(OASHL, t, gs, l, g, l);
regfree(gs);
} else
gopcode(OASHL, t, D_CONST, nodconst(sh), g, l);
}
v <<= sh;
gopcode(OAND, t, D_CONST, nodconst(~v), n3, l);
gopcode(OOR, t, n3, l, g, l);
gmove(t, t, g, l, n2|I_INDIR, l);
regfree(g);
regfree(n1);
regfree(n2);
regfree(n3);
}
开发者ID:8l,项目名称:inferno,代码行数:42,代码来源:swt.c
示例6: sext
void
sext(Node *d, Node *s, Node *l)
{
if(s->reg == D_AX && !nodreg(d, Z, D_DX)) {
reg[D_DX]++;
gins(ACDQ, Z, Z);
}
else {
regalloc(d, l, Z);
gins(AMOVL, s, d);
gins(ASARL, nodconst(31), d);
}
}
开发者ID:8l,项目名称:go-learn,代码行数:13,代码来源:div.c
示例7: lcgen
void
lcgen(Node *n, Node *nn)
{
Prog *p1;
Node nod;
if(debug['g']) {
prtree(nn, "lcgen lhs");
prtree(n, "lcgen");
}
if(n == Z || n->type == T)
return;
if(nn == Z) {
nn = &nod;
regalloc(&nod, n, Z);
}
switch(n->op) {
default:
if(n->addable < INDEXED) {
diag(n, "unknown op in lcgen: %O", n->op);
break;
}
nod = *n;
nod.op = OADDR;
nod.left = n;
nod.right = Z;
nod.type = types[TIND];
gopcode(OAS, &nod, Z, nn);
break;
case OCOMMA:
cgen(n->left, n->left);
lcgen(n->right, nn);
break;
case OIND:
cgen(n->left, nn);
break;
case OCOND:
bcgen(n->left, 1);
p1 = p;
lcgen(n->right->left, nn);
gbranch(OGOTO);
patch(p1, pc);
p1 = p;
lcgen(n->right->right, nn);
patch(p1, pc);
break;
}
}
开发者ID:AustenConrad,项目名称:plan-9,代码行数:51,代码来源:cgen.c
示例8: bitload
void
bitload(Node *b, Node *n1, Node *n2, Node *n3, Node *nn)
{
int sh;
int32_t v;
Node *l;
/*
* n1 gets adjusted/masked value
* n2 gets address of cell
* n3 gets contents of cell
*/
l = b->left;
if(n2 != Z) {
regalloc(n1, l, nn);
reglcgen(n2, l, Z);
regalloc(n3, l, Z);
gmove(n2, n3);
gmove(n3, n1);
} else {
regalloc(n1, l, nn);
cgen(l, n1);
}
if(b->type->shift == 0 && typeu[b->type->etype]) {
v = ~0 + (1L << b->type->nbits);
gopcode(OAND, tfield, nodconst(v), n1);
} else {
sh = 32 - b->type->shift - b->type->nbits;
if(sh > 0)
gopcode(OASHL, tfield, nodconst(sh), n1);
sh += b->type->shift;
if(sh > 0)
if(typeu[b->type->etype])
gopcode(OLSHR, tfield, nodconst(sh), n1);
else
gopcode(OASHR, tfield, nodconst(sh), n1);
}
}
开发者ID:carriercomm,项目名称:legacy,代码行数:38,代码来源:swt.c
示例9: swit1
void
swit1(C1 *q, int nc, int32 def, Node *n)
{
Node nreg;
regalloc(&nreg, n, Z);
if(typev[n->type->etype])
nreg.type = types[TVLONG];
else
nreg.type = types[TLONG];
cgen(n, &nreg);
swit2(q, nc, def, &nreg);
regfree(&nreg);
}
开发者ID:rosrad,项目名称:go-rep,代码行数:14,代码来源:swt.c
示例10: genasop
static void
genasop(int o, Node *l, Node *r, Node *nn)
{
Node nod, nod1, nod2;
int hardleft;
hardleft = l->addable < INDEXED || l->complex >= FNX;
if(l->complex >= r->complex) {
if(hardleft)
reglcgen(&nod2, l, Z);
else
nod2 = *l;
regalloc(&nod1, r, Z);
cgen(r, &nod1);
} else {
regalloc(&nod1, r, Z);
cgen(r, &nod1);
if(hardleft)
reglcgen(&nod2, l, Z);
else
nod2 = *l;
}
if(nod1.type == nod2.type || !typefd[nod1.type->etype])
regalloc(&nod, &nod2, nn);
else
regalloc(&nod, &nod1, Z);
gmove(&nod2, &nod);
gopcode(o, &nod1, Z, &nod);
gmove(&nod, &nod2);
if(nn != Z)
gmove(&nod2, nn);
regfree(&nod);
regfree(&nod1);
if(hardleft)
regfree(&nod2);
}
开发者ID:0intro,项目名称:plan9-mips,代码行数:36,代码来源:cgen.c
示例11: doswit
void
doswit(Node *n)
{
Case *c;
C1 *q, *iq;
long def, nc, i;
Node tn;
def = 0;
nc = 0;
for(c = cases; c->link != C; c = c->link) {
if(c->def) {
if(def)
diag(n, "more than one default in switch");
def = c->label;
continue;
}
nc++;
}
iq = alloc(nc*sizeof(C1));
q = iq;
for(c = cases; c->link != C; c = c->link) {
if(c->def)
continue;
q->label = c->label;
q->val = c->val;
q++;
}
qsort(iq, nc, sizeof(C1), swcmp);
if(debug['W'])
for(i=0; i<nc; i++)
print("case %2ld: = %.8lux\n", i, iq[i].val);
if(def == 0)
def = breakpc;
for(i=0; i<nc-1; i++)
if(iq[i].val == iq[i+1].val)
diag(n, "duplicate cases in switch %ld", iq[i].val);
regalloc(&tn, ®node, Z);
swit1(iq, nc, def, n, &tn);
regfree(&tn);
}
开发者ID:BGCX261,项目名称:znos-git,代码行数:42,代码来源:swt.c
示例12: create_verilog_signal
/*!
* @brief 信号のVerilog HDL生成
*/
int create_verilog_signal()
{
SIGNAL_TREE *now_signal_tree;
char *buf;
char *str;
buf = calloc(STR_MAX, 1);
now_signal_tree = signal_tree_top;
while(now_signal_tree != NULL){
strcpy(buf ,"");
if(
(now_signal_tree->flag == SIGNAL_FLAG_REG) ||
(now_signal_tree->flag == SIGNAL_FLAG_WIRE)
){
switch(now_signal_tree->flag){
case SIGNAL_FLAG_REG:
sprintf(buf, "reg ");
break;
case SIGNAL_FLAG_WIRE:
sprintf(buf, "wire ");
break;
default:
break;
}
if(now_signal_tree->width > 0){
sprintf(buf, "%s[%d:0] ", buf, now_signal_tree->width-1);
}
str = regalloc(now_signal_tree->label);
sprintf(buf, "%s%s;", buf, str);
free(str);
now_signal_tree->verilog = charalloc(buf);
}
now_signal_tree = now_signal_tree->next_ptr;
}
free(buf);
return 0;
}
开发者ID:aquaxis,项目名称:synverll,代码行数:44,代码来源:parser_ir_signal.c
示例13: _re_comp
int
_re_comp(regexp_t* re, const char* pattern, char* handle, unsigned int size)
{
register Env_t* env = (Env_t*)handle;
register int n;
if (size <= sizeof(Env_t))
return 50;
env->buf = env->cur = (char*)env + sizeof(Env_t);
env->size = size - sizeof(Env_t);
regalloc(env, block, REG_NOFREE);
n = regcomp(&env->re, pattern, REG_LENIENT|REG_NULL);
switch (n)
{
case 0:
break;
case REG_ERANGE:
n = 11;
break;
case REG_BADBR:
n = 16;
break;
case REG_ESUBREG:
n = 25;
break;
case REG_EPAREN:
n = 42;
break;
case REG_EBRACK:
n = 49;
break;
default:
n = 50;
break;
}
re->re_nbra = env->re.re_nsub;
return n;
}
开发者ID:ISLEcode,项目名称:kornshell,代码行数:38,代码来源:regexp.c
示例14: cgen
void
cgen(Node *n, Node *nn)
{
Node *l, *r;
Prog *p1;
Node nod, nod1, nod2, nod3, nod4;
int o;
long v, curs;
if(debug['g']) {
prtree(nn, "cgen lhs");
prtree(n, "cgen");
}
if(n == Z || n->type == T)
return;
if(typesuv[n->type->etype]) {
sugen(n, nn, n->type->width);
return;
}
l = n->left;
r = n->right;
o = n->op;
if(n->addable >= INDEXED) {
if(nn == Z) {
switch(o) {
default:
nullwarn(Z, Z);
break;
case OINDEX:
nullwarn(l, r);
break;
}
return;
}
gmove(n, nn);
return;
}
curs = cursafe;
if(n->complex >= FNX)
if(l->complex >= FNX)
if(r != Z && r->complex >= FNX)
switch(o) {
default:
regret(&nod, r);
cgen(r, &nod);
regsalloc(&nod1, r);
gopcode(OAS, &nod, Z, &nod1);
regfree(&nod);
nod = *n;
nod.right = &nod1;
cgen(&nod, nn);
return;
case OFUNC:
case OCOMMA:
case OANDAND:
case OOROR:
case OCOND:
case ODOT:
break;
}
switch(o) {
default:
diag(n, "unknown op in cgen: %O", o);
break;
case OAS:
if(l->op == OBIT)
goto bitas;
if(l->addable >= INDEXED && l->complex < FNX) {
if(nn != Z || r->addable < INDEXED) {
if(r->complex >= FNX && nn == Z)
regret(&nod, r);
else
regalloc(&nod, r, nn);
cgen(r, &nod);
gmove(&nod, l);
if(nn != Z)
gmove(&nod, nn);
regfree(&nod);
} else
gmove(r, l);
break;
}
if(l->complex >= r->complex) {
reglcgen(&nod1, l, Z);
if(r->addable >= INDEXED) {
gmove(r, &nod1);
if(nn != Z)
gmove(r, nn);
regfree(&nod1);
break;
}
regalloc(&nod, r, nn);
cgen(r, &nod);
} else {
//.........这里部分代码省略.........
开发者ID:AustenConrad,项目名称:plan-9,代码行数:101,代码来源:cgen.c
示例15: cgen
void
cgen(Node *n, int result, Node *nn)
{
Node *l, *r, nod;
int lg, rg, xg, yg, g, o;
long v;
Prog *p1;
if(n == Z || n->type == T)
return;
if(typesuv[n->type->etype]) {
sugen(n, result, nn, n->type->width);
return;
}
if(debug['g']) {
if(result == D_TREE)
prtree(nn, "result");
else
print("result = %R\n", result);
prtree(n, "cgen");
}
l = n->left;
r = n->right;
o = n->op;
if(n->addable >= INDEXED) {
if(result == D_NONE) {
if(nn == Z)
switch(o) {
default:
nullwarn(Z, Z);
break;
case OINDEX:
nullwarn(l, r);
break;
}
return;
}
gmove(n->type, nn->type, D_TREE, n, result, nn);
return;
}
v = 0; /* set */
switch(o) {
default:
diag(n, "unknown op in cgen: %O", o);
break;
case OAS:
if(l->op == OBIT)
goto bitas;
/*
* recursive use of result
*/
if(result == D_NONE)
if(l->addable > INDEXED)
if(l->complex < FNX) {
cgen(r, D_TREE, l);
break;
}
/*
* function calls on both sides
*/
if(l->complex >= FNX && r->complex >= FNX) {
cgen(r, D_TOS, r);
v = argoff;
lg = regaddr(result);
lcgen(l, lg, Z);
lg |= I_INDIR;
adjsp(v - argoff);
gmove(r->type, l->type, D_TOS, r, lg, l);
if(result != D_NONE)
gmove(l->type, nn->type, lg, l, result, nn);
regfree(lg);
break;
}
rg = D_TREE;
lg = D_TREE;
if(r->complex >= l->complex) {
/*
* right side before left
*/
if(result != D_NONE) {
rg = regalloc(n->type, result);
cgen(r, rg, n);
} else
if(r->complex >= FNX || r->addable < INDEXED) {
rg = regalloc(r->type, result);
cgen(r, rg, r);
}
if(l->addable < INDEXED) {
lg = regaddr(lg);
lcgen(l, lg, Z);
lg |= I_INDIR;
}
} else {
/*
* left before right
*/
//.........这里部分代码省略.........
开发者ID:8l,项目名称:inferno,代码行数:101,代码来源:cgen.c
示例16: gen
void
gen(Node *n)
{
Node *l;
Prog *sp, *spc, *spb;
Case *cn;
long sbc, scc;
int snbreak;
int g, o;
loop:
if(n == Z)
return;
nearln = n->lineno;
o = n->op;
if(debug['G'])
if(o != OLIST)
print("%L %O\n", nearln, o);
retok = 0;
switch(o) {
default:
complex(n);
doinc(n, PRE);
cgen(n, D_NONE, n);
doinc(n, POST);
break;
case OLIST:
gen(n->left);
rloop:
n = n->right;
goto loop;
case ORETURN:
retok = 1;
complex(n);
if(n->type == T)
break;
l = n->left;
if(l == Z) {
noretval(3);
gbranch(ORETURN);
break;
}
doinc(l, PRE);
if(typesuv[n->type->etype]) {
sugen(l, D_TREE, nodret, n->type->width);
doinc(l, POST);
noretval(3);
gbranch(ORETURN);
break;
}
g = regalloc(n->type, regret(n->type));
cgen(l, g, n);
doinc(l, POST);
if(typefd[n->type->etype])
noretval(1);
else
noretval(2);
gbranch(ORETURN);
regfree(g);
break;
case OLABEL:
l = n->left;
if(l) {
l->xoffset = pc;
if(l->label)
patch(l->label, pc);
}
gbranch(OGOTO); /* prevent self reference in reg */
patch(p, pc);
goto rloop;
case OGOTO:
retok = 1;
n = n->left;
if(n == Z)
return;
if(n->complex == 0) {
diag(Z, "label undefined: %s", n->sym->name);
return;
}
gbranch(OGOTO);
if(n->xoffset) {
patch(p, n->xoffset);
return;
}
if(n->label)
patch(n->label, pc-1);
n->label = p;
return;
case OCASE:
l = n->left;
if(cases == C)
diag(n, "case/default outside a switch");
//.........这里部分代码省略.........
开发者ID:CoryXie,项目名称:nix-os,代码行数:101,代码来源:sgen.c
示例17: bitload
int
bitload(Node *b, int n1, int n2, int n3, Node *nn)
{
int sh, g, gs;
long v;
Node *l;
Type *t;
/*
* n1 gets adjusted/masked value
* n2 gets address of cell
* n3 gets contents of cell
*/
gs = 0;
t = tfield;
l = b->left;
g = regalloc(t, n3);
if(n2 != D_NONE) {
lcgen(l, n2, Z);
n2 |= I_INDIR;
gmove(t, t, n2, l, g, l);
gmove(t, t, g, l, n1, l);
} else
cgen(l, g, nn);
if(b->type->shift == 0 && typeu[b->type->etype]) {
v = ~0 + (1L << b->type->nbits);
gopcode(OAND, t, D_CONST, nodconst(v), g, l);
} else {
sh = 32 - b->type->shift - b->type->nbits;
if(sh > 0)
if(sh >= 8) {
gs = regalloc(t, D_NONE);
gmove(t, t, D_CONST, nodconst(sh), gs, l);
gopcode(OASHL, t, gs, l, g, l);
if(b->type->shift)
regfree(gs);
} else
gopcode(OASHL, t, D_CONST, nodconst(sh), g, l);
sh += b->type->shift;
if(sh > 0) {
if(sh >= 8) {
if(b->type->shift) {
gs = regalloc(t, D_NONE);
gmove(t, t, D_CONST, nodconst(sh), gs, l);
}
if(typeu[b->type->etype])
gopcode(OLSHR, t, gs, l, g, l);
else
gopcode(OASHR, t, gs, l, g, l);
regfree(gs);
} else {
if(typeu[b->type->etype])
gopcode(OLSHR, t, D_CONST, nodconst(sh), g, l);
else
gopcode(OASHR, t, D_CONST, nodconst(sh), g, l);
}
}
}
return g;
}
开发者ID:8l,项目名称:inferno,代码行数:61,代码来源:swt.c
示例18: cgen64
/*
* attempt to generate 64-bit
* res = n
* return 1 on success, 0 if op not handled.
*/
void
cgen64(Node *n, Node *res)
{
Node t1, t2, *l, *r;
Node lo1, lo2, hi1, hi2;
Node al, ah, bl, bh, cl, ch, s, n1, creg;
Prog *p1, *p2, *p3, *p4, *p5, *p6;
uint64 v;
if(res->op != OINDREG && res->op != ONAME) {
dump("n", n);
dump("res", res);
fatal("cgen64 %O of %O", n->op, res->op);
}
l = n->left;
if(!l->addable) {
tempname(&t1, l->type);
cgen(l, &t1);
l = &t1;
}
split64(l, &lo1, &hi1);
switch(n->op) {
default:
fatal("cgen64 %O", n->op);
case OMINUS:
split64(res, &lo2, &hi2);
regalloc(&t1, lo1.type, N);
regalloc(&al, lo1.type, N);
regalloc(&ah, hi1.type, N);
gins(AMOVW, &lo1, &al);
gins(AMOVW, &hi1, &ah);
gmove(ncon(0), &t1);
p1 = gins(ASUB, &al, &t1);
p1->scond |= C_SBIT;
gins(AMOVW, &t1, &lo2);
gmove(ncon(0), &t1);
gins(ASBC, &ah, &t1);
gins(AMOVW, &t1, &hi2);
regfree(&t1);
regfree(&al);
regfree(&ah);
splitclean();
splitclean();
return;
case OCOM:
split64(res, &lo2, &hi2);
regalloc(&n1, lo1.type, N);
gins(AMOVW, &lo1, &n1);
gins(AMVN, &n1, &n1);
gins(AMOVW, &n1, &lo2);
gins(AMOVW, &hi1, &n1);
gins(AMVN, &n1, &n1);
gins(AMOVW, &n1, &hi2);
regfree(&n1);
splitclean();
splitclean();
return;
case OADD:
case OSUB:
case OMUL:
case OLSH:
case ORSH:
case OAND:
case OOR:
case OXOR:
// binary operators.
// common setup below.
break;
}
// setup for binary operators
r = n->right;
if(r != N && !r->addable) {
tempname(&t2, r->type);
cgen(r, &t2);
r = &t2;
}
if(is64(r->type))
split64(r, &lo2, &hi2);
regalloc(&al, lo1.type, N);
//.........这里部分代码省略.........
开发者ID:8l,项目名称:go-learn,代码行数:101,代码来源:cgen64.c
示例19: cgenrel
void
cgenrel(Node *n, Node *nn, int inrel)
{
Node *l, *r;
Prog *p1;
Node nod, nod1, nod2, nod3, nod4;
int o, t;
long v, curs;
if(debug['g']) {
prtree(nn, "cgen lhs");
prtree(n, "cgen");
}
if(n == Z || n->type == T)
return;
if(typesu[n->type->etype]) {
sugen(n, nn, n->type->width);
return;
}
l = n->left;
r = n->right;
o = n->op;
if(n->addable >= INDEXED) {
if(nn == Z) {
switch(o) {
default:
nullwarn(Z, Z);
break;
case OINDEX:
nullwarn(l, r);
break;
}
return;
}
gmove(n, nn);
return;
}
curs = cursafe;
if(n->complex >= FNX)
if(l->complex >= FNX)
if(r != Z && r->complex >= FNX)
switch(o) {
default:
if(cond(o) && typesu[l->type->etype])
break;
regret(&nod, r);
cgen(r, &nod);
regsalloc(&nod1, r);
gopcode(OAS, &nod, Z, &nod1);
regfree(&nod);
nod = *n;
nod.right = &nod1;
cgen(&nod, nn);
return;
case OFUNC:
case OCOMMA:
case OANDAND:
case OOROR:
case OCOND:
case ODOT:
break;
}
switch(o) {
default:
diag(n, "unknown op in cgen: %O", o);
break;
case ONEG:
case OCOM:
if(nn == Z) {
nullwarn(l, Z);
break;
}
regalloc(&nod, l, nn);
cgen(l, &nod);
gopcode(o, &nod, Z, &nod);
gmove(&nod, nn);
regfree(&nod);
break;
case OAS:
if(l->op == OBIT)
goto bitas;
if(l->addable >= INDEXED && l->complex < FNX) {
if(nn != Z || r->addable < INDEXED) { /* || hardconst(r) */
if(r->complex >= FNX && nn == Z)
regret(&nod, r);
else
regalloc(&nod, r, nn);
cgen(r, &nod);
gmove(&nod, l);
if(nn != Z)
gmove(&nod, nn);
regfree(&nod);
//.........这里部分代码省略.........
开发者ID:JehanneOS,项目名称:devtools-kencc,代码行数:101,代码来源:cgen.c
示例20: cmp64
/*
* generate comparison of nl, nr, both 64-bit.
* nl is memory; nr is constant or memory.
*/
void
cmp64(Node *nl, Node *nr, int op, Prog *to)
{
Node lo1, hi1, lo2, hi2, r1, r2;
Prog *br;
Type *t;
split64(nl, &lo1, &hi1);
split64(nr, &lo2, &hi2);
// compare most significant word;
// if they differ, we're done.
t = hi1.type;
regalloc(&r1, types[TINT32], N);
regalloc(&r2, types[TINT32], N);
gins(AMOVW, &hi1, &r1);
gins(AMOVW, &hi2, &r2);
gcmp(ACMP, &r1, &r2);
regfree(&r1);
regfree(&r2);
br = P;
switch(op) {
default:
fatal("cmp64 %O %T", op, t);
case OEQ:
// cmp hi
// bne L
// cmp lo
// beq to
// L:
br = gbranch(ABNE, T);
break;
case ONE:
// cmp hi
// bne to
// cmp lo
// bne to
patch(gbranch(ABNE, T), to);
break;
case OGE:
case OGT:
// cmp hi
// bgt to
// blt L
// cmp lo
// bge to (or bgt to)
// L:
patch(gbranch(optoas(OGT, t), T), to);
br = gbranch(optoas(OLT, t), T);
break;
case OLE:
case OLT:
// cmp hi
// blt to
// bgt L
// cmp lo
// ble to (or jlt to)
// L:
patch(gbranch(optoas(OLT, t), T), to);
br = gbranch(optoas(OGT, t), T);
break;
}
// compare least significant word
t = lo1.type;
regalloc(&r1, types[TINT32], N);
regalloc(&r2, types[TINT32], N);
gins(AMOVW, &lo1, &r1);
gins(AMOVW, &lo2, &r2);
gcmp(ACMP, &r1, &r2);
regfree(&r1);
regfree(&r2);
// jump again
patch(gbranch(optoas(op, t), T), to);
// point first branch down here if appropriate
if(br != P)
patch(br, pc);
splitclean();
splitclean();
}
开发者ID:8l,项目名称:go-learn,代码行数:88,代码来源:cgen64.c
注:本文中的regalloc函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论