@@ -221,7 +221,6 @@ class AArch64InstructionSelector : public InstructionSelector {
221221 bool selectIntrinsicWithSideEffects (MachineInstr &I,
222222 MachineRegisterInfo &MRI);
223223 bool selectIntrinsic (MachineInstr &I, MachineRegisterInfo &MRI);
224- bool selectVectorICmp (MachineInstr &I, MachineRegisterInfo &MRI);
225224 bool selectJumpTable (MachineInstr &I, MachineRegisterInfo &MRI);
226225 bool selectBrJT (MachineInstr &I, MachineRegisterInfo &MRI);
227226 bool selectTLSGlobalValue (MachineInstr &I, MachineRegisterInfo &MRI);
@@ -3403,7 +3402,7 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
34033402 }
34043403 case TargetOpcode::G_ICMP: {
34053404 if (Ty.isVector ())
3406- return selectVectorICmp (I, MRI) ;
3405+ return false ;
34073406
34083407 if (Ty != LLT::scalar (32 )) {
34093408 LLVM_DEBUG (dbgs () << " G_ICMP result has type: " << Ty
@@ -3652,177 +3651,6 @@ bool AArch64InstructionSelector::selectTLSGlobalValue(
36523651 return true ;
36533652}
36543653
3655- bool AArch64InstructionSelector::selectVectorICmp (
3656- MachineInstr &I, MachineRegisterInfo &MRI) {
3657- Register DstReg = I.getOperand (0 ).getReg ();
3658- LLT DstTy = MRI.getType (DstReg);
3659- Register SrcReg = I.getOperand (2 ).getReg ();
3660- Register Src2Reg = I.getOperand (3 ).getReg ();
3661- LLT SrcTy = MRI.getType (SrcReg);
3662-
3663- unsigned SrcEltSize = SrcTy.getElementType ().getSizeInBits ();
3664- unsigned NumElts = DstTy.getNumElements ();
3665-
3666- // First index is element size, 0 == 8b, 1 == 16b, 2 == 32b, 3 == 64b
3667- // Second index is num elts, 0 == v2, 1 == v4, 2 == v8, 3 == v16
3668- // Third index is cc opcode:
3669- // 0 == eq
3670- // 1 == ugt
3671- // 2 == uge
3672- // 3 == ult
3673- // 4 == ule
3674- // 5 == sgt
3675- // 6 == sge
3676- // 7 == slt
3677- // 8 == sle
3678- // ne is done by negating 'eq' result.
3679-
3680- // This table below assumes that for some comparisons the operands will be
3681- // commuted.
3682- // ult op == commute + ugt op
3683- // ule op == commute + uge op
3684- // slt op == commute + sgt op
3685- // sle op == commute + sge op
3686- unsigned PredIdx = 0 ;
3687- bool SwapOperands = false ;
3688- CmpInst::Predicate Pred = (CmpInst::Predicate)I.getOperand (1 ).getPredicate ();
3689- switch (Pred) {
3690- case CmpInst::ICMP_NE:
3691- case CmpInst::ICMP_EQ:
3692- PredIdx = 0 ;
3693- break ;
3694- case CmpInst::ICMP_UGT:
3695- PredIdx = 1 ;
3696- break ;
3697- case CmpInst::ICMP_UGE:
3698- PredIdx = 2 ;
3699- break ;
3700- case CmpInst::ICMP_ULT:
3701- PredIdx = 3 ;
3702- SwapOperands = true ;
3703- break ;
3704- case CmpInst::ICMP_ULE:
3705- PredIdx = 4 ;
3706- SwapOperands = true ;
3707- break ;
3708- case CmpInst::ICMP_SGT:
3709- PredIdx = 5 ;
3710- break ;
3711- case CmpInst::ICMP_SGE:
3712- PredIdx = 6 ;
3713- break ;
3714- case CmpInst::ICMP_SLT:
3715- PredIdx = 7 ;
3716- SwapOperands = true ;
3717- break ;
3718- case CmpInst::ICMP_SLE:
3719- PredIdx = 8 ;
3720- SwapOperands = true ;
3721- break ;
3722- default :
3723- llvm_unreachable (" Unhandled icmp predicate" );
3724- return false ;
3725- }
3726-
3727- // This table obviously should be tablegen'd when we have our GISel native
3728- // tablegen selector.
3729-
3730- static const unsigned OpcTable[4 ][4 ][9 ] = {
3731- {
3732- {0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3733- 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3734- 0 /* invalid */ },
3735- {0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3736- 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3737- 0 /* invalid */ },
3738- {AArch64::CMEQv8i8, AArch64::CMHIv8i8, AArch64::CMHSv8i8,
3739- AArch64::CMHIv8i8, AArch64::CMHSv8i8, AArch64::CMGTv8i8,
3740- AArch64::CMGEv8i8, AArch64::CMGTv8i8, AArch64::CMGEv8i8},
3741- {AArch64::CMEQv16i8, AArch64::CMHIv16i8, AArch64::CMHSv16i8,
3742- AArch64::CMHIv16i8, AArch64::CMHSv16i8, AArch64::CMGTv16i8,
3743- AArch64::CMGEv16i8, AArch64::CMGTv16i8, AArch64::CMGEv16i8}
3744- },
3745- {
3746- {0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3747- 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3748- 0 /* invalid */ },
3749- {AArch64::CMEQv4i16, AArch64::CMHIv4i16, AArch64::CMHSv4i16,
3750- AArch64::CMHIv4i16, AArch64::CMHSv4i16, AArch64::CMGTv4i16,
3751- AArch64::CMGEv4i16, AArch64::CMGTv4i16, AArch64::CMGEv4i16},
3752- {AArch64::CMEQv8i16, AArch64::CMHIv8i16, AArch64::CMHSv8i16,
3753- AArch64::CMHIv8i16, AArch64::CMHSv8i16, AArch64::CMGTv8i16,
3754- AArch64::CMGEv8i16, AArch64::CMGTv8i16, AArch64::CMGEv8i16},
3755- {0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3756- 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3757- 0 /* invalid */ }
3758- },
3759- {
3760- {AArch64::CMEQv2i32, AArch64::CMHIv2i32, AArch64::CMHSv2i32,
3761- AArch64::CMHIv2i32, AArch64::CMHSv2i32, AArch64::CMGTv2i32,
3762- AArch64::CMGEv2i32, AArch64::CMGTv2i32, AArch64::CMGEv2i32},
3763- {AArch64::CMEQv4i32, AArch64::CMHIv4i32, AArch64::CMHSv4i32,
3764- AArch64::CMHIv4i32, AArch64::CMHSv4i32, AArch64::CMGTv4i32,
3765- AArch64::CMGEv4i32, AArch64::CMGTv4i32, AArch64::CMGEv4i32},
3766- {0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3767- 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3768- 0 /* invalid */ },
3769- {0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3770- 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3771- 0 /* invalid */ }
3772- },
3773- {
3774- {AArch64::CMEQv2i64, AArch64::CMHIv2i64, AArch64::CMHSv2i64,
3775- AArch64::CMHIv2i64, AArch64::CMHSv2i64, AArch64::CMGTv2i64,
3776- AArch64::CMGEv2i64, AArch64::CMGTv2i64, AArch64::CMGEv2i64},
3777- {0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3778- 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3779- 0 /* invalid */ },
3780- {0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3781- 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3782- 0 /* invalid */ },
3783- {0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3784- 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ , 0 /* invalid */ ,
3785- 0 /* invalid */ }
3786- },
3787- };
3788- unsigned EltIdx = Log2_32 (SrcEltSize / 8 );
3789- unsigned NumEltsIdx = Log2_32 (NumElts / 2 );
3790- unsigned Opc = OpcTable[EltIdx][NumEltsIdx][PredIdx];
3791- if (!Opc) {
3792- LLVM_DEBUG (dbgs () << " Could not map G_ICMP to cmp opcode" );
3793- return false ;
3794- }
3795-
3796- const RegisterBank &VecRB = *RBI.getRegBank (SrcReg, MRI, TRI);
3797- const TargetRegisterClass *SrcRC =
3798- getRegClassForTypeOnBank (SrcTy, VecRB, true );
3799- if (!SrcRC) {
3800- LLVM_DEBUG (dbgs () << " Could not determine source register class.\n " );
3801- return false ;
3802- }
3803-
3804- unsigned NotOpc = Pred == ICmpInst::ICMP_NE ? AArch64::NOTv8i8 : 0 ;
3805- if (SrcTy.getSizeInBits () == 128 )
3806- NotOpc = NotOpc ? AArch64::NOTv16i8 : 0 ;
3807-
3808- if (SwapOperands)
3809- std::swap (SrcReg, Src2Reg);
3810-
3811- auto Cmp = MIB.buildInstr (Opc, {SrcRC}, {SrcReg, Src2Reg});
3812- constrainSelectedInstRegOperands (*Cmp, TII, TRI, RBI);
3813-
3814- // Invert if we had a 'ne' cc.
3815- if (NotOpc) {
3816- Cmp = MIB.buildInstr (NotOpc, {DstReg}, {Cmp});
3817- constrainSelectedInstRegOperands (*Cmp, TII, TRI, RBI);
3818- } else {
3819- MIB.buildCopy (DstReg, Cmp.getReg (0 ));
3820- }
3821- RBI.constrainGenericRegister (DstReg, *SrcRC, MRI);
3822- I.eraseFromParent ();
3823- return true ;
3824- }
3825-
38263654MachineInstr *AArch64InstructionSelector::emitScalarToVector (
38273655 unsigned EltSize, const TargetRegisterClass *DstRC, Register Scalar,
38283656 MachineIRBuilder &MIRBuilder) const {
0 commit comments