aboutsummaryrefslogtreecommitdiff
path: root/emit.c
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 /emit.c
parent348f2eac90ffc0f3f8fa35e8a211ef8048589cb8 (diff)
fix fp constants on big endian hosts
Diffstat (limited to 'emit.c')
-rw-r--r--emit.c41
1 files changed, 23 insertions, 18 deletions
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)) {