@@ -107,6 +107,52 @@ TEST_P(MCPlusBuilderTester, AliasSmallerX0) {
107107 testRegAliases (Triple::aarch64, AArch64::X0, AliasesX0, AliasesX0Count, true );
108108}
109109
110+ TEST_P (MCPlusBuilderTester, AArch64_CmpJE) {
111+ if (GetParam () != Triple::aarch64)
112+ GTEST_SKIP ();
113+ BinaryFunction *BF = BC->createInjectedBinaryFunction (" BF" , true );
114+ std::unique_ptr<BinaryBasicBlock> BB = BF->createBasicBlock ();
115+
116+ InstructionListType Instrs = BC->MIB ->createCmpJE (AArch64::X0, 2 , BB->getLabel (), BC->Ctx .get ());
117+ BB->addInstructions (Instrs.begin (), Instrs.end ());
118+ BB->addSuccessor (BB.get ());
119+
120+ auto II = BB->begin ();
121+ ASSERT_EQ (II->getOpcode (), AArch64::SUBSXri);
122+ ASSERT_EQ (II->getOperand (0 ).getReg (), AArch64::XZR);
123+ ASSERT_EQ (II->getOperand (1 ).getReg (), AArch64::X0);
124+ ASSERT_EQ (II->getOperand (2 ).getImm (), 2 );
125+ ASSERT_EQ (II->getOperand (3 ).getImm (), 0 );
126+ II++;
127+ ASSERT_EQ (II->getOpcode (), AArch64::Bcc);
128+ ASSERT_EQ (II->getOperand (0 ).getImm (), AArch64CC::EQ);
129+ const MCSymbol *Label = BC->MIB ->getTargetSymbol (*II,1 );
130+ ASSERT_EQ (Label, BB->getLabel ());
131+ }
132+
133+ TEST_P (MCPlusBuilderTester, AArch64_CmpJNE) {
134+ if (GetParam () != Triple::aarch64)
135+ GTEST_SKIP ();
136+ BinaryFunction *BF = BC->createInjectedBinaryFunction (" BF" , true );
137+ std::unique_ptr<BinaryBasicBlock> BB = BF->createBasicBlock ();
138+
139+ InstructionListType Instrs = BC->MIB ->createCmpJNE (AArch64::X0, 2 , BB->getLabel (), BC->Ctx .get ());
140+ BB->addInstructions (Instrs.begin (), Instrs.end ());
141+ BB->addSuccessor (BB.get ());
142+
143+ auto II = BB->begin ();
144+ ASSERT_EQ (II->getOpcode (), AArch64::SUBSXri);
145+ ASSERT_EQ (II->getOperand (0 ).getReg (), AArch64::XZR);
146+ ASSERT_EQ (II->getOperand (1 ).getReg (), AArch64::X0);
147+ ASSERT_EQ (II->getOperand (2 ).getImm (), 2 );
148+ ASSERT_EQ (II->getOperand (3 ).getImm (), 0 );
149+ II++;
150+ ASSERT_EQ (II->getOpcode (), AArch64::Bcc);
151+ ASSERT_EQ (II->getOperand (0 ).getImm (), AArch64CC::NE);
152+ const MCSymbol *Label = BC->MIB ->getTargetSymbol (*II,1 );
153+ ASSERT_EQ (Label, BB->getLabel ());
154+ }
155+
110156#endif // AARCH64_AVAILABLE
111157
112158#ifdef X86_AVAILABLE
@@ -143,6 +189,48 @@ TEST_P(MCPlusBuilderTester, ReplaceRegWithImm) {
143189 ASSERT_EQ (II->getOperand (1 ).getImm (), 1 );
144190}
145191
192+ TEST_P (MCPlusBuilderTester, X86_CmpJE) {
193+ if (GetParam () != Triple::x86_64)
194+ GTEST_SKIP ();
195+ BinaryFunction *BF = BC->createInjectedBinaryFunction (" BF" , true );
196+ std::unique_ptr<BinaryBasicBlock> BB = BF->createBasicBlock ();
197+
198+ InstructionListType Instrs = BC->MIB ->createCmpJE (X86::EAX, 2 , BB->getLabel (), BC->Ctx .get ());
199+ BB->addInstructions (Instrs.begin (), Instrs.end ());
200+ BB->addSuccessor (BB.get ());
201+
202+ auto II = BB->begin ();
203+ ASSERT_EQ (II->getOpcode (), X86::CMP64ri8);
204+ ASSERT_EQ (II->getOperand (0 ).getReg (), X86::EAX);
205+ ASSERT_EQ (II->getOperand (1 ).getImm (), 2 );
206+ II++;
207+ ASSERT_EQ (II->getOpcode (), X86::JCC_1);
208+ const MCSymbol *Label = BC->MIB ->getTargetSymbol (*II,0 );
209+ ASSERT_EQ (Label, BB->getLabel ());
210+ ASSERT_EQ (II->getOperand (1 ).getImm (), X86::COND_E);
211+ }
212+
213+ TEST_P (MCPlusBuilderTester, X86_CmpJNE) {
214+ if (GetParam () != Triple::x86_64)
215+ GTEST_SKIP ();
216+ BinaryFunction *BF = BC->createInjectedBinaryFunction (" BF" , true );
217+ std::unique_ptr<BinaryBasicBlock> BB = BF->createBasicBlock ();
218+
219+ InstructionListType Instrs = BC->MIB ->createCmpJNE (X86::EAX, 2 , BB->getLabel (), BC->Ctx .get ());
220+ BB->addInstructions (Instrs.begin (), Instrs.end ());
221+ BB->addSuccessor (BB.get ());
222+
223+ auto II = BB->begin ();
224+ ASSERT_EQ (II->getOpcode (), X86::CMP64ri8);
225+ ASSERT_EQ (II->getOperand (0 ).getReg (), X86::EAX);
226+ ASSERT_EQ (II->getOperand (1 ).getImm (), 2 );
227+ II++;
228+ ASSERT_EQ (II->getOpcode (), X86::JCC_1);
229+ const MCSymbol *Label = BC->MIB ->getTargetSymbol (*II,0 );
230+ ASSERT_EQ (Label, BB->getLabel ());
231+ ASSERT_EQ (II->getOperand (1 ).getImm (), X86::COND_NE);
232+ }
233+
146234#endif // X86_AVAILABLE
147235
148236TEST_P (MCPlusBuilderTester, Annotation) {
0 commit comments