diff options
| author | Quentin Carbonneaux <[email protected]> | 2025-04-16 10:23:25 +0200 |
|---|---|---|
| committer | Quentin Carbonneaux <[email protected]> | 2025-04-16 10:29:00 +0200 |
| commit | 8d5b86ac4c24e24802a60e5e9df2dd5902fe0a5c (patch) | |
| tree | 36805bd0dd0a942740c2ba9b9223a89c2cc9978e /emit.c | |
| parent | 348f2eac90ffc0f3f8fa35e8a211ef8048589cb8 (diff) | |
fix fp constants on big endian hosts
Diffstat (limited to 'emit.c')
| -rw-r--r-- | emit.c | 41 |
1 files changed, 23 insertions, 18 deletions
@@ -125,7 +125,7 @@ emitdat(Dat *d, FILE *f) typedef struct Asmbits Asmbits; struct Asmbits { - char bits[16]; + bits n; int size; Asmbits *link; }; @@ -133,18 +133,17 @@ struct Asmbits { static Asmbits *stash; int -stashbits(void *bits, int size) +stashbits(bits n, int size) { Asmbits **pb, *b; int i; assert(size == 4 || size == 8 || size == 16); for (pb=&stash, i=0; (b=*pb); pb=&b->link, i++) - if (size <= b->size) - if (memcmp(bits, b->bits, size) == 0) + if (size <= b->size && b->n == n) return i; b = emalloc(sizeof *b); - memcpy(b->bits, bits, size); + b->n = n; b->size = size; b->link = 0; *pb = b; @@ -155,9 +154,8 @@ static void emitfin(FILE *f, char *sec[3]) { Asmbits *b; - char *p; int lg, i; - double d; + union { int32_t i; float f; } u; if (!stash) return; @@ -171,17 +169,24 @@ emitfin(FILE *f, char *sec[3]) "%sfp%d:", sec[lg-2], lg, T.asloc, i ); - for (p=b->bits; p<&b->bits[b->size]; p+=4) - fprintf(f, "\n\t.int %"PRId32, - *(int32_t *)p); - if (lg <= 3) { - if (lg == 2) - d = *(float *)b->bits; - else - d = *(double *)b->bits; - fprintf(f, " /* %f */\n\n", d); - } else - fprintf(f, "\n\n"); + if (lg == 4) + fprintf(f, + "\n\t.quad %"PRId64 + "\n\t.quad 0\n\n", + (int64_t)b->n); + else if (lg == 3) + fprintf(f, + "\n\t.quad %"PRId64 + " /* %f */\n\n", + (int64_t)b->n, + *(double *)&b->n); + else if (lg == 2) { + u.i = b->n; + fprintf(f, + "\n\t.int %"PRId32 + " /* %f */\n\n", + u.i, (double)u.f); + } } } while ((b=stash)) { |
