From 8d5b86ac4c24e24802a60e5e9df2dd5902fe0a5c Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Wed, 16 Apr 2025 10:23:25 +0200 Subject: fix fp constants on big endian hosts --- emit.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) (limited to 'emit.c') diff --git a/emit.c b/emit.c index ba0174b..04837a5 100644 --- a/emit.c +++ b/emit.c @@ -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)) { -- cgit v1.2.3