> On 14 Dec 2023, at 14:28, tender wang <tndrwang@gmail.com> wrote: > > Now that AND is more faster, Can we replace the '% SLRU_MAX_BANKLOCKS' operation in SimpleLruGetBankLock() with '& 127'
unsigned int GetBankno1(unsigned int pageno) { return pageno & 127; }
unsigned int GetBankno2(unsigned int pageno) { return pageno % 128; }
Generates with -O2
GetBankno1(unsigned int): mov eax, edi and eax, 127 ret GetBankno2(unsigned int): mov eax, edi and eax, 127 ret
Compiler is smart enough with constants.
Yeah, that's true.
int GetBankno(long pageno) {
unsignedshort bank_mask = 128;
int bankno = (pageno & bank_mask) % 128;
return bankno;
}
enable -O2, only one instruction:
xor eax, eax
But if we all use '%', thing changs as below:
int GetBankno(long pageno) {
unsignedshort bank_mask = 128;
int bankno = (pageno % bank_mask) % 128;
return bankno;
}
mov rdx, rdi sar rdx, 63 shr rdx, 57 lea rax, [rdi+rdx] and eax, 127 sub eax, edx