@@ -133,6 +133,8 @@ class AArch64InstructionSelector : public InstructionSelector {
133
133
MachineInstr *emitIntegerCompare (MachineOperand &LHS, MachineOperand &RHS,
134
134
MachineOperand &Predicate,
135
135
MachineIRBuilder &MIRBuilder) const ;
136
+ MachineInstr *emitADD (Register DefReg, MachineOperand &LHS, MachineOperand &RHS,
137
+ MachineIRBuilder &MIRBuilder) const ;
136
138
MachineInstr *emitCMN (MachineOperand &LHS, MachineOperand &RHS,
137
139
MachineIRBuilder &MIRBuilder) const ;
138
140
MachineInstr *emitTST (const Register &LHS, const Register &RHS,
@@ -1829,8 +1831,7 @@ bool AArch64InstructionSelector::select(MachineInstr &I,
1829
1831
return selectVectorSHL (I, MRI);
1830
1832
LLVM_FALLTHROUGH;
1831
1833
case TargetOpcode::G_OR:
1832
- case TargetOpcode::G_LSHR:
1833
- case TargetOpcode::G_GEP: {
1834
+ case TargetOpcode::G_LSHR: {
1834
1835
// Reject the various things we don't support yet.
1835
1836
if (unsupportedBinOp (I, RBI, MRI, TRI))
1836
1837
return false ;
@@ -1852,6 +1853,13 @@ bool AArch64InstructionSelector::select(MachineInstr &I,
1852
1853
return constrainSelectedInstRegOperands (I, TII, TRI, RBI);
1853
1854
}
1854
1855
1856
+ case TargetOpcode::G_GEP: {
1857
+ MachineIRBuilder MIRBuilder (I);
1858
+ emitADD (I.getOperand (0 ).getReg (), I.getOperand (1 ), I.getOperand (2 ),
1859
+ MIRBuilder);
1860
+ I.eraseFromParent ();
1861
+ return true ;
1862
+ }
1855
1863
case TargetOpcode::G_UADDO: {
1856
1864
// TODO: Support other types.
1857
1865
unsigned OpSize = Ty.getSizeInBits ();
@@ -3080,6 +3088,31 @@ getInsertVecEltOpInfo(const RegisterBank &RB, unsigned EltSize) {
3080
3088
return std::make_pair (Opc, SubregIdx);
3081
3089
}
3082
3090
3091
+ MachineInstr *
3092
+ AArch64InstructionSelector::emitADD (Register DefReg, MachineOperand &LHS,
3093
+ MachineOperand &RHS,
3094
+ MachineIRBuilder &MIRBuilder) const {
3095
+ assert (LHS.isReg () && RHS.isReg () && " Expected LHS and RHS to be registers!" );
3096
+ MachineRegisterInfo &MRI = MIRBuilder.getMF ().getRegInfo ();
3097
+ static const unsigned OpcTable[2 ][2 ]{{AArch64::ADDXrr, AArch64::ADDXri},
3098
+ {AArch64::ADDWrr, AArch64::ADDWri}};
3099
+ bool Is32Bit = MRI.getType (LHS.getReg ()).getSizeInBits () == 32 ;
3100
+ auto ImmFns = selectArithImmed (RHS);
3101
+ unsigned Opc = OpcTable[Is32Bit][ImmFns.hasValue ()];
3102
+ auto AddMI = MIRBuilder.buildInstr (Opc, {DefReg}, {LHS.getReg ()});
3103
+
3104
+ // If we matched a valid constant immediate, add those operands.
3105
+ if (ImmFns) {
3106
+ for (auto &RenderFn : *ImmFns)
3107
+ RenderFn (AddMI);
3108
+ } else {
3109
+ AddMI.addUse (RHS.getReg ());
3110
+ }
3111
+
3112
+ constrainSelectedInstRegOperands (*AddMI, TII, TRI, RBI);
3113
+ return &*AddMI;
3114
+ }
3115
+
3083
3116
MachineInstr *
3084
3117
AArch64InstructionSelector::emitCMN (MachineOperand &LHS, MachineOperand &RHS,
3085
3118
MachineIRBuilder &MIRBuilder) const {
0 commit comments