@@ -107,6 +107,54 @@ 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 =
117+ BC->MIB ->createCmpJE (AArch64::X0, 2 , BB->getLabel (), BC->Ctx .get ());
118+ BB->addInstructions (Instrs.begin (), Instrs.end ());
119+ BB->addSuccessor (BB.get ());
120+
121+ auto II = BB->begin ();
122+ ASSERT_EQ (II->getOpcode (), AArch64::SUBSXri);
123+ ASSERT_EQ (II->getOperand (0 ).getReg (), AArch64::XZR);
124+ ASSERT_EQ (II->getOperand (1 ).getReg (), AArch64::X0);
125+ ASSERT_EQ (II->getOperand (2 ).getImm (), 2 );
126+ ASSERT_EQ (II->getOperand (3 ).getImm (), 0 );
127+ II++;
128+ ASSERT_EQ (II->getOpcode (), AArch64::Bcc);
129+ ASSERT_EQ (II->getOperand (0 ).getImm (), AArch64CC::EQ);
130+ const MCSymbol *Label = BC->MIB ->getTargetSymbol (*II, 1 );
131+ ASSERT_EQ (Label, BB->getLabel ());
132+ }
133+
134+ TEST_P (MCPlusBuilderTester, AArch64_CmpJNE) {
135+ if (GetParam () != Triple::aarch64)
136+ GTEST_SKIP ();
137+ BinaryFunction *BF = BC->createInjectedBinaryFunction (" BF" , true );
138+ std::unique_ptr<BinaryBasicBlock> BB = BF->createBasicBlock ();
139+
140+ InstructionListType Instrs =
141+ BC->MIB ->createCmpJNE (AArch64::X0, 2 , BB->getLabel (), BC->Ctx .get ());
142+ BB->addInstructions (Instrs.begin (), Instrs.end ());
143+ BB->addSuccessor (BB.get ());
144+
145+ auto II = BB->begin ();
146+ ASSERT_EQ (II->getOpcode (), AArch64::SUBSXri);
147+ ASSERT_EQ (II->getOperand (0 ).getReg (), AArch64::XZR);
148+ ASSERT_EQ (II->getOperand (1 ).getReg (), AArch64::X0);
149+ ASSERT_EQ (II->getOperand (2 ).getImm (), 2 );
150+ ASSERT_EQ (II->getOperand (3 ).getImm (), 0 );
151+ II++;
152+ ASSERT_EQ (II->getOpcode (), AArch64::Bcc);
153+ ASSERT_EQ (II->getOperand (0 ).getImm (), AArch64CC::NE);
154+ const MCSymbol *Label = BC->MIB ->getTargetSymbol (*II, 1 );
155+ ASSERT_EQ (Label, BB->getLabel ());
156+ }
157+
110158#endif // AARCH64_AVAILABLE
111159
112160#ifdef X86_AVAILABLE
@@ -143,6 +191,50 @@ TEST_P(MCPlusBuilderTester, ReplaceRegWithImm) {
143191 ASSERT_EQ (II->getOperand (1 ).getImm (), 1 );
144192}
145193
194+ TEST_P (MCPlusBuilderTester, X86_CmpJE) {
195+ if (GetParam () != Triple::x86_64)
196+ GTEST_SKIP ();
197+ BinaryFunction *BF = BC->createInjectedBinaryFunction (" BF" , true );
198+ std::unique_ptr<BinaryBasicBlock> BB = BF->createBasicBlock ();
199+
200+ InstructionListType Instrs =
201+ BC->MIB ->createCmpJE (X86::EAX, 2 , BB->getLabel (), BC->Ctx .get ());
202+ BB->addInstructions (Instrs.begin (), Instrs.end ());
203+ BB->addSuccessor (BB.get ());
204+
205+ auto II = BB->begin ();
206+ ASSERT_EQ (II->getOpcode (), X86::CMP64ri8);
207+ ASSERT_EQ (II->getOperand (0 ).getReg (), X86::EAX);
208+ ASSERT_EQ (II->getOperand (1 ).getImm (), 2 );
209+ II++;
210+ ASSERT_EQ (II->getOpcode (), X86::JCC_1);
211+ const MCSymbol *Label = BC->MIB ->getTargetSymbol (*II, 0 );
212+ ASSERT_EQ (Label, BB->getLabel ());
213+ ASSERT_EQ (II->getOperand (1 ).getImm (), X86::COND_E);
214+ }
215+
216+ TEST_P (MCPlusBuilderTester, X86_CmpJNE) {
217+ if (GetParam () != Triple::x86_64)
218+ GTEST_SKIP ();
219+ BinaryFunction *BF = BC->createInjectedBinaryFunction (" BF" , true );
220+ std::unique_ptr<BinaryBasicBlock> BB = BF->createBasicBlock ();
221+
222+ InstructionListType Instrs =
223+ BC->MIB ->createCmpJNE (X86::EAX, 2 , BB->getLabel (), BC->Ctx .get ());
224+ BB->addInstructions (Instrs.begin (), Instrs.end ());
225+ BB->addSuccessor (BB.get ());
226+
227+ auto II = BB->begin ();
228+ ASSERT_EQ (II->getOpcode (), X86::CMP64ri8);
229+ ASSERT_EQ (II->getOperand (0 ).getReg (), X86::EAX);
230+ ASSERT_EQ (II->getOperand (1 ).getImm (), 2 );
231+ II++;
232+ ASSERT_EQ (II->getOpcode (), X86::JCC_1);
233+ const MCSymbol *Label = BC->MIB ->getTargetSymbol (*II, 0 );
234+ ASSERT_EQ (Label, BB->getLabel ());
235+ ASSERT_EQ (II->getOperand (1 ).getImm (), X86::COND_NE);
236+ }
237+
146238#endif // X86_AVAILABLE
147239
148240TEST_P (MCPlusBuilderTester, Annotation) {
0 commit comments