fix fp constants on big endian hosts

This commit is contained in:
Quentin Carbonneaux 2025-04-16 10:23:25 +02:00
parent 348f2eac90
commit 8d5b86ac4c
6 changed files with 30 additions and 25 deletions

2
all.h
View File

@ -614,7 +614,7 @@ void emitfnlnk(char *, Lnk *, FILE *);
void emitdat(Dat *, FILE *); void emitdat(Dat *, FILE *);
void emitdbgfile(char *, FILE *); void emitdbgfile(char *, FILE *);
void emitdbgloc(uint, uint, FILE *); void emitdbgloc(uint, uint, FILE *);
int stashbits(void *, int); int stashbits(bits, int);
void elf_emitfnfin(char *, FILE *); void elf_emitfnfin(char *, FILE *);
void elf_emitfin(FILE *); void elf_emitfin(FILE *);
void macho_emitfin(FILE *); void macho_emitfin(FILE *);

View File

@ -384,9 +384,9 @@ Next:
goto Next; goto Next;
} }
static void *negmask[4] = { static bits negmask[4] = {
[Ks] = (uint32_t[4]){ 0x80000000 }, [Ks] = 0x80000000,
[Kd] = (uint64_t[2]){ 0x8000000000000000 }, [Kd] = 0x8000000000000000,
}; };
static void static void

View File

@ -87,7 +87,7 @@ fixarg(Ref *r, int k, Ins *i, Fn *fn)
vgrow(&fn->mem, ++fn->nmem); vgrow(&fn->mem, ++fn->nmem);
memset(&a, 0, sizeof a); memset(&a, 0, sizeof a);
a.offset.type = CAddr; 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 /* quote the name so that we do not
* add symbol prefixes on the apple * add symbol prefixes on the apple
* target variant * target variant

View File

@ -109,7 +109,7 @@ fixarg(Ref *pr, int k, int phi, Fn *fn)
if (KBASE(k) == 0) { if (KBASE(k) == 0) {
emit(Ocopy, k, r1, r0, R); emit(Ocopy, k, r1, r0, R);
} else { } else {
n = stashbits(&c->bits, KWIDE(k) ? 8 : 4); n = stashbits(c->bits.i, KWIDE(k) ? 8 : 4);
vgrow(&fn->con, ++fn->ncon); vgrow(&fn->con, ++fn->ncon);
c = &fn->con[fn->ncon-1]; c = &fn->con[fn->ncon-1];
sprintf(buf, "\"%sfp%d\"", T.asloc, n); sprintf(buf, "\"%sfp%d\"", T.asloc, n);

41
emit.c
View File

@ -125,7 +125,7 @@ emitdat(Dat *d, FILE *f)
typedef struct Asmbits Asmbits; typedef struct Asmbits Asmbits;
struct Asmbits { struct Asmbits {
char bits[16]; bits n;
int size; int size;
Asmbits *link; Asmbits *link;
}; };
@ -133,18 +133,17 @@ struct Asmbits {
static Asmbits *stash; static Asmbits *stash;
int int
stashbits(void *bits, int size) stashbits(bits n, int size)
{ {
Asmbits **pb, *b; Asmbits **pb, *b;
int i; int i;
assert(size == 4 || size == 8 || size == 16); assert(size == 4 || size == 8 || size == 16);
for (pb=&stash, i=0; (b=*pb); pb=&b->link, i++) for (pb=&stash, i=0; (b=*pb); pb=&b->link, i++)
if (size <= b->size) if (size <= b->size && b->n == n)
if (memcmp(bits, b->bits, size) == 0)
return i; return i;
b = emalloc(sizeof *b); b = emalloc(sizeof *b);
memcpy(b->bits, bits, size); b->n = n;
b->size = size; b->size = size;
b->link = 0; b->link = 0;
*pb = b; *pb = b;
@ -155,9 +154,8 @@ static void
emitfin(FILE *f, char *sec[3]) emitfin(FILE *f, char *sec[3])
{ {
Asmbits *b; Asmbits *b;
char *p;
int lg, i; int lg, i;
double d; union { int32_t i; float f; } u;
if (!stash) if (!stash)
return; return;
@ -171,17 +169,24 @@ emitfin(FILE *f, char *sec[3])
"%sfp%d:", "%sfp%d:",
sec[lg-2], lg, T.asloc, i sec[lg-2], lg, T.asloc, i
); );
for (p=b->bits; p<&b->bits[b->size]; p+=4) if (lg == 4)
fprintf(f, "\n\t.int %"PRId32, fprintf(f,
*(int32_t *)p); "\n\t.quad %"PRId64
if (lg <= 3) { "\n\t.quad 0\n\n",
if (lg == 2) (int64_t)b->n);
d = *(float *)b->bits; else if (lg == 3)
else fprintf(f,
d = *(double *)b->bits; "\n\t.quad %"PRId64
fprintf(f, " /* %f */\n\n", d); " /* %f */\n\n",
} else (int64_t)b->n,
fprintf(f, "\n\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)) { while ((b=stash)) {

View File

@ -41,7 +41,7 @@ fixarg(Ref *r, int k, Ins *i, Fn *fn)
* immediates * immediates
*/ */
assert(c->type == CBits); 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); vgrow(&fn->con, ++fn->ncon);
c = &fn->con[fn->ncon-1]; c = &fn->con[fn->ncon-1];
sprintf(buf, "\"%sfp%d\"", T.asloc, n); sprintf(buf, "\"%sfp%d\"", T.asloc, n);