diff options
| author | 2025-11-17 17:21:06 +0100 | |
|---|---|---|
| committer | 2025-11-19 10:40:35 +0100 | |
| commit | 84af78c1634252da5dfaaed37aedd17b09929703 (patch) | |
| tree | ddba46c42f29be6dcc1feaf22451562723b945cb | |
| parent | 72bd99ecebbafd0fe8f8cad227d11775e84493ba (diff) | |
c: implement ++/-- for bitfields
| -rw-r--r-- | c/c.c | 28 |
1 files changed, 21 insertions, 7 deletions
@@ -3299,24 +3299,37 @@ compileexpr(struct function *fn, const struct expr *ex, bool discard) case EPOSTINC: case EPOSTDEC: op = ex->t == EPOSTINC ? Oadd : Osub; - adr = expraddr(fn, sub); - l = genload(fn, sub->ty, adr, sub->qual & QVOLATILE); if (ex->ty.t == TYPTR) r = mkintcon(type2cls[targ_sizetype], typesize(typechild(ex->ty))); else r = mkref(RICON, 1); - q = irbinop(fn, op, cls, l, r); - genstore(fn, sub->ty, adr, q); - return l; + bitsiz = 0; + if (sub[0].t == EGETF && (bitsiz = sub->fld.bitsiz)) { + union ref tmp; + adr = expraddr(fn, &sub[0].sub[0]); + l = genbitfload(fn, &tmp, sub[0].ty, &adr, &sub[0].fld, sub[0].qual & QVOLATILE); + q = irbinop(fn, op, cls, l, r); + genbitfstore(fn, sub[0].ty, adr, &sub[0].fld, tmp, q); + } else { + adr = expraddr(fn, sub); + l = genload(fn, sub->ty, adr, sub->qual & QVOLATILE); + q = irbinop(fn, op, cls, l, r); + genstore(fn, sub->ty, adr, q); + } + return discard ? NOREF : l; case EPREINC: case EPREDEC: op = ex->t == EPREINC ? Oadd : Osub; - adr = expraddr(fn, sub); - l = genload(fn, sub->ty, adr, sub->qual & QVOLATILE); if (ex->ty.t == TYPTR) r = mkintcon(type2cls[targ_sizetype], typesize(typechild(ex->ty))); else r = mkref(RICON, 1); + if (sub[0].t == EGETF && (bitsiz = sub->fld.bitsiz)) { + ty = ex->ty; + goto CompoundBitf; + } + adr = expraddr(fn, sub); + l = genload(fn, sub->ty, adr, sub->qual & QVOLATILE); q = irbinop(fn, op, cls, l, r); genstore(fn, sub->ty, adr, q); if (discard) return NOREF; @@ -3400,6 +3413,7 @@ compileexpr(struct function *fn, const struct expr *ex, bool discard) if (sub[0].t == EGETF && (bitsiz = sub[0].fld.bitsiz)) { /* bit-field */ union ref tmp; + CompoundBitf: adr = expraddr(fn, &sub[0].sub[0]); l = genbitfload(fn, &tmp, sub[0].ty, &adr, &sub[0].fld, sub[0].qual & QVOLATILE); q = irbinop(fn, op, cls, l, r); |