@@ -7868,62 +7868,48 @@ void AArch64InstrInfo::genAlternativeCodeSequence(
7868
7868
MUL = genFusedMultiply (MF, MRI, TII, Root, InsInstrs, 2 , Opc, RC);
7869
7869
break ;
7870
7870
case AArch64MachineCombinerPattern::MULADDWI_OP1:
7871
- case AArch64MachineCombinerPattern::MULADDXI_OP1: {
7871
+ case AArch64MachineCombinerPattern::MULADDXI_OP1:
7872
+ case AArch64MachineCombinerPattern::MULSUBWI_OP1:
7873
+ case AArch64MachineCombinerPattern::MULSUBXI_OP1: {
7872
7874
// MUL I=A,B,0
7873
- // ADD R,I,Imm
7874
- // ==> MOV V, Imm
7875
+ // ADD/SUB R,I,Imm
7876
+ // ==> MOV V, Imm/-Imm
7875
7877
// ==> MADD R,A,B,V
7876
7878
// --- Create(MADD);
7877
- const TargetRegisterClass *OrrRC;
7878
- unsigned BitSize, OrrOpc, ZeroReg;
7879
- if (Pattern == AArch64MachineCombinerPattern::MULADDWI_OP1) {
7880
- OrrOpc = AArch64::ORRWri;
7881
- OrrRC = &AArch64::GPR32spRegClass;
7879
+ const TargetRegisterClass *RC;
7880
+ unsigned BitSize, MovImm;
7881
+ if (Pattern == AArch64MachineCombinerPattern::MULADDWI_OP1 ||
7882
+ Pattern == AArch64MachineCombinerPattern::MULSUBWI_OP1) {
7883
+ MovImm = AArch64::MOVi32imm;
7884
+ RC = &AArch64::GPR32spRegClass;
7882
7885
BitSize = 32 ;
7883
- ZeroReg = AArch64::WZR;
7884
7886
Opc = AArch64::MADDWrrr;
7885
7887
RC = &AArch64::GPR32RegClass;
7886
7888
} else {
7887
- OrrOpc = AArch64::ORRXri ;
7888
- OrrRC = &AArch64::GPR64spRegClass;
7889
+ MovImm = AArch64::MOVi64imm ;
7890
+ RC = &AArch64::GPR64spRegClass;
7889
7891
BitSize = 64 ;
7890
- ZeroReg = AArch64::XZR;
7891
7892
Opc = AArch64::MADDXrrr;
7892
7893
RC = &AArch64::GPR64RegClass;
7893
7894
}
7894
- Register NewVR = MRI.createVirtualRegister (OrrRC );
7895
+ Register NewVR = MRI.createVirtualRegister (RC );
7895
7896
uint64_t Imm = Root.getOperand (2 ).getImm ();
7896
7897
7897
7898
if (Root.getOperand (3 ).isImm ()) {
7898
7899
unsigned Val = Root.getOperand (3 ).getImm ();
7899
7900
Imm = Imm << Val;
7900
7901
}
7901
- uint64_t UImm = SignExtend64 (Imm, BitSize);
7902
- // The immediate can be composed via a single instruction.
7902
+ bool IsSub = Pattern == AArch64MachineCombinerPattern::MULSUBWI_OP1 ||
7903
+ Pattern == AArch64MachineCombinerPattern::MULSUBXI_OP1;
7904
+ uint64_t UImm = SignExtend64 (IsSub ? -Imm : Imm, BitSize);
7905
+ // Check that the immediate can be composed via a single instruction.
7903
7906
SmallVector<AArch64_IMM::ImmInsnModel, 4 > Insn;
7904
7907
AArch64_IMM::expandMOVImm (UImm, BitSize, Insn);
7905
7908
if (Insn.size () != 1 )
7906
7909
return ;
7907
- auto MovI = Insn.begin ();
7908
- MachineInstrBuilder MIB1;
7909
- // MOV is an alias for one of three instructions: movz, movn, and orr.
7910
- if (MovI->Opcode == OrrOpc)
7911
- MIB1 = BuildMI (MF, MIMetadata (Root), TII->get (OrrOpc), NewVR)
7912
- .addReg (ZeroReg)
7913
- .addImm (MovI->Op2 );
7914
- else {
7915
- if (BitSize == 32 )
7916
- assert ((MovI->Opcode == AArch64::MOVNWi ||
7917
- MovI->Opcode == AArch64::MOVZWi) &&
7918
- " Expected opcode" );
7919
- else
7920
- assert ((MovI->Opcode == AArch64::MOVNXi ||
7921
- MovI->Opcode == AArch64::MOVZXi) &&
7922
- " Expected opcode" );
7923
- MIB1 = BuildMI (MF, MIMetadata (Root), TII->get (MovI->Opcode ), NewVR)
7924
- .addImm (MovI->Op1 )
7925
- .addImm (MovI->Op2 );
7926
- }
7910
+ MachineInstrBuilder MIB1 =
7911
+ BuildMI (MF, MIMetadata (Root), TII->get (MovImm), NewVR)
7912
+ .addImm (IsSub ? -Imm : Imm);
7927
7913
InsInstrs.push_back (MIB1);
7928
7914
InstrIdxForVirtReg.insert (std::make_pair (NewVR, 0 ));
7929
7915
MUL = genMaddR (MF, MRI, TII, Root, InsInstrs, 1 , Opc, NewVR, RC);
@@ -7977,67 +7963,6 @@ void AArch64InstrInfo::genAlternativeCodeSequence(
7977
7963
}
7978
7964
MUL = genFusedMultiply (MF, MRI, TII, Root, InsInstrs, 2 , Opc, RC);
7979
7965
break ;
7980
- case AArch64MachineCombinerPattern::MULSUBWI_OP1:
7981
- case AArch64MachineCombinerPattern::MULSUBXI_OP1: {
7982
- // MUL I=A,B,0
7983
- // SUB R,I, Imm
7984
- // ==> MOV V, -Imm
7985
- // ==> MADD R,A,B,V // = -Imm + A*B
7986
- // --- Create(MADD);
7987
- const TargetRegisterClass *OrrRC;
7988
- unsigned BitSize, OrrOpc, ZeroReg;
7989
- if (Pattern == AArch64MachineCombinerPattern::MULSUBWI_OP1) {
7990
- OrrOpc = AArch64::ORRWri;
7991
- OrrRC = &AArch64::GPR32spRegClass;
7992
- BitSize = 32 ;
7993
- ZeroReg = AArch64::WZR;
7994
- Opc = AArch64::MADDWrrr;
7995
- RC = &AArch64::GPR32RegClass;
7996
- } else {
7997
- OrrOpc = AArch64::ORRXri;
7998
- OrrRC = &AArch64::GPR64spRegClass;
7999
- BitSize = 64 ;
8000
- ZeroReg = AArch64::XZR;
8001
- Opc = AArch64::MADDXrrr;
8002
- RC = &AArch64::GPR64RegClass;
8003
- }
8004
- Register NewVR = MRI.createVirtualRegister (OrrRC);
8005
- uint64_t Imm = Root.getOperand (2 ).getImm ();
8006
- if (Root.getOperand (3 ).isImm ()) {
8007
- unsigned Val = Root.getOperand (3 ).getImm ();
8008
- Imm = Imm << Val;
8009
- }
8010
- uint64_t UImm = SignExtend64 (-Imm, BitSize);
8011
- // The immediate can be composed via a single instruction.
8012
- SmallVector<AArch64_IMM::ImmInsnModel, 4 > Insn;
8013
- AArch64_IMM::expandMOVImm (UImm, BitSize, Insn);
8014
- if (Insn.size () != 1 )
8015
- return ;
8016
- auto MovI = Insn.begin ();
8017
- MachineInstrBuilder MIB1;
8018
- // MOV is an alias for one of three instructions: movz, movn, and orr.
8019
- if (MovI->Opcode == OrrOpc)
8020
- MIB1 = BuildMI (MF, MIMetadata (Root), TII->get (OrrOpc), NewVR)
8021
- .addReg (ZeroReg)
8022
- .addImm (MovI->Op2 );
8023
- else {
8024
- if (BitSize == 32 )
8025
- assert ((MovI->Opcode == AArch64::MOVNWi ||
8026
- MovI->Opcode == AArch64::MOVZWi) &&
8027
- " Expected opcode" );
8028
- else
8029
- assert ((MovI->Opcode == AArch64::MOVNXi ||
8030
- MovI->Opcode == AArch64::MOVZXi) &&
8031
- " Expected opcode" );
8032
- MIB1 = BuildMI (MF, MIMetadata (Root), TII->get (MovI->Opcode ), NewVR)
8033
- .addImm (MovI->Op1 )
8034
- .addImm (MovI->Op2 );
8035
- }
8036
- InsInstrs.push_back (MIB1);
8037
- InstrIdxForVirtReg.insert (std::make_pair (NewVR, 0 ));
8038
- MUL = genMaddR (MF, MRI, TII, Root, InsInstrs, 1 , Opc, NewVR, RC);
8039
- break ;
8040
- }
8041
7966
case AArch64MachineCombinerPattern::MULADDv8i8_OP1:
8042
7967
Opc = AArch64::MLAv8i8;
8043
7968
RC = &AArch64::FPR64RegClass;
0 commit comments