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 | |
| parent | 348f2eac90ffc0f3f8fa35e8a211ef8048589cb8 (diff) | |
fix fp constants on big endian hosts
| -rw-r--r-- | all.h | 2 | ||||
| -rw-r--r-- | amd64/emit.c | 6 | ||||
| -rw-r--r-- | amd64/isel.c | 2 | ||||
| -rw-r--r-- | arm64/isel.c | 2 | ||||
| -rw-r--r-- | emit.c | 41 | ||||
| -rw-r--r-- | rv64/isel.c | 2 |
6 files changed, 30 insertions, 25 deletions
@@ -614,7 +614,7 @@ void emitfnlnk(char *, Lnk *, FILE *); void emitdat(Dat *, FILE *); void emitdbgfile(char *, FILE *); void emitdbgloc(uint, uint, FILE *); -int stashbits(void *, int); +int stashbits(bits, int); void elf_emitfnfin(char *, FILE *); void elf_emitfin(FILE *); void macho_emitfin(FILE *); diff --git a/amd64/emit.c b/amd64/emit.c index a8cd0de..6cf37ec 100644 --- a/amd64/emit.c +++ b/amd64/emit.c @@ -384,9 +384,9 @@ Next: goto Next; } -static void *negmask[4] = { - [Ks] = (uint32_t[4]){ 0x80000000 }, - [Kd] = (uint64_t[2]){ 0x8000000000000000 }, +static bits negmask[4] = { + [Ks] = 0x80000000, + [Kd] = 0x8000000000000000, }; static void diff --git a/amd64/isel.c b/amd64/isel.c index 4b831f8..4aff0d6 100644 --- a/amd64/isel.c +++ b/amd64/isel.c @@ -87,7 +87,7 @@ fixarg(Ref *r, int k, Ins *i, Fn *fn) vgrow(&fn->mem, ++fn->nmem); memset(&a, 0, sizeof a); a.offset.type = CAddr; - n = stashbits(&fn->con[r0.val].bits, KWIDE(k) ? 8 : 4); + n = stashbits(fn->con[r0.val].bits.i, KWIDE(k) ? 8 : 4); /* quote the name so that we do not * add symbol prefixes on the apple * target variant diff --git a/arm64/isel.c b/arm64/isel.c index 7d85b92..ff3b30b 100644 --- a/arm64/isel.c +++ b/arm64/isel.c @@ -109,7 +109,7 @@ fixarg(Ref *pr, int k, int phi, Fn *fn) if (KBASE(k) == 0) { emit(Ocopy, k, r1, r0, R); } else { - n = stashbits(&c->bits, KWIDE(k) ? 8 : 4); + n = stashbits(c->bits.i, KWIDE(k) ? 8 : 4); vgrow(&fn->con, ++fn->ncon); c = &fn->con[fn->ncon-1]; sprintf(buf, "\"%sfp%d\"", T.asloc, n); @@ -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)) { diff --git a/rv64/isel.c b/rv64/isel.c index 55fb645..000c112 100644 --- a/rv64/isel.c +++ b/rv64/isel.c @@ -41,7 +41,7 @@ fixarg(Ref *r, int k, Ins *i, Fn *fn) * immediates */ assert(c->type == CBits); - n = stashbits(&c->bits, KWIDE(k) ? 8 : 4); + n = stashbits(c->bits.i, KWIDE(k) ? 8 : 4); vgrow(&fn->con, ++fn->ncon); c = &fn->con[fn->ncon-1]; sprintf(buf, "\"%sfp%d\"", T.asloc, n); |
