Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

go over cdfunc() for AArch64 #20941

Merged
merged 1 commit into from
Mar 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 11 additions & 52 deletions compiler/src/dmd/backend/arm/cod1.d
Original file line number Diff line number Diff line change
Expand Up @@ -1342,7 +1342,6 @@
//printf("stackpushsave: %d\n", stackpushsave);
cgstate.stackclean++;
regm_t keepmsk = 0;
int xmmcnt = 0;
tym_t tyf = tybasic(e.E1.Ety); // the function type

// Easier to deal with parameters as an array: parameters[0..np]
Expand Down Expand Up @@ -1407,9 +1406,7 @@
parameters[i].reg = NOREG;
uint alignsize = el_alignsize(ep);
parameters[i].numalign = 0;
if (alignsize > stackalign &&
(I64 || (alignsize >= 16 &&
(config.exe & (EX_OSX | EX_LINUX) && (tyaggregate(ep.Ety) || tyvector(ep.Ety))))))
if (alignsize > stackalign)

Check warning on line 1409 in compiler/src/dmd/backend/arm/cod1.d

View check run for this annotation

Codecov / codecov/patch

compiler/src/dmd/backend/arm/cod1.d#L1409

Added line #L1409 was not covered by tests
{
if (alignsize > STACKALIGN)
{
Expand All @@ -1431,8 +1428,8 @@
}

//printf("numpara = %d, cgstate.stackpush = %d\n", numpara, stackpush);
assert((numpara & (REGSIZE - 1)) == 0);
assert((cgstate.stackpush & (REGSIZE - 1)) == 0);
assert((numpara & (REGSIZE - 1)) == 0); // check alignment
assert((cgstate.stackpush & (REGSIZE - 1)) == 0); // check alignment

Check warning on line 1432 in compiler/src/dmd/backend/arm/cod1.d

View check run for this annotation

Codecov / codecov/patch

compiler/src/dmd/backend/arm/cod1.d#L1431-L1432

Added lines #L1431 - L1432 were not covered by tests

/* Should consider reordering the order of evaluation of the parameters
* so that args that go into registers are evaluated after args that get
Expand Down Expand Up @@ -1498,9 +1495,8 @@
//printf("funcargtos1 = %d\n", cast(int)funcargtos);

// TODO AArch64
/* Parameters go into the registers RDI,RSI,RDX,RCX,R8,R9
* float and double parameters go into XMM0..XMM7
* For variadic functions, count of XMM registers used goes in AL
/* Parameters go into the registers x0..x7
* floating point parameters go into q0..q7 (16 bytes each)
*/
foreach (i; 0 .. np)
{
Expand Down Expand Up @@ -1532,7 +1528,6 @@
for (reg_t j = 0; tosave; j++)
{
regm_t mi = mask(j);
assert(j <= XMM7);
if (mi & tosave)
{
uint idx;
Expand All @@ -1551,29 +1546,24 @@
{
// Goes in register preg, not stack
regm_t retregs = mask(preg);
if (retregs & XMMREGS)
++xmmcnt;
reg_t preg2 = parameters[i].reg2;
reg_t mreg,lreg;
if (preg2 != NOREG || tybasic(ep.Ety) == TYcfloat)
{
assert(ep.Eoper != OPstrthis);
if (mask(preg2) & XMMREGS)
++xmmcnt;
if (tybasic(ep.Ety) == TYcfloat)
{
lreg = ST01;
mreg = NOREG;
assert(0);
}
else if (tyrelax(ep.Ety) == TYcent)
{
lreg = mask(preg ) & mLSW ? cast(reg_t)preg : AX;
mreg = mask(preg2) & mMSW ? cast(reg_t)preg2 : DX;
lreg = mask(preg ) & mLSW ? cast(reg_t)preg : 0;
mreg = mask(preg2) & mMSW ? cast(reg_t)preg2 : 1;

Check warning on line 1561 in compiler/src/dmd/backend/arm/cod1.d

View check run for this annotation

Codecov / codecov/patch

compiler/src/dmd/backend/arm/cod1.d#L1560-L1561

Added lines #L1560 - L1561 were not covered by tests
}
else
{
lreg = XMM0;
mreg = XMM1;
lreg = 32;
mreg = 33;

Check warning on line 1566 in compiler/src/dmd/backend/arm/cod1.d

View check run for this annotation

Codecov / codecov/patch

compiler/src/dmd/backend/arm/cod1.d#L1565-L1566

Added lines #L1565 - L1566 were not covered by tests
}
retregs = (mask(mreg) | mask(lreg)) & ~mask(NOREG);
CodeBuilder cdbsave;
Expand All @@ -1586,7 +1576,6 @@
for (reg_t j = 0; tosave; j++)
{
regm_t mi = mask(j);
assert(j <= XMM7);
if (mi & tosave)
{
uint idx;
Expand Down Expand Up @@ -1660,6 +1649,7 @@
(modregrm(0,4,SP) << 8) | modregxrm(2,preg,4), FL.const_,delta);
if (I64)
code_orrex(cdb.last(), REX_W);
assert(0); // TODO AArch64
}
else if (ep.Eoper == OPstrpar && config.exe == EX_WIN64 && type_size(ep.ET) == 0)
{
Expand All @@ -1683,44 +1673,13 @@
cdb.genadjesp(sz);
cgstate.stackpush += sz;
}

/* Variadic functions store XMM parameters into their corresponding GP registers
*/
for (int i = 0; i < np; i++)
{
int preg = parameters[i].reg;
regm_t retregs = mask(preg);
if (retregs & XMMREGS)
{
reg_t reg;
switch (preg)
{
case XMM0: reg = CX; break;
case XMM1: reg = DX; break;
case XMM2: reg = R8; break;
case XMM3: reg = R9; break;

default: assert(0);
}
getregs(cdb,mask(reg));
//cdb.gen2(STOD,(REX_W << 16) | modregxrmx(3,preg-XMM0,reg)); // MOVD reg,preg
}
}
}

// Restore any register parameters we saved
getregs(cdb,saved);
cdb.append(cdbrestore);
keepmsk |= saved;

// Variadic functions store the number of XMM registers used in AL
if (config.exe != EX_WIN64 && e.Eflags & EFLAGS_variadic && !cg.AArch64)
{
getregs(cdb,mAX);
movregconst(cdb,AX,xmmcnt,1);
keepmsk |= mAX;
}

//printf("funcargtos: %d cgstate.funcargtos: %d\n", cast(int)funcargtos, cast(int)cgstate.funcargtos);
assert(funcargtos == 0 && cgstate.funcargtos == ~0);
cgstate.stackclean--;
Expand Down
3 changes: 3 additions & 0 deletions compiler/src/dmd/backend/arm/cod3.d
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ nothrow:
@trusted
void REGSAVE_save(ref REGSAVE regsave, ref CodeBuilder cdb, reg_t reg, out uint idx)
{
// TODO AArch64 floating point registers
if (!regsave.alignment)
regsave.alignment = REGSIZE;
idx = regsave.idx;
Expand Down Expand Up @@ -94,6 +95,7 @@ void REGSAVE_save(ref REGSAVE regsave, ref CodeBuilder cdb, reg_t reg, out uint
@trusted
void REGSAVE_restore(const ref REGSAVE regsave, ref CodeBuilder cdb, reg_t reg, uint idx)
{
// TODO AArch64 floating point registers
// LDR reg,[BP, #idx]
code cs;
cs.reg = reg;
Expand Down Expand Up @@ -897,6 +899,7 @@ void gentstreg(ref CodeBuilder cdb, reg_t reg, uint sf)
@trusted
void genmovreg(ref CodeBuilder cdb, reg_t to, reg_t from, tym_t ty = TYMAX)
{
// TODO ftype and TYMAX ?
if (to <= 31)
{
// integer
Expand Down
Loading