blob: 5ada03b2e9edb5d9f90ca86fc538f8dd5c6e6447 [file] [log] [blame]
Clement Courbet44b4c542018-06-19 11:28:59 +00001#include "Target.h"
2
3#include <cassert>
4#include <memory>
5
Clement Courbeta51efc22018-06-25 13:12:02 +00006#include "MCTargetDesc/X86MCTargetDesc.h"
Clement Courbete7851692018-07-03 06:17:05 +00007#include "llvm/Support/TargetRegistry.h"
8#include "llvm/Support/TargetSelect.h"
Clement Courbet44b4c542018-06-19 11:28:59 +00009#include "gmock/gmock.h"
10#include "gtest/gtest.h"
11
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000012#include "llvm/MC/MCInstPrinter.h"
13
14namespace llvm {
15
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000016bool operator==(const MCOperand &a, const MCOperand &b) {
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000017 if (a.isImm() && b.isImm())
18 return a.getImm() == b.getImm();
19 if (a.isReg() && b.isReg())
20 return a.getReg() == b.getReg();
21 return false;
22}
23
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000024bool operator==(const MCInst &a, const MCInst &b) {
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000025 if (a.getOpcode() != b.getOpcode())
26 return false;
27 if (a.getNumOperands() != b.getNumOperands())
28 return false;
29 for (unsigned I = 0; I < a.getNumOperands(); ++I) {
30 if (!(a.getOperand(I) == b.getOperand(I)))
31 return false;
32 }
33 return true;
34}
35
36} // namespace llvm
37
Clement Courbet44b4c542018-06-19 11:28:59 +000038namespace exegesis {
39
40void InitializeX86ExegesisTarget();
41
42namespace {
43
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000044using testing::AllOf;
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000045using testing::ElementsAre;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000046using testing::ElementsAreArray;
47using testing::Eq;
Clement Courbeta51efc22018-06-25 13:12:02 +000048using testing::Gt;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000049using testing::Matcher;
Clement Courbet44b4c542018-06-19 11:28:59 +000050using testing::NotNull;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000051using testing::Property;
Clement Courbeta51efc22018-06-25 13:12:02 +000052using testing::SizeIs;
Clement Courbet44b4c542018-06-19 11:28:59 +000053
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000054using llvm::APInt;
55using llvm::MCInst;
56using llvm::MCInstBuilder;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000057using llvm::MCOperand;
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000058
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000059Matcher<MCOperand> IsImm(int64_t Value) {
60 return AllOf(Property(&MCOperand::isImm, Eq(true)),
61 Property(&MCOperand::getImm, Eq(Value)));
62}
Clement Courbete7851692018-07-03 06:17:05 +000063
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000064Matcher<MCOperand> IsReg(unsigned Reg) {
65 return AllOf(Property(&MCOperand::isReg, Eq(true)),
66 Property(&MCOperand::getReg, Eq(Reg)));
67}
68
69Matcher<MCInst> OpcodeIs(unsigned Opcode) {
70 return Property(&MCInst::getOpcode, Eq(Opcode));
71}
72
73Matcher<MCInst> IsMovImmediate(unsigned Opcode, int64_t Reg, int64_t Value) {
74 return AllOf(OpcodeIs(Opcode), ElementsAre(IsReg(Reg), IsImm(Value)));
75}
76
77Matcher<MCInst> IsMovValueToStack(unsigned Opcode, int64_t Value,
78 size_t Offset) {
79 return AllOf(OpcodeIs(Opcode),
80 ElementsAre(IsReg(llvm::X86::RSP), IsImm(1), IsReg(0),
81 IsImm(Offset), IsReg(0), IsImm(Value)));
82}
83
84Matcher<MCInst> IsMovValueFromStack(unsigned Opcode, unsigned Reg) {
85 return AllOf(OpcodeIs(Opcode),
86 ElementsAre(IsReg(Reg), IsReg(llvm::X86::RSP), IsImm(1),
87 IsReg(0), IsImm(0), IsReg(0)));
88}
89
90Matcher<MCInst> IsStackAllocate(unsigned Size) {
91 return AllOf(
92 OpcodeIs(llvm::X86::SUB64ri8),
93 ElementsAre(IsReg(llvm::X86::RSP), IsReg(llvm::X86::RSP), IsImm(Size)));
94}
95
96Matcher<MCInst> IsStackDeallocate(unsigned Size) {
97 return AllOf(
98 OpcodeIs(llvm::X86::ADD64ri8),
99 ElementsAre(IsReg(llvm::X86::RSP), IsReg(llvm::X86::RSP), IsImm(Size)));
100}
101
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +0000102constexpr const char kTriple[] = "x86_64-unknown-linux";
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000103
Clement Courbet44b4c542018-06-19 11:28:59 +0000104class X86TargetTest : public ::testing::Test {
105protected:
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +0000106 X86TargetTest(const char *Features)
Clement Courbete7851692018-07-03 06:17:05 +0000107 : ExegesisTarget_(ExegesisTarget::lookup(llvm::Triple(kTriple))) {
108 EXPECT_THAT(ExegesisTarget_, NotNull());
109 std::string error;
110 Target_ = llvm::TargetRegistry::lookupTarget(kTriple, error);
Clement Courbeta51efc22018-06-25 13:12:02 +0000111 EXPECT_THAT(Target_, NotNull());
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +0000112 STI_.reset(Target_->createMCSubtargetInfo(kTriple, "core2", Features));
Clement Courbeta51efc22018-06-25 13:12:02 +0000113 }
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000114
Clement Courbete7851692018-07-03 06:17:05 +0000115 static void SetUpTestCase() {
116 LLVMInitializeX86TargetInfo();
117 LLVMInitializeX86Target();
118 LLVMInitializeX86TargetMC();
119 InitializeX86ExegesisTarget();
120 }
Clement Courbeta51efc22018-06-25 13:12:02 +0000121
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000122 std::vector<MCInst> setRegTo(unsigned Reg, const APInt &Value) {
123 return ExegesisTarget_->setRegTo(*STI_, Reg, Value);
124 }
125
Clement Courbete7851692018-07-03 06:17:05 +0000126 const llvm::Target *Target_;
127 const ExegesisTarget *const ExegesisTarget_;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000128 std::unique_ptr<llvm::MCSubtargetInfo> STI_;
Clement Courbet44b4c542018-06-19 11:28:59 +0000129};
130
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +0000131class Core2TargetTest : public X86TargetTest {
132public:
133 Core2TargetTest() : X86TargetTest("") {}
134};
135
136class Core2AvxTargetTest : public X86TargetTest {
137public:
138 Core2AvxTargetTest() : X86TargetTest("+avx") {}
139};
140
141class Core2Avx512TargetTest : public X86TargetTest {
142public:
143 Core2Avx512TargetTest() : X86TargetTest("+avx512vl") {}
144};
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000145
146TEST_F(Core2TargetTest, SetFlags) {
147 const unsigned Reg = llvm::X86::EFLAGS;
148 EXPECT_THAT(
149 setRegTo(Reg, APInt(64, 0x1111222233334444ULL)),
150 ElementsAre(IsStackAllocate(8),
151 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 0),
152 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 4),
153 OpcodeIs(llvm::X86::POPF64)));
Clement Courbeta51efc22018-06-25 13:12:02 +0000154}
155
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000156TEST_F(Core2TargetTest, SetRegToGR8Value) {
157 const uint8_t Value = 0xFFU;
158 const unsigned Reg = llvm::X86::AL;
159 EXPECT_THAT(setRegTo(Reg, APInt(8, Value)),
160 ElementsAre(IsMovImmediate(llvm::X86::MOV8ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000161}
162
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000163TEST_F(Core2TargetTest, SetRegToGR16Value) {
164 const uint16_t Value = 0xFFFFU;
165 const unsigned Reg = llvm::X86::BX;
166 EXPECT_THAT(setRegTo(Reg, APInt(16, Value)),
167 ElementsAre(IsMovImmediate(llvm::X86::MOV16ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000168}
169
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000170TEST_F(Core2TargetTest, SetRegToGR32Value) {
171 const uint32_t Value = 0x7FFFFU;
172 const unsigned Reg = llvm::X86::ECX;
173 EXPECT_THAT(setRegTo(Reg, APInt(32, Value)),
174 ElementsAre(IsMovImmediate(llvm::X86::MOV32ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000175}
176
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000177TEST_F(Core2TargetTest, SetRegToGR64Value) {
178 const uint64_t Value = 0x7FFFFFFFFFFFFFFFULL;
179 const unsigned Reg = llvm::X86::RDX;
180 EXPECT_THAT(setRegTo(Reg, APInt(64, Value)),
181 ElementsAre(IsMovImmediate(llvm::X86::MOV64ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000182}
183
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000184TEST_F(Core2TargetTest, SetRegToVR64Value) {
185 EXPECT_THAT(
186 setRegTo(llvm::X86::MM0, APInt(64, 0x1111222233334444ULL)),
187 ElementsAre(IsStackAllocate(8),
188 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 0),
189 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 4),
190 IsMovValueFromStack(llvm::X86::MMX_MOVQ64rm, llvm::X86::MM0),
191 IsStackDeallocate(8)));
Clement Courbete7851692018-07-03 06:17:05 +0000192}
193
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000194TEST_F(Core2TargetTest, SetRegToVR128Value_Use_MOVDQUrm) {
195 EXPECT_THAT(
196 setRegTo(llvm::X86::XMM0,
197 APInt(128, "11112222333344445555666677778888", 16)),
198 ElementsAre(IsStackAllocate(16),
199 IsMovValueToStack(llvm::X86::MOV32mi, 0x77778888UL, 0),
200 IsMovValueToStack(llvm::X86::MOV32mi, 0x55556666UL, 4),
201 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 8),
202 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 12),
203 IsMovValueFromStack(llvm::X86::MOVDQUrm, llvm::X86::XMM0),
204 IsStackDeallocate(16)));
Clement Courbete7851692018-07-03 06:17:05 +0000205}
206
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000207TEST_F(Core2AvxTargetTest, SetRegToVR128Value_Use_VMOVDQUrm) {
208 EXPECT_THAT(
209 setRegTo(llvm::X86::XMM0,
210 APInt(128, "11112222333344445555666677778888", 16)),
211 ElementsAre(IsStackAllocate(16),
212 IsMovValueToStack(llvm::X86::MOV32mi, 0x77778888UL, 0),
213 IsMovValueToStack(llvm::X86::MOV32mi, 0x55556666UL, 4),
214 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 8),
215 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 12),
216 IsMovValueFromStack(llvm::X86::VMOVDQUrm, llvm::X86::XMM0),
217 IsStackDeallocate(16)));
Clement Courbet44b4c542018-06-19 11:28:59 +0000218}
219
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000220TEST_F(Core2Avx512TargetTest, SetRegToVR128Value_Use_VMOVDQU32Z128rm) {
221 EXPECT_THAT(
222 setRegTo(llvm::X86::XMM0,
223 APInt(128, "11112222333344445555666677778888", 16)),
224 ElementsAre(
225 IsStackAllocate(16),
226 IsMovValueToStack(llvm::X86::MOV32mi, 0x77778888UL, 0),
227 IsMovValueToStack(llvm::X86::MOV32mi, 0x55556666UL, 4),
228 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 8),
229 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 12),
230 IsMovValueFromStack(llvm::X86::VMOVDQU32Z128rm, llvm::X86::XMM0),
231 IsStackDeallocate(16)));
232}
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000233
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000234TEST_F(Core2AvxTargetTest, SetRegToVR256Value_Use_VMOVDQUYrm) {
235 const char ValueStr[] =
236 "1111111122222222333333334444444455555555666666667777777788888888";
237 EXPECT_THAT(setRegTo(llvm::X86::YMM0, APInt(256, ValueStr, 16)),
238 ElementsAreArray(
239 {IsStackAllocate(32),
240 IsMovValueToStack(llvm::X86::MOV32mi, 0x88888888UL, 0),
241 IsMovValueToStack(llvm::X86::MOV32mi, 0x77777777UL, 4),
242 IsMovValueToStack(llvm::X86::MOV32mi, 0x66666666UL, 8),
243 IsMovValueToStack(llvm::X86::MOV32mi, 0x55555555UL, 12),
244 IsMovValueToStack(llvm::X86::MOV32mi, 0x44444444UL, 16),
245 IsMovValueToStack(llvm::X86::MOV32mi, 0x33333333UL, 20),
246 IsMovValueToStack(llvm::X86::MOV32mi, 0x22222222UL, 24),
247 IsMovValueToStack(llvm::X86::MOV32mi, 0x11111111UL, 28),
248 IsMovValueFromStack(llvm::X86::VMOVDQUYrm, llvm::X86::YMM0),
249 IsStackDeallocate(32)}));
250}
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000251
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000252TEST_F(Core2Avx512TargetTest, SetRegToVR256Value_Use_VMOVDQU32Z256rm) {
253 const char ValueStr[] =
254 "1111111122222222333333334444444455555555666666667777777788888888";
255 EXPECT_THAT(
256 setRegTo(llvm::X86::YMM0, APInt(256, ValueStr, 16)),
257 ElementsAreArray(
258 {IsStackAllocate(32),
259 IsMovValueToStack(llvm::X86::MOV32mi, 0x88888888UL, 0),
260 IsMovValueToStack(llvm::X86::MOV32mi, 0x77777777UL, 4),
261 IsMovValueToStack(llvm::X86::MOV32mi, 0x66666666UL, 8),
262 IsMovValueToStack(llvm::X86::MOV32mi, 0x55555555UL, 12),
263 IsMovValueToStack(llvm::X86::MOV32mi, 0x44444444UL, 16),
264 IsMovValueToStack(llvm::X86::MOV32mi, 0x33333333UL, 20),
265 IsMovValueToStack(llvm::X86::MOV32mi, 0x22222222UL, 24),
266 IsMovValueToStack(llvm::X86::MOV32mi, 0x11111111UL, 28),
267 IsMovValueFromStack(llvm::X86::VMOVDQU32Z256rm, llvm::X86::YMM0),
268 IsStackDeallocate(32)}));
269}
270
271TEST_F(Core2Avx512TargetTest, SetRegToVR512Value) {
272 const char ValueStr[] =
273 "1111111122222222333333334444444455555555666666667777777788888888"
274 "99999999AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDDEEEEEEEEFFFFFFFF00000000";
275 EXPECT_THAT(
276 setRegTo(llvm::X86::ZMM0, APInt(512, ValueStr, 16)),
277 ElementsAreArray(
278 {IsStackAllocate(64),
279 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 0),
280 IsMovValueToStack(llvm::X86::MOV32mi, 0xFFFFFFFFUL, 4),
281 IsMovValueToStack(llvm::X86::MOV32mi, 0xEEEEEEEEUL, 8),
282 IsMovValueToStack(llvm::X86::MOV32mi, 0xDDDDDDDDUL, 12),
283 IsMovValueToStack(llvm::X86::MOV32mi, 0xCCCCCCCCUL, 16),
284 IsMovValueToStack(llvm::X86::MOV32mi, 0xBBBBBBBBUL, 20),
285 IsMovValueToStack(llvm::X86::MOV32mi, 0xAAAAAAAAUL, 24),
286 IsMovValueToStack(llvm::X86::MOV32mi, 0x99999999UL, 28),
287 IsMovValueToStack(llvm::X86::MOV32mi, 0x88888888UL, 32),
288 IsMovValueToStack(llvm::X86::MOV32mi, 0x77777777UL, 36),
289 IsMovValueToStack(llvm::X86::MOV32mi, 0x66666666UL, 40),
290 IsMovValueToStack(llvm::X86::MOV32mi, 0x55555555UL, 44),
291 IsMovValueToStack(llvm::X86::MOV32mi, 0x44444444UL, 48),
292 IsMovValueToStack(llvm::X86::MOV32mi, 0x33333333UL, 52),
293 IsMovValueToStack(llvm::X86::MOV32mi, 0x22222222UL, 56),
294 IsMovValueToStack(llvm::X86::MOV32mi, 0x11111111UL, 60),
295 IsMovValueFromStack(llvm::X86::VMOVDQU32Zrm, llvm::X86::ZMM0),
296 IsStackDeallocate(64)}));
297}
298
Clement Courbetc51f4522018-10-19 09:56:54 +0000299// Note: We always put 80 bits on the stack independently of the size of the
300// value. This uses a bit more space but makes the code simpler.
301
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000302TEST_F(Core2TargetTest, SetRegToST0_32Bits) {
303 EXPECT_THAT(
304 setRegTo(llvm::X86::ST0, APInt(32, 0x11112222ULL)),
Clement Courbetc51f4522018-10-19 09:56:54 +0000305 ElementsAre(IsStackAllocate(10),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000306 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 0),
Clement Courbetc51f4522018-10-19 09:56:54 +0000307 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 4),
308 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
309 OpcodeIs(llvm::X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000310}
311
312TEST_F(Core2TargetTest, SetRegToST1_32Bits) {
313 const MCInst CopySt0ToSt1 =
314 llvm::MCInstBuilder(llvm::X86::ST_Frr).addReg(llvm::X86::ST1);
315 EXPECT_THAT(
316 setRegTo(llvm::X86::ST1, APInt(32, 0x11112222ULL)),
Clement Courbetc51f4522018-10-19 09:56:54 +0000317 ElementsAre(IsStackAllocate(10),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000318 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 0),
Clement Courbetc51f4522018-10-19 09:56:54 +0000319 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 4),
320 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
321 OpcodeIs(llvm::X86::LD_F80m), CopySt0ToSt1,
322 IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000323}
324
325TEST_F(Core2TargetTest, SetRegToST0_64Bits) {
326 EXPECT_THAT(
327 setRegTo(llvm::X86::ST0, APInt(64, 0x1111222233334444ULL)),
Clement Courbetc51f4522018-10-19 09:56:54 +0000328 ElementsAre(IsStackAllocate(10),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000329 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 0),
330 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 4),
Clement Courbetc51f4522018-10-19 09:56:54 +0000331 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
332 OpcodeIs(llvm::X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000333}
334
335TEST_F(Core2TargetTest, SetRegToST0_80Bits) {
336 EXPECT_THAT(
337 setRegTo(llvm::X86::ST0, APInt(80, "11112222333344445555", 16)),
338 ElementsAre(IsStackAllocate(10),
339 IsMovValueToStack(llvm::X86::MOV32mi, 0x44445555UL, 0),
340 IsMovValueToStack(llvm::X86::MOV32mi, 0x22223333UL, 4),
341 IsMovValueToStack(llvm::X86::MOV16mi, 0x1111UL, 8),
342 OpcodeIs(llvm::X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000343}
344
Clement Courbetc51f4522018-10-19 09:56:54 +0000345TEST_F(Core2TargetTest, SetRegToFP0_80Bits) {
346 EXPECT_THAT(
347 setRegTo(llvm::X86::FP0, APInt(80, "11112222333344445555", 16)),
348 ElementsAre(IsStackAllocate(10),
349 IsMovValueToStack(llvm::X86::MOV32mi, 0x44445555UL, 0),
350 IsMovValueToStack(llvm::X86::MOV32mi, 0x22223333UL, 4),
351 IsMovValueToStack(llvm::X86::MOV16mi, 0x1111UL, 8),
352 OpcodeIs(llvm::X86::LD_Fp80m), IsStackDeallocate(10)));
353}
354
355TEST_F(Core2TargetTest, SetRegToFP1_32Bits) {
356 EXPECT_THAT(
357 setRegTo(llvm::X86::FP1, APInt(32, 0x11112222ULL)),
358 ElementsAre(IsStackAllocate(10),
359 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 0),
360 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 4),
361 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
362 OpcodeIs(llvm::X86::LD_Fp80m),
363 IsStackDeallocate(10)));
364}
365
366TEST_F(Core2TargetTest, SetRegToFP1_4Bits) {
367 EXPECT_THAT(
368 setRegTo(llvm::X86::FP1, APInt(4, 0x1ULL)),
369 ElementsAre(IsStackAllocate(10),
370 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000001UL, 0),
371 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 4),
372 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
373 OpcodeIs(llvm::X86::LD_Fp80m),
374 IsStackDeallocate(10)));
375}
376
Clement Courbet44b4c542018-06-19 11:28:59 +0000377} // namespace
378} // namespace exegesis