aboutsummaryrefslogtreecommitdiffhomepage
path: root/c
diff options
context:
space:
mode:
Diffstat (limited to 'c')
-rw-r--r--c/c.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/c/c.c b/c/c.c
index 01496dd..2454207 100644
--- a/c/c.c
+++ b/c/c.c
@@ -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);