diff options
author | Michael Forney <mforney@mforney.org> | 2020-09-19 16:33:43 -0700 |
---|---|---|
committer | Quentin Carbonneaux <quentin@c9x.me> | 2020-10-05 21:21:01 +0200 |
commit | 496c069405cd79aed968f59dd5a5f92d1f96809f (patch) | |
tree | 64fe4259b05a39b8915b6459e5b3cc84e1191477 /fold.c | |
parent | 5e5e301e866e1eeb4523b9ecae6a2a327c019a08 (diff) | |
download | roux-496c069405cd79aed968f59dd5a5f92d1f96809f.tar.gz |
fold: zero-initialize padding bits of constants
Otherwise, if a constant is stored as a float and retrieved as an int, the padding bits are uninitialized. This can result in the generation of invalid assembly: Error: suffix or operands invalid for `cvtsi2ss' Reported by Hiltjo Posthuma.
Diffstat (limited to 'fold.c')
-rw-r--r-- | fold.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/fold.c b/fold.c index 0a3945f..5344cf4 100644 --- a/fold.c +++ b/fold.c @@ -459,6 +459,8 @@ foldflt(Con *res, int op, int w, Con *cl, Con *cr) if (cl->type != CBits || cr->type != CBits) err("invalid address operand for '%s'", optab[op].name); + *res = (Con){CBits}; + memset(&res->bits, 0, sizeof(res->bits)); if (w) { ld = cl->bits.d; rd = cr->bits.d; @@ -473,7 +475,8 @@ foldflt(Con *res, int op, int w, Con *cl, Con *cr) case Ocast: xd = ld; break; default: die("unreachable"); } - *res = (Con){CBits, .bits={.d=xd}, .flt=2}; + res->bits.d = xd; + res->flt = 2; } else { ls = cl->bits.s; rs = cr->bits.s; @@ -488,7 +491,8 @@ foldflt(Con *res, int op, int w, Con *cl, Con *cr) case Ocast: xs = ls; break; default: die("unreachable"); } - *res = (Con){CBits, .bits={.s=xs}, .flt=1}; + res->bits.s = xs; + res->flt = 1; } } |