@@ -221,7 +221,6 @@ class AArch64InstructionSelector : public InstructionSelector {
221
221
bool selectIntrinsicWithSideEffects (MachineInstr &I,
222
222
MachineRegisterInfo &MRI);
223
223
bool selectIntrinsic (MachineInstr &I, MachineRegisterInfo &MRI);
224
- bool selectVectorICmp (MachineInstr &I, MachineRegisterInfo &MRI);
225
224
bool selectJumpTable (MachineInstr &I, MachineRegisterInfo &MRI);
226
225
bool selectBrJT (MachineInstr &I, MachineRegisterInfo &MRI);
227
226
bool selectTLSGlobalValue (MachineInstr &I, MachineRegisterInfo &MRI);
@@ -3403,7 +3402,7 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
3403
3402
}
3404
3403
case TargetOpcode::G_ICMP: {
3405
3404
if (Ty.isVector ())
3406
- return selectVectorICmp (I, MRI) ;
3405
+ return false ;
3407
3406
3408
3407
if (Ty != LLT::scalar (32 )) {
3409
3408
LLVM_DEBUG (dbgs () << " G_ICMP result has type: " << Ty
@@ -3652,177 +3651,6 @@ bool AArch64InstructionSelector::selectTLSGlobalValue(
3652
3651
return true ;
3653
3652
}
3654
3653
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
-
3826
3654
MachineInstr *AArch64InstructionSelector::emitScalarToVector (
3827
3655
unsigned EltSize, const TargetRegisterClass *DstRC, Register Scalar,
3828
3656
MachineIRBuilder &MIRBuilder) const {
0 commit comments