mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 05:00:16 +03:00
detail optimize switch compares (#21163)
This commit is contained in:
parent
a03aa271f8
commit
b2926b6b2a
1 changed files with 18 additions and 8 deletions
|
@ -1598,12 +1598,21 @@ struct CaseVal
|
|||
* Generate comparison of [reg2,reg] with val
|
||||
*/
|
||||
@trusted
|
||||
private void cmpval(CGstate cg, ref CodeBuilder cdb, targ_llong val, uint sz, reg_t reg, reg_t reg2, reg_t sreg)
|
||||
private void cmpval(CGstate cg, ref CodeBuilder cdb, ulong val, uint sz, reg_t reg, reg_t reg2, reg_t sreg)
|
||||
{
|
||||
if (cg.AArch64)
|
||||
{
|
||||
// TODO AArch64 use CMP https://www.scs.stanford.edu/~zyedidia/arm64/cmp_subs_addsub_imm.html
|
||||
assert(sreg == NOREG);
|
||||
if (val <= 0xFFF || val >= 0x1000 && val <= 0xFFF000)
|
||||
{
|
||||
ubyte sh = val >= 0x1000;
|
||||
uint imm12 = cast(uint)(sh ? val >> 12 : val);
|
||||
assert((imm12 & ~0xFFF) == 0);
|
||||
// https://www.scs.stanford.edu/~zyedidia/arm64/cmp_subs_addsub_imm.html
|
||||
cdb.gen1(INSTR.cmp_imm(sz == 8, sh, imm12, reg)); // CMP reg,#imm12{, shift}
|
||||
}
|
||||
else
|
||||
{
|
||||
regm_t retregs = cg.allregs & ~mask(reg);
|
||||
sreg = allocreg(cdb,retregs,TYint);
|
||||
movregconst(cdb,sreg,val,sz == 8 ? 64 : 0);
|
||||
|
@ -1611,6 +1620,7 @@ private void cmpval(CGstate cg, ref CodeBuilder cdb, targ_llong val, uint sz, re
|
|||
assert(reg2 == NOREG);
|
||||
cdb.gen1(INSTR.cmp_shift(sz == 8, reg, 0, 0, sreg)); // CMP sreg,reg
|
||||
}
|
||||
}
|
||||
else if (I64 && sz == 8)
|
||||
{
|
||||
assert(reg2 == NOREG);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue