aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Carbonneaux <[email protected]>2025-04-16 10:23:25 +0200
committerQuentin Carbonneaux <[email protected]>2025-04-16 10:29:00 +0200
commit8d5b86ac4c24e24802a60e5e9df2dd5902fe0a5c (patch)
tree36805bd0dd0a942740c2ba9b9223a89c2cc9978e
parent348f2eac90ffc0f3f8fa35e8a211ef8048589cb8 (diff)
fix fp constants on big endian hosts
-rw-r--r--all.h2
-rw-r--r--amd64/emit.c6
-rw-r--r--amd64/isel.c2
-rw-r--r--arm64/isel.c2
-rw-r--r--emit.c41
-rw-r--r--rv64/isel.c2
6 files changed, 30 insertions, 25 deletions
diff --git a/all.h b/all.h
index 39a4f7c..df72617 100644
--- a/all.h
+++ b/all.h
@@ -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);
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)) {
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);