diff options
| author | 2025-12-12 18:44:48 +0100 | |
|---|---|---|
| committer | 2025-12-12 18:44:48 +0100 | |
| commit | 777a757ed56adcceb3e39500bea1318ca7e2172a (patch) | |
| tree | 1622dd7fd86cc5675259d39a20f60c1f1d5267a9 /x86_64 | |
| parent | 24bcc929477751b056e81e7772dc2bb3d11ce4a5 (diff) | |
x86_64: fix erroneous encoding of index reg in no-pie situations
Diffstat (limited to 'x86_64')
| -rw-r--r-- | x86_64/emit.c | 12 |
1 files changed, 1 insertions, 11 deletions
diff --git a/x86_64/emit.c b/x86_64/emit.c index 4a7d287..6456455 100644 --- a/x86_64/emit.c +++ b/x86_64/emit.c @@ -130,17 +130,7 @@ mkmemoper(union ref r) return mkoper(OMEM, .base = wop.reg, .index = NOINDEX); } else if (r.t == RADDR) { const struct addr *addr = &addrht[r.i]; - struct oper mem; - assert(addr->shift <= 3); - if (addr->base.t == RTMP && ioper(addr->base.i).t == OMEM) { - mem = ioper(addr->base.i); - if (addr->index.bits) addmemoper(&mem, mkregoper(addr->index)); - assert(!mem.shift); - mem.shift = addr->shift; - addmemoper(&mem, mkoper(OIMM, .imm = addr->disp)); - return mem; - } if (isaddrcon(addr->base,0)) { return mkoper(OSYM, .con = addr->base.i, .cindex = addr->index.bits ? mkregoper(addr->index).reg : NOINDEX, @@ -353,7 +343,7 @@ encode(uchar **pcode, const struct desc *tab, int ntab, enum irclass k, struct o /* var(,%reg,shift) */ assert(!ccopt.pic && !ccopt.pie && "cannot encode [RIP-rel + REG] for position independent"); B(/*mod 0*/ (reg & 7) << 3 | RSP); - B(mem.cshift << 6 | mem.cindex << 3 | RBP); /* SIB [index*s + disp32] */ + B(mem.cshift << 6 | ((mem.cindex & 7) << 3) | RBP); /* SIB [index*s + disp32] */ objreloc(xcon2sym(mem.con), REL_ABS32S, Stext, *pcode - objout.textbegin, mem.disp); } I32(0); |