@@ -107,6 +107,54 @@ TEST_P(MCPlusBuilderTester, AliasSmallerX0) {
107
107
testRegAliases (Triple::aarch64, AArch64::X0, AliasesX0, AliasesX0Count, true );
108
108
}
109
109
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
+
110
158
#endif // AARCH64_AVAILABLE
111
159
112
160
#ifdef X86_AVAILABLE
@@ -143,6 +191,50 @@ TEST_P(MCPlusBuilderTester, ReplaceRegWithImm) {
143
191
ASSERT_EQ (II->getOperand (1 ).getImm (), 1 );
144
192
}
145
193
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
+
146
238
#endif // X86_AVAILABLE
147
239
148
240
TEST_P (MCPlusBuilderTester, Annotation) {
0 commit comments