Get rid of shlx

This commit is contained in:
offtkp 2024-08-28 23:42:43 +03:00
parent 4f6fe82936
commit 1d073fe56d
1 changed files with 16 additions and 8 deletions

View File

@ -424,6 +424,9 @@ static void GenerateINSERTQ(const ZydisDecodedOperand* operands, Xbyak::CodeGene
SaveRegisters(c, {scratch1, scratch2, index, mask});
// Backup rcx temporarily since we need it to shift
c.mov(scratch2, rcx);
// Get upper 64 bits of src
c.pextrq(index, src, 1);
c.mov(mask, index);
@ -437,23 +440,28 @@ static void GenerateINSERTQ(const ZydisDecodedOperand* operands, Xbyak::CodeGene
c.and_(index, 0x3F);
// Create a mask out of the length
c.mov(scratch1, 1);
c.shlx(mask, scratch1, mask);
c.sub(mask, 1);
c.mov(cl, mask.cvt8());
c.mov(mask, 1);
c.shl(mask, cl);
c.movq(scratch1, src);
c.movq(scratch2, dst);
// src &= mask
c.and_(scratch1, mask);
// dst &= ~(mask << index)
c.shlx(mask, mask, index);
c.mov(cl, index.cvt8());
c.shl(mask, cl);
c.not_(mask);
c.and_(scratch2, mask);
// dst |= (src << index)
c.shlx(scratch1, scratch1, index);
// src <<= index
c.shl(scratch1, cl);
// Restore rcx
c.mov(rcx, scratch2);
c.movq(scratch2, dst);
c.and_(scratch2, mask);
c.or_(scratch2, scratch1);
// Insert scratch2 into low 64 bits of dst, upper 64 bits are unaffected