blob: b1ccb486bfb335a890d919f142c8ef6dd32c78b5 [file] [log] [blame]
Jinsong Ji56c74cf2018-11-20 14:41:59 +00001//===-- TargetTest.cpp -----------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Clement Courbet44b4c542018-06-19 11:28:59 +000010#include "Target.h"
11
12#include <cassert>
13#include <memory>
14
Clement Courbeta51efc22018-06-25 13:12:02 +000015#include "MCTargetDesc/X86MCTargetDesc.h"
Clement Courbete7851692018-07-03 06:17:05 +000016#include "llvm/Support/TargetRegistry.h"
17#include "llvm/Support/TargetSelect.h"
Clement Courbet44b4c542018-06-19 11:28:59 +000018#include "gmock/gmock.h"
19#include "gtest/gtest.h"
20
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000021#include "llvm/MC/MCInstPrinter.h"
22
23namespace llvm {
24
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000025bool operator==(const MCOperand &a, const MCOperand &b) {
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000026 if (a.isImm() && b.isImm())
27 return a.getImm() == b.getImm();
28 if (a.isReg() && b.isReg())
29 return a.getReg() == b.getReg();
30 return false;
31}
32
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000033bool operator==(const MCInst &a, const MCInst &b) {
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000034 if (a.getOpcode() != b.getOpcode())
35 return false;
36 if (a.getNumOperands() != b.getNumOperands())
37 return false;
38 for (unsigned I = 0; I < a.getNumOperands(); ++I) {
39 if (!(a.getOperand(I) == b.getOperand(I)))
40 return false;
41 }
42 return true;
43}
44
45} // namespace llvm
46
Fangrui Song32401af2018-10-22 17:10:47 +000047namespace llvm {
Clement Courbet44b4c542018-06-19 11:28:59 +000048namespace exegesis {
49
50void InitializeX86ExegesisTarget();
51
52namespace {
53
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000054using testing::AllOf;
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000055using testing::ElementsAre;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000056using testing::ElementsAreArray;
57using testing::Eq;
Clement Courbeta51efc22018-06-25 13:12:02 +000058using testing::Gt;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000059using testing::Matcher;
Clement Courbet44b4c542018-06-19 11:28:59 +000060using testing::NotNull;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000061using testing::Property;
Clement Courbeta51efc22018-06-25 13:12:02 +000062using testing::SizeIs;
Clement Courbet44b4c542018-06-19 11:28:59 +000063
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000064using llvm::APInt;
65using llvm::MCInst;
66using llvm::MCInstBuilder;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000067using llvm::MCOperand;
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000068
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000069Matcher<MCOperand> IsImm(int64_t Value) {
70 return AllOf(Property(&MCOperand::isImm, Eq(true)),
71 Property(&MCOperand::getImm, Eq(Value)));
72}
Clement Courbete7851692018-07-03 06:17:05 +000073
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000074Matcher<MCOperand> IsReg(unsigned Reg) {
75 return AllOf(Property(&MCOperand::isReg, Eq(true)),
76 Property(&MCOperand::getReg, Eq(Reg)));
77}
78
79Matcher<MCInst> OpcodeIs(unsigned Opcode) {
80 return Property(&MCInst::getOpcode, Eq(Opcode));
81}
82
83Matcher<MCInst> IsMovImmediate(unsigned Opcode, int64_t Reg, int64_t Value) {
84 return AllOf(OpcodeIs(Opcode), ElementsAre(IsReg(Reg), IsImm(Value)));
85}
86
87Matcher<MCInst> IsMovValueToStack(unsigned Opcode, int64_t Value,
88 size_t Offset) {
89 return AllOf(OpcodeIs(Opcode),
90 ElementsAre(IsReg(llvm::X86::RSP), IsImm(1), IsReg(0),
91 IsImm(Offset), IsReg(0), IsImm(Value)));
92}
93
94Matcher<MCInst> IsMovValueFromStack(unsigned Opcode, unsigned Reg) {
95 return AllOf(OpcodeIs(Opcode),
96 ElementsAre(IsReg(Reg), IsReg(llvm::X86::RSP), IsImm(1),
97 IsReg(0), IsImm(0), IsReg(0)));
98}
99
100Matcher<MCInst> IsStackAllocate(unsigned Size) {
101 return AllOf(
102 OpcodeIs(llvm::X86::SUB64ri8),
103 ElementsAre(IsReg(llvm::X86::RSP), IsReg(llvm::X86::RSP), IsImm(Size)));
104}
105
106Matcher<MCInst> IsStackDeallocate(unsigned Size) {
107 return AllOf(
108 OpcodeIs(llvm::X86::ADD64ri8),
109 ElementsAre(IsReg(llvm::X86::RSP), IsReg(llvm::X86::RSP), IsImm(Size)));
110}
111
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +0000112constexpr const char kTriple[] = "x86_64-unknown-linux";
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000113
Clement Courbet44b4c542018-06-19 11:28:59 +0000114class X86TargetTest : public ::testing::Test {
115protected:
Clement Courbetbbab5462018-11-19 14:31:43 +0000116 X86TargetTest(const char *Features) : State(kTriple, "core2", Features) {}
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000117
Clement Courbete7851692018-07-03 06:17:05 +0000118 static void SetUpTestCase() {
119 LLVMInitializeX86TargetInfo();
120 LLVMInitializeX86Target();
121 LLVMInitializeX86TargetMC();
122 InitializeX86ExegesisTarget();
123 }
Clement Courbeta51efc22018-06-25 13:12:02 +0000124
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000125 std::vector<MCInst> setRegTo(unsigned Reg, const APInt &Value) {
Clement Courbetbbab5462018-11-19 14:31:43 +0000126 return State.getExegesisTarget().setRegTo(State.getSubtargetInfo(), Reg,
127 Value);
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000128 }
129
Clement Courbetbbab5462018-11-19 14:31:43 +0000130 LLVMState State;
Clement Courbet44b4c542018-06-19 11:28:59 +0000131};
132
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +0000133class Core2TargetTest : public X86TargetTest {
134public:
135 Core2TargetTest() : X86TargetTest("") {}
136};
137
138class Core2AvxTargetTest : public X86TargetTest {
139public:
140 Core2AvxTargetTest() : X86TargetTest("+avx") {}
141};
142
143class Core2Avx512TargetTest : public X86TargetTest {
144public:
145 Core2Avx512TargetTest() : X86TargetTest("+avx512vl") {}
146};
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000147
148TEST_F(Core2TargetTest, SetFlags) {
149 const unsigned Reg = llvm::X86::EFLAGS;
150 EXPECT_THAT(
151 setRegTo(Reg, APInt(64, 0x1111222233334444ULL)),
152 ElementsAre(IsStackAllocate(8),
153 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 0),
154 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 4),
155 OpcodeIs(llvm::X86::POPF64)));
Clement Courbeta51efc22018-06-25 13:12:02 +0000156}
157
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000158TEST_F(Core2TargetTest, SetRegToGR8Value) {
159 const uint8_t Value = 0xFFU;
160 const unsigned Reg = llvm::X86::AL;
161 EXPECT_THAT(setRegTo(Reg, APInt(8, Value)),
162 ElementsAre(IsMovImmediate(llvm::X86::MOV8ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000163}
164
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000165TEST_F(Core2TargetTest, SetRegToGR16Value) {
166 const uint16_t Value = 0xFFFFU;
167 const unsigned Reg = llvm::X86::BX;
168 EXPECT_THAT(setRegTo(Reg, APInt(16, Value)),
169 ElementsAre(IsMovImmediate(llvm::X86::MOV16ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000170}
171
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000172TEST_F(Core2TargetTest, SetRegToGR32Value) {
173 const uint32_t Value = 0x7FFFFU;
174 const unsigned Reg = llvm::X86::ECX;
175 EXPECT_THAT(setRegTo(Reg, APInt(32, Value)),
176 ElementsAre(IsMovImmediate(llvm::X86::MOV32ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000177}
178
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000179TEST_F(Core2TargetTest, SetRegToGR64Value) {
180 const uint64_t Value = 0x7FFFFFFFFFFFFFFFULL;
181 const unsigned Reg = llvm::X86::RDX;
182 EXPECT_THAT(setRegTo(Reg, APInt(64, Value)),
183 ElementsAre(IsMovImmediate(llvm::X86::MOV64ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000184}
185
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000186TEST_F(Core2TargetTest, SetRegToVR64Value) {
187 EXPECT_THAT(
188 setRegTo(llvm::X86::MM0, APInt(64, 0x1111222233334444ULL)),
189 ElementsAre(IsStackAllocate(8),
190 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 0),
191 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 4),
192 IsMovValueFromStack(llvm::X86::MMX_MOVQ64rm, llvm::X86::MM0),
193 IsStackDeallocate(8)));
Clement Courbete7851692018-07-03 06:17:05 +0000194}
195
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000196TEST_F(Core2TargetTest, SetRegToVR128Value_Use_MOVDQUrm) {
197 EXPECT_THAT(
198 setRegTo(llvm::X86::XMM0,
199 APInt(128, "11112222333344445555666677778888", 16)),
200 ElementsAre(IsStackAllocate(16),
201 IsMovValueToStack(llvm::X86::MOV32mi, 0x77778888UL, 0),
202 IsMovValueToStack(llvm::X86::MOV32mi, 0x55556666UL, 4),
203 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 8),
204 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 12),
205 IsMovValueFromStack(llvm::X86::MOVDQUrm, llvm::X86::XMM0),
206 IsStackDeallocate(16)));
Clement Courbete7851692018-07-03 06:17:05 +0000207}
208
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000209TEST_F(Core2AvxTargetTest, SetRegToVR128Value_Use_VMOVDQUrm) {
210 EXPECT_THAT(
211 setRegTo(llvm::X86::XMM0,
212 APInt(128, "11112222333344445555666677778888", 16)),
213 ElementsAre(IsStackAllocate(16),
214 IsMovValueToStack(llvm::X86::MOV32mi, 0x77778888UL, 0),
215 IsMovValueToStack(llvm::X86::MOV32mi, 0x55556666UL, 4),
216 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 8),
217 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 12),
218 IsMovValueFromStack(llvm::X86::VMOVDQUrm, llvm::X86::XMM0),
219 IsStackDeallocate(16)));
Clement Courbet44b4c542018-06-19 11:28:59 +0000220}
221
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000222TEST_F(Core2Avx512TargetTest, SetRegToVR128Value_Use_VMOVDQU32Z128rm) {
223 EXPECT_THAT(
224 setRegTo(llvm::X86::XMM0,
225 APInt(128, "11112222333344445555666677778888", 16)),
226 ElementsAre(
227 IsStackAllocate(16),
228 IsMovValueToStack(llvm::X86::MOV32mi, 0x77778888UL, 0),
229 IsMovValueToStack(llvm::X86::MOV32mi, 0x55556666UL, 4),
230 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 8),
231 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 12),
232 IsMovValueFromStack(llvm::X86::VMOVDQU32Z128rm, llvm::X86::XMM0),
233 IsStackDeallocate(16)));
234}
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000235
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000236TEST_F(Core2AvxTargetTest, SetRegToVR256Value_Use_VMOVDQUYrm) {
237 const char ValueStr[] =
238 "1111111122222222333333334444444455555555666666667777777788888888";
239 EXPECT_THAT(setRegTo(llvm::X86::YMM0, APInt(256, ValueStr, 16)),
240 ElementsAreArray(
241 {IsStackAllocate(32),
242 IsMovValueToStack(llvm::X86::MOV32mi, 0x88888888UL, 0),
243 IsMovValueToStack(llvm::X86::MOV32mi, 0x77777777UL, 4),
244 IsMovValueToStack(llvm::X86::MOV32mi, 0x66666666UL, 8),
245 IsMovValueToStack(llvm::X86::MOV32mi, 0x55555555UL, 12),
246 IsMovValueToStack(llvm::X86::MOV32mi, 0x44444444UL, 16),
247 IsMovValueToStack(llvm::X86::MOV32mi, 0x33333333UL, 20),
248 IsMovValueToStack(llvm::X86::MOV32mi, 0x22222222UL, 24),
249 IsMovValueToStack(llvm::X86::MOV32mi, 0x11111111UL, 28),
250 IsMovValueFromStack(llvm::X86::VMOVDQUYrm, llvm::X86::YMM0),
251 IsStackDeallocate(32)}));
252}
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000253
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000254TEST_F(Core2Avx512TargetTest, SetRegToVR256Value_Use_VMOVDQU32Z256rm) {
255 const char ValueStr[] =
256 "1111111122222222333333334444444455555555666666667777777788888888";
257 EXPECT_THAT(
258 setRegTo(llvm::X86::YMM0, APInt(256, ValueStr, 16)),
259 ElementsAreArray(
260 {IsStackAllocate(32),
261 IsMovValueToStack(llvm::X86::MOV32mi, 0x88888888UL, 0),
262 IsMovValueToStack(llvm::X86::MOV32mi, 0x77777777UL, 4),
263 IsMovValueToStack(llvm::X86::MOV32mi, 0x66666666UL, 8),
264 IsMovValueToStack(llvm::X86::MOV32mi, 0x55555555UL, 12),
265 IsMovValueToStack(llvm::X86::MOV32mi, 0x44444444UL, 16),
266 IsMovValueToStack(llvm::X86::MOV32mi, 0x33333333UL, 20),
267 IsMovValueToStack(llvm::X86::MOV32mi, 0x22222222UL, 24),
268 IsMovValueToStack(llvm::X86::MOV32mi, 0x11111111UL, 28),
269 IsMovValueFromStack(llvm::X86::VMOVDQU32Z256rm, llvm::X86::YMM0),
270 IsStackDeallocate(32)}));
271}
272
273TEST_F(Core2Avx512TargetTest, SetRegToVR512Value) {
274 const char ValueStr[] =
275 "1111111122222222333333334444444455555555666666667777777788888888"
276 "99999999AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDDEEEEEEEEFFFFFFFF00000000";
277 EXPECT_THAT(
278 setRegTo(llvm::X86::ZMM0, APInt(512, ValueStr, 16)),
279 ElementsAreArray(
280 {IsStackAllocate(64),
281 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 0),
282 IsMovValueToStack(llvm::X86::MOV32mi, 0xFFFFFFFFUL, 4),
283 IsMovValueToStack(llvm::X86::MOV32mi, 0xEEEEEEEEUL, 8),
284 IsMovValueToStack(llvm::X86::MOV32mi, 0xDDDDDDDDUL, 12),
285 IsMovValueToStack(llvm::X86::MOV32mi, 0xCCCCCCCCUL, 16),
286 IsMovValueToStack(llvm::X86::MOV32mi, 0xBBBBBBBBUL, 20),
287 IsMovValueToStack(llvm::X86::MOV32mi, 0xAAAAAAAAUL, 24),
288 IsMovValueToStack(llvm::X86::MOV32mi, 0x99999999UL, 28),
289 IsMovValueToStack(llvm::X86::MOV32mi, 0x88888888UL, 32),
290 IsMovValueToStack(llvm::X86::MOV32mi, 0x77777777UL, 36),
291 IsMovValueToStack(llvm::X86::MOV32mi, 0x66666666UL, 40),
292 IsMovValueToStack(llvm::X86::MOV32mi, 0x55555555UL, 44),
293 IsMovValueToStack(llvm::X86::MOV32mi, 0x44444444UL, 48),
294 IsMovValueToStack(llvm::X86::MOV32mi, 0x33333333UL, 52),
295 IsMovValueToStack(llvm::X86::MOV32mi, 0x22222222UL, 56),
296 IsMovValueToStack(llvm::X86::MOV32mi, 0x11111111UL, 60),
297 IsMovValueFromStack(llvm::X86::VMOVDQU32Zrm, llvm::X86::ZMM0),
298 IsStackDeallocate(64)}));
299}
300
Clement Courbetc51f4522018-10-19 09:56:54 +0000301// Note: We always put 80 bits on the stack independently of the size of the
302// value. This uses a bit more space but makes the code simpler.
303
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000304TEST_F(Core2TargetTest, SetRegToST0_32Bits) {
305 EXPECT_THAT(
306 setRegTo(llvm::X86::ST0, APInt(32, 0x11112222ULL)),
Clement Courbetc51f4522018-10-19 09:56:54 +0000307 ElementsAre(IsStackAllocate(10),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000308 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 0),
Clement Courbetc51f4522018-10-19 09:56:54 +0000309 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 4),
310 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
311 OpcodeIs(llvm::X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000312}
313
314TEST_F(Core2TargetTest, SetRegToST1_32Bits) {
315 const MCInst CopySt0ToSt1 =
316 llvm::MCInstBuilder(llvm::X86::ST_Frr).addReg(llvm::X86::ST1);
317 EXPECT_THAT(
318 setRegTo(llvm::X86::ST1, APInt(32, 0x11112222ULL)),
Clement Courbetc51f4522018-10-19 09:56:54 +0000319 ElementsAre(IsStackAllocate(10),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000320 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 0),
Clement Courbetc51f4522018-10-19 09:56:54 +0000321 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 4),
322 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
323 OpcodeIs(llvm::X86::LD_F80m), CopySt0ToSt1,
324 IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000325}
326
327TEST_F(Core2TargetTest, SetRegToST0_64Bits) {
328 EXPECT_THAT(
329 setRegTo(llvm::X86::ST0, APInt(64, 0x1111222233334444ULL)),
Clement Courbetc51f4522018-10-19 09:56:54 +0000330 ElementsAre(IsStackAllocate(10),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000331 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 0),
332 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 4),
Clement Courbetc51f4522018-10-19 09:56:54 +0000333 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
334 OpcodeIs(llvm::X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000335}
336
337TEST_F(Core2TargetTest, SetRegToST0_80Bits) {
338 EXPECT_THAT(
339 setRegTo(llvm::X86::ST0, APInt(80, "11112222333344445555", 16)),
340 ElementsAre(IsStackAllocate(10),
341 IsMovValueToStack(llvm::X86::MOV32mi, 0x44445555UL, 0),
342 IsMovValueToStack(llvm::X86::MOV32mi, 0x22223333UL, 4),
343 IsMovValueToStack(llvm::X86::MOV16mi, 0x1111UL, 8),
344 OpcodeIs(llvm::X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000345}
346
Clement Courbetc51f4522018-10-19 09:56:54 +0000347TEST_F(Core2TargetTest, SetRegToFP0_80Bits) {
348 EXPECT_THAT(
349 setRegTo(llvm::X86::FP0, APInt(80, "11112222333344445555", 16)),
350 ElementsAre(IsStackAllocate(10),
351 IsMovValueToStack(llvm::X86::MOV32mi, 0x44445555UL, 0),
352 IsMovValueToStack(llvm::X86::MOV32mi, 0x22223333UL, 4),
353 IsMovValueToStack(llvm::X86::MOV16mi, 0x1111UL, 8),
354 OpcodeIs(llvm::X86::LD_Fp80m), IsStackDeallocate(10)));
355}
356
357TEST_F(Core2TargetTest, SetRegToFP1_32Bits) {
358 EXPECT_THAT(
359 setRegTo(llvm::X86::FP1, APInt(32, 0x11112222ULL)),
360 ElementsAre(IsStackAllocate(10),
361 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 0),
362 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 4),
363 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
Clement Courbetbbab5462018-11-19 14:31:43 +0000364 OpcodeIs(llvm::X86::LD_Fp80m), IsStackDeallocate(10)));
Clement Courbetc51f4522018-10-19 09:56:54 +0000365}
366
367TEST_F(Core2TargetTest, SetRegToFP1_4Bits) {
368 EXPECT_THAT(
369 setRegTo(llvm::X86::FP1, APInt(4, 0x1ULL)),
370 ElementsAre(IsStackAllocate(10),
371 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000001UL, 0),
372 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 4),
373 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
Clement Courbetbbab5462018-11-19 14:31:43 +0000374 OpcodeIs(llvm::X86::LD_Fp80m), IsStackDeallocate(10)));
375}
376
377TEST_F(Core2Avx512TargetTest, FillMemoryOperands_ADD64rm) {
378 Instruction I(State.getInstrInfo(), State.getRATC(), X86::ADD64rm);
379 InstructionTemplate IT(I);
380 constexpr const int kOffset = 42;
381 State.getExegesisTarget().fillMemoryOperands(IT, X86::RDI, kOffset);
382 // Memory is operands 2-6.
383 EXPECT_THAT(IT.getValueFor(I.Operands[2]), IsReg(X86::RDI));
384 EXPECT_THAT(IT.getValueFor(I.Operands[3]), IsImm(1));
385 EXPECT_THAT(IT.getValueFor(I.Operands[4]), IsReg(0));
386 EXPECT_THAT(IT.getValueFor(I.Operands[5]), IsImm(kOffset));
387 EXPECT_THAT(IT.getValueFor(I.Operands[6]), IsReg(0));
388}
389
390TEST_F(Core2Avx512TargetTest, FillMemoryOperands_VGATHERDPSZ128rm) {
391 Instruction I(State.getInstrInfo(), State.getRATC(), X86::VGATHERDPSZ128rm);
392 InstructionTemplate IT(I);
393 constexpr const int kOffset = 42;
394 State.getExegesisTarget().fillMemoryOperands(IT, X86::RDI, kOffset);
395 // Memory is operands 4-8.
396 EXPECT_THAT(IT.getValueFor(I.Operands[4]), IsReg(X86::RDI));
397 EXPECT_THAT(IT.getValueFor(I.Operands[5]), IsImm(1));
398 EXPECT_THAT(IT.getValueFor(I.Operands[6]), IsReg(0));
399 EXPECT_THAT(IT.getValueFor(I.Operands[7]), IsImm(kOffset));
400 EXPECT_THAT(IT.getValueFor(I.Operands[8]), IsReg(0));
Clement Courbetc51f4522018-10-19 09:56:54 +0000401}
402
Clement Courbet44b4c542018-06-19 11:28:59 +0000403} // namespace
404} // namespace exegesis
Fangrui Song32401af2018-10-22 17:10:47 +0000405} // namespace llvm