Add missing 64 bit shift operations to the X64 macro assembler
Change-Id: I1e593e5ed0bb24ed3a158d98495209945c8bb309 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
This commit is contained in:
parent
3e80f3bef9
commit
7fa8393aac
|
@ -327,14 +327,61 @@ public:
|
|||
m_assembler.xorq_ir(imm.m_value, srcDest);
|
||||
}
|
||||
|
||||
void lshift64(TrustedImm32 imm, RegisterID dest)
|
||||
{
|
||||
m_assembler.shlq_i8r(imm.m_value, dest);
|
||||
}
|
||||
|
||||
void lshift64(RegisterID src, RegisterID dest)
|
||||
{
|
||||
if (src == X86Registers::ecx)
|
||||
m_assembler.shlq_CLr(dest);
|
||||
else {
|
||||
ASSERT(src != dest);
|
||||
|
||||
// Can only shift by ecx, so we do some swapping if we see anything else.
|
||||
swap(src, X86Registers::ecx);
|
||||
m_assembler.shlq_CLr(dest == X86Registers::ecx ? src : dest);
|
||||
swap(src, X86Registers::ecx);
|
||||
}
|
||||
}
|
||||
|
||||
void rshift64(TrustedImm32 imm, RegisterID dest)
|
||||
{
|
||||
m_assembler.sarq_i8r(imm.m_value, dest);
|
||||
}
|
||||
|
||||
void rshift64(RegisterID src, RegisterID dest)
|
||||
{
|
||||
if (src == X86Registers::ecx)
|
||||
m_assembler.sarq_CLr(dest);
|
||||
else {
|
||||
ASSERT(src != dest);
|
||||
|
||||
// Can only shift by ecx, so we do some swapping if we see anything else.
|
||||
swap(src, X86Registers::ecx);
|
||||
m_assembler.sarq_CLr(dest == X86Registers::ecx ? src : dest);
|
||||
swap(src, X86Registers::ecx);
|
||||
}
|
||||
}
|
||||
|
||||
void urshift64(TrustedImm32 imm, RegisterID dest)
|
||||
{
|
||||
m_assembler.shrq_i8r(imm.m_value, dest);
|
||||
}
|
||||
|
||||
void lshift64(TrustedImm32 imm, RegisterID dest)
|
||||
void urshift64(RegisterID src, RegisterID dest)
|
||||
{
|
||||
m_assembler.shlq_i8r(imm.m_value, dest);
|
||||
if (src == X86Registers::ecx)
|
||||
m_assembler.shrq_CLr(dest);
|
||||
else {
|
||||
ASSERT(src != dest);
|
||||
|
||||
// Can only shift by ecx, so we do some swapping if we see anything else.
|
||||
swap(src, X86Registers::ecx);
|
||||
m_assembler.shrq_CLr(dest == X86Registers::ecx ? src : dest);
|
||||
swap(src, X86Registers::ecx);
|
||||
}
|
||||
}
|
||||
|
||||
void load64(ImplicitAddress address, RegisterID dest)
|
||||
|
|
|
@ -723,6 +723,21 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void sarq_CLr(RegisterID dst)
|
||||
{
|
||||
m_formatter.oneByteOp64(OP_GROUP2_EvCL, GROUP2_OP_SAR, dst);
|
||||
}
|
||||
|
||||
void sarq_i8r(int imm, RegisterID dst)
|
||||
{
|
||||
if (imm == 1)
|
||||
m_formatter.oneByteOp64(OP_GROUP2_Ev1, GROUP2_OP_SAR, dst);
|
||||
else {
|
||||
m_formatter.oneByteOp64(OP_GROUP2_EvIb, GROUP2_OP_SAR, dst);
|
||||
m_formatter.immediate8(imm);
|
||||
}
|
||||
}
|
||||
|
||||
void shrq_i8r(int imm, RegisterID dst)
|
||||
{
|
||||
// ### doesn't work when removing the "0 &&"
|
||||
|
@ -734,6 +749,11 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void shrq_CLr(RegisterID dst)
|
||||
{
|
||||
m_formatter.oneByteOp64(OP_GROUP2_EvCL, GROUP2_OP_SHR, dst);
|
||||
}
|
||||
|
||||
void shlq_i8r(int imm, RegisterID dst)
|
||||
{
|
||||
// ### doesn't work when removing the "0 &&"
|
||||
|
@ -745,7 +765,10 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void shlq_CLr(RegisterID dst)
|
||||
{
|
||||
m_formatter.oneByteOp64(OP_GROUP2_EvCL, GROUP2_OP_SHL, dst);
|
||||
}
|
||||
#endif
|
||||
|
||||
void sarl_i8r(int imm, RegisterID dst)
|
||||
|
@ -793,23 +816,6 @@ public:
|
|||
m_formatter.oneByteOp(OP_GROUP2_EvCL, GROUP2_OP_SHL, dst);
|
||||
}
|
||||
|
||||
#if CPU(X86_64)
|
||||
void sarq_CLr(RegisterID dst)
|
||||
{
|
||||
m_formatter.oneByteOp64(OP_GROUP2_EvCL, GROUP2_OP_SAR, dst);
|
||||
}
|
||||
|
||||
void sarq_i8r(int imm, RegisterID dst)
|
||||
{
|
||||
if (imm == 1)
|
||||
m_formatter.oneByteOp64(OP_GROUP2_Ev1, GROUP2_OP_SAR, dst);
|
||||
else {
|
||||
m_formatter.oneByteOp64(OP_GROUP2_EvIb, GROUP2_OP_SAR, dst);
|
||||
m_formatter.immediate8(imm);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void imull_rr(RegisterID src, RegisterID dst)
|
||||
{
|
||||
m_formatter.twoByteOp(OP2_IMUL_GvEv, dst, src);
|
||||
|
|
Loading…
Reference in New Issue