[llvm] [AArch64][GlobalISel] Select UMULL instruction (PR #65469)
David Green via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 20 04:26:08 PDT 2023
================
@@ -1110,6 +1110,78 @@ void applyUnmergeExtToUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
Observer.changedInstr(MI);
}
+// Match mul({z/s}ext , {z/s}ext) => {u/s}mull OR
+// Match v2s64 mul instructions, which will then be scalarised later on
+// Doing these two matches in one function to ensure that the order of matching
+// will always be the same.
+// Try lowering MUL to MULL before trying to scalarize if needed.
+bool matchExtMulToMULL(MachineInstr &MI, MachineRegisterInfo &MRI) {
+ // Get the instructions that defined the source operand
+ LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
+ MachineInstr *I1 = getDefIgnoringCopies(MI.getOperand(1).getReg(), MRI);
+ MachineInstr *I2 = getDefIgnoringCopies(MI.getOperand(2).getReg(), MRI);
+
+ if (DstTy.isVector()) {
+ // If the source operands were EXTENDED before, then {U/S}MULL can be used
+ unsigned I1Opcode = I1->getOpcode();
+ unsigned I2Opcode = I2->getOpcode();
+ if (((I1Opcode == TargetOpcode::G_ZEXT &&
+ I2Opcode == TargetOpcode::G_ZEXT) ||
+ (I1Opcode == TargetOpcode::G_SEXT &&
+ I2Opcode == TargetOpcode::G_SEXT)) &&
+ (MRI.getType(I1->getOperand(0).getReg()).getScalarSizeInBits() ==
+ MRI.getType(I1->getOperand(1).getReg()).getScalarSizeInBits() * 2) &&
+ (MRI.getType(I2->getOperand(0).getReg()).getScalarSizeInBits() ==
+ MRI.getType(I2->getOperand(1).getReg()).getScalarSizeInBits() * 2)) {
+ return true;
+ }
+ // If result type is v2s64, scalarise the instruction
+ else if (DstTy == LLT::fixed_vector(2, 64)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void applyExtMulToMULL(MachineInstr &MI, MachineRegisterInfo &MRI,
+ MachineIRBuilder &B, GISelChangeObserver &Observer) {
+ assert(MI.getOpcode() == TargetOpcode::G_MUL &&
+ "Expected a G_MUL instruction");
+
+ // Get the instructions that defined the source operand
+ LLT DstTy = MRI.getType(MI.getOperand(0).getReg());
+ MachineInstr *I1 = getDefIgnoringCopies(MI.getOperand(1).getReg(), MRI);
+ MachineInstr *I2 = getDefIgnoringCopies(MI.getOperand(2).getReg(), MRI);
+
+ // If the source operands were EXTENDED before, then {U/S}MULL can be used
+ unsigned I1Opcode = I1->getOpcode();
----------------
davemgreen wrote:
If you shorten this variable name to I1Opc, the later lines might format a little better.
https://github.com/llvm/llvm-project/pull/65469
More information about the llvm-commits
mailing list