FROM_TO(MOVSX16rr8, CBW, AX, AL) // movsbw %al, %ax --> cbtw
FROM_TO(MOVSX32rr16, CWDE, EAX, AX) // movswl %ax, %eax --> cwtl
FROM_TO(MOVSX64rr32, CDQE, RAX, EAX) // movslq %eax, %rax --> cltq
+#undef FROM_TO
}
MI.clear();
MI.setOpcode(NewOpc);
return true;
}
+
+bool X86::optimizeINCDEC(MCInst &MI, bool In64BitMode) {
+ if (In64BitMode)
+ return false;
+ unsigned NewOpc;
+ // If we aren't in 64-bit mode we can use the 1-byte inc/dec instructions.
+#define FROM_TO(FROM, TO) \
+ case X86::FROM: \
+ NewOpc = X86::TO; \
+ break;
+ switch (MI.getOpcode()) {
+ default:
+ return false;
+ FROM_TO(DEC16r, DEC16r_alt)
+ FROM_TO(DEC32r, DEC32r_alt)
+ FROM_TO(INC16r, INC16r_alt)
+ FROM_TO(INC32r, INC32r_alt)
+ }
+ MI.setOpcode(NewOpc);
+ return true;
+}
if (X86::optimizeMOVSX(OutMI))
return;
+ bool In64BitMode = AsmPrinter.getSubtarget().is64Bit();
+ if (X86::optimizeINCDEC(OutMI, In64BitMode))
+ return;
+
// Handle a few special cases to eliminate operand modifiers.
switch (OutMI.getOpcode()) {
case X86::LEA64_32r:
case X86::CATCHRET: {
// Replace CATCHRET with the appropriate RET.
const X86Subtarget &Subtarget = AsmPrinter.getSubtarget();
- unsigned ReturnReg = Subtarget.is64Bit() ? X86::RAX : X86::EAX;
+ unsigned ReturnReg = In64BitMode ? X86::RAX : X86::EAX;
OutMI = MCInst();
OutMI.setOpcode(getRetOpcode(Subtarget));
OutMI.addOperand(MCOperand::createReg(ReturnReg));
OutMI.setOpcode(convertTailJumpOpcode(OutMI.getOpcode()));
break;
- case X86::DEC16r:
- case X86::DEC32r:
- case X86::INC16r:
- case X86::INC32r:
- // If we aren't in 64-bit mode we can use the 1-byte inc/dec instructions.
- if (!AsmPrinter.getSubtarget().is64Bit()) {
- unsigned Opcode;
- switch (OutMI.getOpcode()) {
- default: llvm_unreachable("Invalid opcode");
- case X86::DEC16r: Opcode = X86::DEC16r_alt; break;
- case X86::DEC32r: Opcode = X86::DEC32r_alt; break;
- case X86::INC16r: Opcode = X86::INC16r_alt; break;
- case X86::INC32r: Opcode = X86::INC32r_alt; break;
- }
- OutMI.setOpcode(Opcode);
- }
- break;
-
// We don't currently select the correct instruction form for instructions
// which have a short %eax, etc. form. Handle this by custom lowering, for
// now.
}
case X86::MASKMOVDQU:
case X86::VMASKMOVDQU:
- if (AsmPrinter.getSubtarget().is64Bit())
+ if (In64BitMode)
OutMI.setFlags(X86::IP_HAS_AD_SIZE);
break;