mirror of
https://github.com/dlang/dmd.git
synced 2025-04-25 12:40:11 +03:00
fixes for assignaddrc() and cmpval() (#21195)
This commit is contained in:
parent
52cb9fdc1b
commit
81cd0b26ef
2 changed files with 8 additions and 4 deletions
|
@ -1176,6 +1176,10 @@ void movregconst(ref CodeBuilder cdb,reg_t reg,targ_size_t value,regm_t flags)
|
|||
r++;
|
||||
}
|
||||
|
||||
// loading a constant into the lower 32 bits zeros out the upper 32 bits
|
||||
if ((value & 0xFFFF_FFFF_0000_0000) == 0)
|
||||
flags &= ~64;
|
||||
|
||||
uint sf = (flags & 64) != 0;
|
||||
uint opc = 2; // MOVZ
|
||||
uint hw = 0;
|
||||
|
@ -1240,7 +1244,7 @@ void movregconst(ref CodeBuilder cdb,reg_t reg,targ_size_t value,regm_t flags)
|
|||
{
|
||||
// Check for ORR one instruction solution
|
||||
uint N, immr, imms;
|
||||
if (orr_solution(value2, N, immr, imms))
|
||||
if (orr_solution(value2, N, immr, imms)) // TODO AArch64 not implemented yet
|
||||
{
|
||||
// MOV Rd,#imm
|
||||
// http://www.scs.stanford.edu/~zyedidia/arm64/mov_orr_log_imm.html
|
||||
|
@ -1287,6 +1291,7 @@ done:
|
|||
*/
|
||||
bool orr_solution(ulong value, out uint N, out uint immr, out uint imms)
|
||||
{
|
||||
// TODO AArch64
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1570,9 +1575,8 @@ void assignaddrc(code* c)
|
|||
|
||||
Rn = cast(reg_t)field(ins,9,5);
|
||||
Rt = cast(reg_t)field(ins,4,0);
|
||||
if (!cgstate.hasframe || (cgstate.enforcealign && c.IFL1 != FL.para))
|
||||
if (Rn == 29 && !cgstate.hasframe || (cgstate.enforcealign && c.IFL1 != FL.para))
|
||||
{ /* Convert to SP relative address instead of BP */
|
||||
assert(Rn == 29); // BP
|
||||
offset += cgstate.EBPtoESP; // add difference in offset
|
||||
ins = setField(ins,9,5,31); // set Rn to SP
|
||||
}
|
||||
|
|
|
@ -1603,7 +1603,7 @@ private void cmpval(CGstate cg, ref CodeBuilder cdb, ulong val, uint sz, reg_t r
|
|||
if (cg.AArch64)
|
||||
{
|
||||
assert(sreg == NOREG);
|
||||
if (val <= 0xFFF || val >= 0x1000 && val <= 0xFFF000)
|
||||
if (val <= 0xFFF || val >= 0x1000 && val <= 0xFFF000 && ((val & 0xFFF) == 0))
|
||||
{
|
||||
ubyte sh = val >= 0x1000;
|
||||
uint imm12 = cast(uint)(sh ? val >> 12 : val);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue