Skip to content

Commit 18df84a

Browse files
authored
cdmemset() problems (#22441)
1 parent eaaab15 commit 18df84a

1 file changed

Lines changed: 10 additions & 3 deletions

File tree

  • compiler/src/dmd/backend/arm

compiler/src/dmd/backend/arm/cod2.d

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,7 +1384,7 @@ void cdmemset(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
13841384
return;
13851385
}
13861386

1387-
if (enumbytes.Eoper == OPconst ||
1387+
if (evalue.Eoper == OPconst ||
13881388
evalue.Eoper == OPstrpar) // happens if evalue is a struct of 0 size
13891389
{
13901390
// Get nbytes into nbytesreg
@@ -1606,8 +1606,15 @@ private void cdmemsetn(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pr
16061606
if (Rp != Rd)
16071607
genmovreg(cdb,Rp,Rd);
16081608

1609-
assert(szv == 4 || szv == 8);
1610-
cdb.gen1(INSTR.str_imm_gen_post_index(is64,szv,Rp,Rv)); // L2: STR Rv,[Rp],#szv // *Rp++ = Rv
1609+
if (szv == 2)
1610+
{
1611+
cdb.gen1(INSTR.str_imm_gen_post_index(is64,szv,Rp,Rv)); // STRH Rv,[Rp],#2
1612+
}
1613+
else
1614+
{
1615+
assert(szv == 4 || szv == 8);
1616+
cdb.gen1(INSTR.str_imm_gen_post_index(is64,szv,Rp,Rv)); // L2: STR Rv,[Rp],#szv // *Rp++ = Rv
1617+
}
16111618
code* L2 = cdb.last();
16121619
if (szv == REGSIZE * 2)
16131620
cdb.gen1(INSTR.str_imm_gen_post_index(is64,szv,Rp,Rvhi)); // L2: STR Rvhi,[Rp],#szv // *Rp++ = Rvhi

0 commit comments

Comments
 (0)