commit 8c92b1248596d3ad70a8dcdbd6b6548641bc09a9
parent 554ba694ab54fe5d318fb3b3065808361df50f0b
Author: Quentin Carbonneaux <quentin.carbonneaux@yale.edu>
Date: Fri, 8 Apr 2016 08:31:25 -0400
use union for punning in emit
Diffstat:
| M | emit.c | | | 18 | +++++++++++------- |
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/emit.c b/emit.c
@@ -614,7 +614,11 @@ emitdat(Dat *d, FILE *f)
typedef struct FBits FBits;
struct FBits {
- int64_t bits;
+ union {
+ int64_t n;
+ float f;
+ double d;
+ } bits;
int wide;
FBits *link;
};
@@ -630,10 +634,10 @@ stashfp(int64_t n, int w)
/* does a dumb de-dup of fp constants
* this should be the linker's job */
for (pb=&stash, i=0; (b=*pb); pb=&b->link, i++)
- if (n == b->bits && w == b->wide)
+ if (n == b->bits.n && w == b->wide)
return i;
b = emalloc(sizeof *b);
- b->bits = n;
+ b->bits.n = n;
b->wide = w;
b->link = 0;
*pb = b;
@@ -656,8 +660,8 @@ emitfin(FILE *f)
"%sfp%d:\n"
"\t.quad %"PRId64
" /* %f */\n",
- locprefix, i, b->bits,
- *(double *)&b->bits
+ locprefix, i, b->bits.n,
+ b->bits.d
);
for (b=stash, i=0; b; b=b->link, i++)
if (!b->wide)
@@ -665,8 +669,8 @@ emitfin(FILE *f)
"%sfp%d:\n"
"\t.long %"PRId64
" /* %lf */\n",
- locprefix, i, b->bits & 0xffffffff,
- *(float *)&b->bits
+ locprefix, i, b->bits.n & 0xffffffff,
+ b->bits.f
);
while ((b=stash)) {
stash = b->link;