@@ -2677,23 +2677,32 @@ AArch64AsmPrinter::lowerBlockAddressConstant(const BlockAddress &BA) {
26772677
26782678void AArch64AsmPrinter::emitCBPseudoExpansion (const MachineInstr *MI) {
26792679 bool IsImm = false ;
2680- bool Is32Bit = false ;
2680+ unsigned Width = 0 ;
26812681
26822682 switch (MI->getOpcode ()) {
26832683 default :
26842684 llvm_unreachable (" This is not a CB pseudo instruction" );
2685+ case AArch64::CBBAssertExt:
2686+ IsImm = false ;
2687+ Width = 8 ;
2688+ break ;
2689+ case AArch64::CBHAssertExt:
2690+ IsImm = false ;
2691+ Width = 16 ;
2692+ break ;
26852693 case AArch64::CBWPrr:
2686- Is32Bit = true ;
2694+ Width = 32 ;
26872695 break ;
26882696 case AArch64::CBXPrr:
2689- Is32Bit = false ;
2697+ Width = 64 ;
26902698 break ;
26912699 case AArch64::CBWPri:
26922700 IsImm = true ;
2693- Is32Bit = true ;
2701+ Width = 32 ;
26942702 break ;
26952703 case AArch64::CBXPri:
26962704 IsImm = true ;
2705+ Width = 64 ;
26972706 break ;
26982707 }
26992708
@@ -2703,61 +2712,61 @@ void AArch64AsmPrinter::emitCBPseudoExpansion(const MachineInstr *MI) {
27032712 bool NeedsImmDec = false ;
27042713 bool NeedsImmInc = false ;
27052714
2715+ #define GET_CB_OPC (IsImm, Width, ImmCond, RegCond ) \
2716+ (IsImm \
2717+ ? (Width == 32 ? AArch64::CB##ImmCond##Wri : AArch64::CB##ImmCond##Xri) \
2718+ : (Width == 8 \
2719+ ? AArch64::CBB##RegCond##Wrr \
2720+ : (Width == 16 ? AArch64::CBH##RegCond##Wrr \
2721+ : (Width == 32 ? AArch64::CB##RegCond##Wrr \
2722+ : AArch64::CB##RegCond##Xrr))))
2723+ unsigned MCOpC;
2724+
27062725 // Decide if we need to either swap register operands or increment/decrement
27072726 // immediate operands
2708- unsigned MCOpC;
27092727 switch (CC) {
27102728 default :
27112729 llvm_unreachable (" Invalid CB condition code" );
27122730 case AArch64CC::EQ:
2713- MCOpC = IsImm ? (Is32Bit ? AArch64::CBEQWri : AArch64::CBEQXri)
2714- : (Is32Bit ? AArch64::CBEQWrr : AArch64::CBEQXrr);
2731+ MCOpC = GET_CB_OPC (IsImm, Width, /* Reg-Imm */ EQ, /* Reg-Reg */ EQ);
27152732 break ;
27162733 case AArch64CC::NE:
2717- MCOpC = IsImm ? (Is32Bit ? AArch64::CBNEWri : AArch64::CBNEXri)
2718- : (Is32Bit ? AArch64::CBNEWrr : AArch64::CBNEXrr);
2734+ MCOpC = GET_CB_OPC (IsImm, Width, /* Reg-Imm */ NE, /* Reg-Reg */ NE);
27192735 break ;
27202736 case AArch64CC::HS:
2721- MCOpC = IsImm ? (Is32Bit ? AArch64::CBHIWri : AArch64::CBHIXri)
2722- : (Is32Bit ? AArch64::CBHSWrr : AArch64::CBHSXrr);
2737+ MCOpC = GET_CB_OPC (IsImm, Width, /* Reg-Imm */ HI, /* Reg-Reg */ HS);
27232738 NeedsImmDec = IsImm;
27242739 break ;
27252740 case AArch64CC::LO:
2726- MCOpC = IsImm ? (Is32Bit ? AArch64::CBLOWri : AArch64::CBLOXri)
2727- : (Is32Bit ? AArch64::CBHIWrr : AArch64::CBHIXrr);
2741+ MCOpC = GET_CB_OPC (IsImm, Width, /* Reg-Imm */ LO, /* Reg-Reg */ HI);
27282742 NeedsRegSwap = !IsImm;
27292743 break ;
27302744 case AArch64CC::HI:
2731- MCOpC = IsImm ? (Is32Bit ? AArch64::CBHIWri : AArch64::CBHIXri)
2732- : (Is32Bit ? AArch64::CBHIWrr : AArch64::CBHIXrr);
2745+ MCOpC = GET_CB_OPC (IsImm, Width, /* Reg-Imm */ HI, /* Reg-Reg */ HI);
27332746 break ;
27342747 case AArch64CC::LS:
2735- MCOpC = IsImm ? (Is32Bit ? AArch64::CBLOWri : AArch64::CBLOXri)
2736- : (Is32Bit ? AArch64::CBHSWrr : AArch64::CBHSXrr);
2748+ MCOpC = GET_CB_OPC (IsImm, Width, /* Reg-Imm */ LO, /* Reg-Reg */ HS);
27372749 NeedsRegSwap = !IsImm;
27382750 NeedsImmInc = IsImm;
27392751 break ;
27402752 case AArch64CC::GE:
2741- MCOpC = IsImm ? (Is32Bit ? AArch64::CBGTWri : AArch64::CBGTXri)
2742- : (Is32Bit ? AArch64::CBGEWrr : AArch64::CBGEXrr);
2753+ MCOpC = GET_CB_OPC (IsImm, Width, /* Reg-Imm */ GT, /* Reg-Reg */ GE);
27432754 NeedsImmDec = IsImm;
27442755 break ;
27452756 case AArch64CC::LT:
2746- MCOpC = IsImm ? (Is32Bit ? AArch64::CBLTWri : AArch64::CBLTXri)
2747- : (Is32Bit ? AArch64::CBGTWrr : AArch64::CBGTXrr);
2757+ MCOpC = GET_CB_OPC (IsImm, Width, /* Reg-Imm */ LT, /* Reg-Reg */ GT);
27482758 NeedsRegSwap = !IsImm;
27492759 break ;
27502760 case AArch64CC::GT:
2751- MCOpC = IsImm ? (Is32Bit ? AArch64::CBGTWri : AArch64::CBGTXri)
2752- : (Is32Bit ? AArch64::CBGTWrr : AArch64::CBGTXrr);
2761+ MCOpC = GET_CB_OPC (IsImm, Width, /* Reg-Imm */ GT, /* Reg-Reg */ GT);
27532762 break ;
27542763 case AArch64CC::LE:
2755- MCOpC = IsImm ? (Is32Bit ? AArch64::CBLTWri : AArch64::CBLTXri)
2756- : (Is32Bit ? AArch64::CBGEWrr : AArch64::CBGEXrr);
2764+ MCOpC = GET_CB_OPC (IsImm, Width, /* Reg-Imm */ LT, /* Reg-Reg */ GE);
27572765 NeedsRegSwap = !IsImm;
27582766 NeedsImmInc = IsImm;
27592767 break ;
27602768 }
2769+ #undef GET_CB_OPC
27612770
27622771 MCInst Inst;
27632772 Inst.setOpcode (MCOpC);
@@ -3422,6 +3431,8 @@ void AArch64AsmPrinter::emitInstruction(const MachineInstr *MI) {
34223431 }
34233432 case AArch64::CBWPri:
34243433 case AArch64::CBXPri:
3434+ case AArch64::CBBAssertExt:
3435+ case AArch64::CBHAssertExt:
34253436 case AArch64::CBWPrr:
34263437 case AArch64::CBXPrr:
34273438 emitCBPseudoExpansion (MI);
0 commit comments