fold scaled offsets in addresses
This commit is contained in:
parent
8e8f706436
commit
4a809d69b5
5 changed files with 79 additions and 11 deletions
|
@ -293,7 +293,7 @@ Next:
|
|||
if (rtype(m->base) == RSlot) {
|
||||
off.type = CBits;
|
||||
off.bits.i = slot(m->base, fn);
|
||||
addcon(&m->offset, &off);
|
||||
addcon(&m->offset, &off, 1);
|
||||
m->base = TMP(RBP);
|
||||
}
|
||||
if (m->offset.type != CUndef)
|
||||
|
|
11
amd64/isel.c
11
amd64/isel.c
|
@ -692,7 +692,7 @@ anumber(Num *tn, Blk *b, Con *con)
|
|||
}
|
||||
|
||||
static Ref
|
||||
adisp(Con *c, Num *tn, Ref r, Fn *fn)
|
||||
adisp(Con *c, Num *tn, Ref r, Fn *fn, int s)
|
||||
{
|
||||
Ref v[2];
|
||||
int n;
|
||||
|
@ -704,7 +704,7 @@ adisp(Con *c, Num *tn, Ref r, Fn *fn)
|
|||
break;
|
||||
runmatch(matcher[Pob], tn, r, v);
|
||||
assert(rtype(v[0]) == RCon);
|
||||
addcon(c, &fn->con[v[0].val]);
|
||||
addcon(c, &fn->con[v[0].val], s);
|
||||
r = v[1];
|
||||
}
|
||||
return r;
|
||||
|
@ -733,18 +733,18 @@ amatch(Addr *a, Num *tn, Ref r, Fn *fn)
|
|||
|
||||
memset(&co, 0, sizeof co);
|
||||
ro = v[0];
|
||||
rb = adisp(&co, tn, v[1], fn);
|
||||
rb = adisp(&co, tn, v[1], fn, 1);
|
||||
ri = v[2];
|
||||
rs = v[3];
|
||||
s = 1;
|
||||
|
||||
if (*p < 0 && co.type != CUndef)
|
||||
if (amatch(a, tn, rb, fn))
|
||||
return addcon(&a->offset, &co);
|
||||
return addcon(&a->offset, &co, 1);
|
||||
if (!req(ro, R)) {
|
||||
assert(rtype(ro) == RCon);
|
||||
c = &fn->con[ro.val];
|
||||
if (!addcon(&co, c))
|
||||
if (!addcon(&co, c, 1))
|
||||
return 0;
|
||||
}
|
||||
if (!req(rs, R)) {
|
||||
|
@ -753,6 +753,7 @@ amatch(Addr *a, Num *tn, Ref r, Fn *fn)
|
|||
assert(c->type = CBits);
|
||||
s = c->bits.i;
|
||||
}
|
||||
ri = adisp(&co, tn, ri, fn, s);
|
||||
*a = (Addr){co, rb, ri, s};
|
||||
|
||||
if (rtype(ri) == RTmp)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue