mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-25 16:30:05 +00:00
Convert SHUFPD with the same register for both sources to PSHUFD if it would prevent a register copy. Similar to SHUFPS, but requires the mask to be converted.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148112 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
562659ff6b
commit
0518970dc8
@ -1605,6 +1605,24 @@ X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
|
||||
.addReg(B, getKillRegState(isKill)).addImm(M);
|
||||
break;
|
||||
}
|
||||
case X86::SHUFPDrri: {
|
||||
assert(MI->getNumOperands() == 4 && "Unknown shufpd instruction!");
|
||||
if (!TM.getSubtarget<X86Subtarget>().hasSSE2()) return 0;
|
||||
|
||||
unsigned B = MI->getOperand(1).getReg();
|
||||
unsigned C = MI->getOperand(2).getReg();
|
||||
if (B != C) return 0;
|
||||
unsigned A = MI->getOperand(0).getReg();
|
||||
unsigned M = MI->getOperand(3).getImm();
|
||||
|
||||
// Convert to PSHUFD mask.
|
||||
M = ((M & 1) << 1) | ((M & 1) << 3) | ((M & 2) << 4) | ((M & 2) << 6)| 0x44;
|
||||
|
||||
NewMI = BuildMI(MF, MI->getDebugLoc(), get(X86::PSHUFDri))
|
||||
.addReg(A, RegState::Define | getDeadRegState(isDead))
|
||||
.addReg(B, getKillRegState(isKill)).addImm(M);
|
||||
break;
|
||||
}
|
||||
case X86::SHL64ri: {
|
||||
assert(MI->getNumOperands() >= 3 && "Unknown shift instruction!");
|
||||
// NOTE: LEA doesn't produce flags like shift does, but LLVM never uses
|
||||
|
@ -2330,7 +2330,8 @@ let Constraints = "$src1 = $dst" in {
|
||||
TB;
|
||||
defm SHUFPD : sse12_shuffle<VR128, f128mem, v2f64,
|
||||
"shufpd\t{$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
memopv2f64, SSEPackedDouble>, TB, OpSize;
|
||||
memopv2f64, SSEPackedDouble, 1 /* cvt to pshufd */>,
|
||||
TB, OpSize;
|
||||
}
|
||||
|
||||
let Predicates = [HasAVX] in {
|
||||
|
Loading…
x
Reference in New Issue
Block a user