load floating point constant error (#21136)

This commit is contained in:
Walter Bright 2025-04-04 09:29:33 -07:00 committed by GitHub
parent 3106359a2b
commit 14ec3e1c36
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 15 additions and 9 deletions

View file

@ -2072,6 +2072,7 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
if (sz == 8)
value = e.Vdouble;
loadFloatRegConst(cdb,vreg,value,sz);
fixresult(cdb, e, forregs, outretregs);
return;
}
@ -2258,7 +2259,7 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
assert(0);
// Flags may already be set
outretregs &= flags | ~mPSW;
//printf("outretregs: %llx\n", outretregs);
//printf("forregs: %s outretregs: %s\n", regm_str(forregs), regm_str(outretregs));
fixresult(cdb, e, forregs, outretregs);
return;
}

View file

@ -2845,8 +2845,7 @@ void scodelem(ref CGstate cg, ref CodeBuilder cdb, elem* e,ref regm_t pretregs,r
regm_t oldregimmed = cg.regcon.immed.mval;
regm_t oldmfuncreg = cg.mfuncreg; // remember old one
if (cg.AArch64)
// cg.mfuncreg = (XMMREGS | mask(cg.BP) | cg.allregs) & ~cg.regcon.mvar;
cg.mfuncreg = (0xFFFF_FFFF_7FFF_FFFF) & ~cg.regcon.mvar;
cg.mfuncreg = (INSTR.FLOATREGS | mask(cg.BP) | cg.allregs) & ~cg.regcon.mvar;
else
cg.mfuncreg = (XMMREGS | mBP | mES | ALLREGS) & ~cg.regcon.mvar;
uint stackpushsave = cg.stackpush;
@ -2866,7 +2865,7 @@ void scodelem(ref CGstate cg, ref CodeBuilder cdb, elem* e,ref regm_t pretregs,r
/* Assert that no new CSEs are generated that are not reflected */
/* in mfuncreg. */
debug if ((cg.mfuncreg & (cg.regcon.cse.mval & ~oldregcon)) != 0)
printf("mfuncreg %s, cg.regcon.cse.mval %s, oldregcon %s, regcon.mvar %s\n",
printf("mfuncreg %s\ncg.regcon.cse.mval %s\noldregcon %s\nregcon.mvar %s\n",
regm_str(cg.mfuncreg),regm_str(cg.regcon.cse.mval),regm_str(oldregcon),regm_str(cg.regcon.mvar));
assert((cg.mfuncreg & (cg.regcon.cse.mval & ~oldregcon)) == 0);
@ -3001,7 +3000,7 @@ void scodelem(ref CGstate cg, ref CodeBuilder cdb, elem* e,ref regm_t pretregs,r
const(char)* regm_str(regm_t rm)
{
enum NUM = 10;
enum SMAX = 128;
enum SMAX = 235;
__gshared char[SMAX + 1][NUM] str;
__gshared int i;
bool AArch64 = cgstate.AArch64;
@ -3057,13 +3056,19 @@ const(char)* regm_str(regm_t rm)
strcat(p,"|");
}
}
const len = strlen(p);
if (len > SMAX)
{
printf("strlen: %lld, SMAX: %d\n", cast(ulong)len, SMAX);
assert(0);
}
if (rm)
{
const pstrlen = strlen(p);
char* s = p + pstrlen;
snprintf(s, SMAX - pstrlen, "x%02llx", cast(ulong)rm);
char* s = p + len;
snprintf(s, SMAX - len, "x%02llx", cast(ulong)rm);
}
assert(strlen(p) <= SMAX);
return strdup(p);
}