blob: 15a1d8381fd34499027d970314a8cdf82f4c353e [file] [log] [blame]
Jinsong Ji56c74cf2018-11-20 14:41:59 +00001//===-- TargetTest.cpp -----------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Jinsong Ji56c74cf2018-11-20 14:41:59 +00006//
7//===----------------------------------------------------------------------===//
8
Clement Courbet44b4c542018-06-19 11:28:59 +00009#include "Target.h"
10
11#include <cassert>
12#include <memory>
13
Clement Courbeta51efc22018-06-25 13:12:02 +000014#include "MCTargetDesc/X86MCTargetDesc.h"
Clement Courbete7851692018-07-03 06:17:05 +000015#include "llvm/Support/TargetRegistry.h"
16#include "llvm/Support/TargetSelect.h"
Clement Courbet44b4c542018-06-19 11:28:59 +000017#include "gmock/gmock.h"
18#include "gtest/gtest.h"
19
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000020#include "llvm/MC/MCInstPrinter.h"
21
22namespace llvm {
23
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000024bool operator==(const MCOperand &a, const MCOperand &b) {
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000025 if (a.isImm() && b.isImm())
26 return a.getImm() == b.getImm();
27 if (a.isReg() && b.isReg())
28 return a.getReg() == b.getReg();
29 return false;
30}
31
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000032bool operator==(const MCInst &a, const MCInst &b) {
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000033 if (a.getOpcode() != b.getOpcode())
34 return false;
35 if (a.getNumOperands() != b.getNumOperands())
36 return false;
37 for (unsigned I = 0; I < a.getNumOperands(); ++I) {
38 if (!(a.getOperand(I) == b.getOperand(I)))
39 return false;
40 }
41 return true;
42}
43
44} // namespace llvm
45
Fangrui Song32401af2018-10-22 17:10:47 +000046namespace llvm {
Clement Courbet44b4c542018-06-19 11:28:59 +000047namespace exegesis {
48
49void InitializeX86ExegesisTarget();
50
51namespace {
52
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000053using testing::AllOf;
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000054using testing::ElementsAre;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000055using testing::ElementsAreArray;
56using testing::Eq;
Clement Courbeta51efc22018-06-25 13:12:02 +000057using testing::Gt;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000058using testing::Matcher;
Clement Courbet44b4c542018-06-19 11:28:59 +000059using testing::NotNull;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000060using testing::Property;
Clement Courbeta51efc22018-06-25 13:12:02 +000061using testing::SizeIs;
Clement Courbet44b4c542018-06-19 11:28:59 +000062
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000063using llvm::APInt;
64using llvm::MCInst;
65using llvm::MCInstBuilder;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000066using llvm::MCOperand;
Guillaume Chatelet5ad29092018-09-18 11:26:27 +000067
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000068Matcher<MCOperand> IsImm(int64_t Value) {
69 return AllOf(Property(&MCOperand::isImm, Eq(true)),
70 Property(&MCOperand::getImm, Eq(Value)));
71}
Clement Courbete7851692018-07-03 06:17:05 +000072
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000073Matcher<MCOperand> IsReg(unsigned Reg) {
74 return AllOf(Property(&MCOperand::isReg, Eq(true)),
75 Property(&MCOperand::getReg, Eq(Reg)));
76}
77
78Matcher<MCInst> OpcodeIs(unsigned Opcode) {
79 return Property(&MCInst::getOpcode, Eq(Opcode));
80}
81
82Matcher<MCInst> IsMovImmediate(unsigned Opcode, int64_t Reg, int64_t Value) {
83 return AllOf(OpcodeIs(Opcode), ElementsAre(IsReg(Reg), IsImm(Value)));
84}
85
86Matcher<MCInst> IsMovValueToStack(unsigned Opcode, int64_t Value,
87 size_t Offset) {
88 return AllOf(OpcodeIs(Opcode),
89 ElementsAre(IsReg(llvm::X86::RSP), IsImm(1), IsReg(0),
90 IsImm(Offset), IsReg(0), IsImm(Value)));
91}
92
93Matcher<MCInst> IsMovValueFromStack(unsigned Opcode, unsigned Reg) {
94 return AllOf(OpcodeIs(Opcode),
95 ElementsAre(IsReg(Reg), IsReg(llvm::X86::RSP), IsImm(1),
96 IsReg(0), IsImm(0), IsReg(0)));
97}
98
99Matcher<MCInst> IsStackAllocate(unsigned Size) {
100 return AllOf(
101 OpcodeIs(llvm::X86::SUB64ri8),
102 ElementsAre(IsReg(llvm::X86::RSP), IsReg(llvm::X86::RSP), IsImm(Size)));
103}
104
105Matcher<MCInst> IsStackDeallocate(unsigned Size) {
106 return AllOf(
107 OpcodeIs(llvm::X86::ADD64ri8),
108 ElementsAre(IsReg(llvm::X86::RSP), IsReg(llvm::X86::RSP), IsImm(Size)));
109}
110
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +0000111constexpr const char kTriple[] = "x86_64-unknown-linux";
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000112
Clement Courbet44b4c542018-06-19 11:28:59 +0000113class X86TargetTest : public ::testing::Test {
114protected:
Clement Courbetbbab5462018-11-19 14:31:43 +0000115 X86TargetTest(const char *Features) : State(kTriple, "core2", Features) {}
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000116
Clement Courbete7851692018-07-03 06:17:05 +0000117 static void SetUpTestCase() {
118 LLVMInitializeX86TargetInfo();
119 LLVMInitializeX86Target();
120 LLVMInitializeX86TargetMC();
121 InitializeX86ExegesisTarget();
122 }
Clement Courbeta51efc22018-06-25 13:12:02 +0000123
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000124 std::vector<MCInst> setRegTo(unsigned Reg, const APInt &Value) {
Clement Courbetbbab5462018-11-19 14:31:43 +0000125 return State.getExegesisTarget().setRegTo(State.getSubtargetInfo(), Reg,
126 Value);
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000127 }
128
Clement Courbetbbab5462018-11-19 14:31:43 +0000129 LLVMState State;
Clement Courbet44b4c542018-06-19 11:28:59 +0000130};
131
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +0000132class Core2TargetTest : public X86TargetTest {
133public:
134 Core2TargetTest() : X86TargetTest("") {}
135};
136
137class Core2AvxTargetTest : public X86TargetTest {
138public:
139 Core2AvxTargetTest() : X86TargetTest("+avx") {}
140};
141
142class Core2Avx512TargetTest : public X86TargetTest {
143public:
144 Core2Avx512TargetTest() : X86TargetTest("+avx512vl") {}
145};
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000146
147TEST_F(Core2TargetTest, SetFlags) {
148 const unsigned Reg = llvm::X86::EFLAGS;
149 EXPECT_THAT(
150 setRegTo(Reg, APInt(64, 0x1111222233334444ULL)),
151 ElementsAre(IsStackAllocate(8),
152 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 0),
153 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 4),
154 OpcodeIs(llvm::X86::POPF64)));
Clement Courbeta51efc22018-06-25 13:12:02 +0000155}
156
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000157TEST_F(Core2TargetTest, SetRegToGR8Value) {
158 const uint8_t Value = 0xFFU;
159 const unsigned Reg = llvm::X86::AL;
160 EXPECT_THAT(setRegTo(Reg, APInt(8, Value)),
161 ElementsAre(IsMovImmediate(llvm::X86::MOV8ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000162}
163
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000164TEST_F(Core2TargetTest, SetRegToGR16Value) {
165 const uint16_t Value = 0xFFFFU;
166 const unsigned Reg = llvm::X86::BX;
167 EXPECT_THAT(setRegTo(Reg, APInt(16, Value)),
168 ElementsAre(IsMovImmediate(llvm::X86::MOV16ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000169}
170
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000171TEST_F(Core2TargetTest, SetRegToGR32Value) {
172 const uint32_t Value = 0x7FFFFU;
173 const unsigned Reg = llvm::X86::ECX;
174 EXPECT_THAT(setRegTo(Reg, APInt(32, Value)),
175 ElementsAre(IsMovImmediate(llvm::X86::MOV32ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000176}
177
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000178TEST_F(Core2TargetTest, SetRegToGR64Value) {
179 const uint64_t Value = 0x7FFFFFFFFFFFFFFFULL;
180 const unsigned Reg = llvm::X86::RDX;
181 EXPECT_THAT(setRegTo(Reg, APInt(64, Value)),
182 ElementsAre(IsMovImmediate(llvm::X86::MOV64ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000183}
184
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000185TEST_F(Core2TargetTest, SetRegToVR64Value) {
186 EXPECT_THAT(
187 setRegTo(llvm::X86::MM0, APInt(64, 0x1111222233334444ULL)),
188 ElementsAre(IsStackAllocate(8),
189 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 0),
190 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 4),
191 IsMovValueFromStack(llvm::X86::MMX_MOVQ64rm, llvm::X86::MM0),
192 IsStackDeallocate(8)));
Clement Courbete7851692018-07-03 06:17:05 +0000193}
194
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000195TEST_F(Core2TargetTest, SetRegToVR128Value_Use_MOVDQUrm) {
196 EXPECT_THAT(
197 setRegTo(llvm::X86::XMM0,
198 APInt(128, "11112222333344445555666677778888", 16)),
199 ElementsAre(IsStackAllocate(16),
200 IsMovValueToStack(llvm::X86::MOV32mi, 0x77778888UL, 0),
201 IsMovValueToStack(llvm::X86::MOV32mi, 0x55556666UL, 4),
202 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 8),
203 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 12),
204 IsMovValueFromStack(llvm::X86::MOVDQUrm, llvm::X86::XMM0),
205 IsStackDeallocate(16)));
Clement Courbete7851692018-07-03 06:17:05 +0000206}
207
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000208TEST_F(Core2AvxTargetTest, SetRegToVR128Value_Use_VMOVDQUrm) {
209 EXPECT_THAT(
210 setRegTo(llvm::X86::XMM0,
211 APInt(128, "11112222333344445555666677778888", 16)),
212 ElementsAre(IsStackAllocate(16),
213 IsMovValueToStack(llvm::X86::MOV32mi, 0x77778888UL, 0),
214 IsMovValueToStack(llvm::X86::MOV32mi, 0x55556666UL, 4),
215 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 8),
216 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 12),
217 IsMovValueFromStack(llvm::X86::VMOVDQUrm, llvm::X86::XMM0),
218 IsStackDeallocate(16)));
Clement Courbet44b4c542018-06-19 11:28:59 +0000219}
220
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000221TEST_F(Core2Avx512TargetTest, SetRegToVR128Value_Use_VMOVDQU32Z128rm) {
222 EXPECT_THAT(
223 setRegTo(llvm::X86::XMM0,
224 APInt(128, "11112222333344445555666677778888", 16)),
225 ElementsAre(
226 IsStackAllocate(16),
227 IsMovValueToStack(llvm::X86::MOV32mi, 0x77778888UL, 0),
228 IsMovValueToStack(llvm::X86::MOV32mi, 0x55556666UL, 4),
229 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 8),
230 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 12),
231 IsMovValueFromStack(llvm::X86::VMOVDQU32Z128rm, llvm::X86::XMM0),
232 IsStackDeallocate(16)));
233}
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000234
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000235TEST_F(Core2AvxTargetTest, SetRegToVR256Value_Use_VMOVDQUYrm) {
236 const char ValueStr[] =
237 "1111111122222222333333334444444455555555666666667777777788888888";
238 EXPECT_THAT(setRegTo(llvm::X86::YMM0, APInt(256, ValueStr, 16)),
239 ElementsAreArray(
240 {IsStackAllocate(32),
241 IsMovValueToStack(llvm::X86::MOV32mi, 0x88888888UL, 0),
242 IsMovValueToStack(llvm::X86::MOV32mi, 0x77777777UL, 4),
243 IsMovValueToStack(llvm::X86::MOV32mi, 0x66666666UL, 8),
244 IsMovValueToStack(llvm::X86::MOV32mi, 0x55555555UL, 12),
245 IsMovValueToStack(llvm::X86::MOV32mi, 0x44444444UL, 16),
246 IsMovValueToStack(llvm::X86::MOV32mi, 0x33333333UL, 20),
247 IsMovValueToStack(llvm::X86::MOV32mi, 0x22222222UL, 24),
248 IsMovValueToStack(llvm::X86::MOV32mi, 0x11111111UL, 28),
249 IsMovValueFromStack(llvm::X86::VMOVDQUYrm, llvm::X86::YMM0),
250 IsStackDeallocate(32)}));
251}
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000252
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000253TEST_F(Core2Avx512TargetTest, SetRegToVR256Value_Use_VMOVDQU32Z256rm) {
254 const char ValueStr[] =
255 "1111111122222222333333334444444455555555666666667777777788888888";
256 EXPECT_THAT(
257 setRegTo(llvm::X86::YMM0, APInt(256, ValueStr, 16)),
258 ElementsAreArray(
259 {IsStackAllocate(32),
260 IsMovValueToStack(llvm::X86::MOV32mi, 0x88888888UL, 0),
261 IsMovValueToStack(llvm::X86::MOV32mi, 0x77777777UL, 4),
262 IsMovValueToStack(llvm::X86::MOV32mi, 0x66666666UL, 8),
263 IsMovValueToStack(llvm::X86::MOV32mi, 0x55555555UL, 12),
264 IsMovValueToStack(llvm::X86::MOV32mi, 0x44444444UL, 16),
265 IsMovValueToStack(llvm::X86::MOV32mi, 0x33333333UL, 20),
266 IsMovValueToStack(llvm::X86::MOV32mi, 0x22222222UL, 24),
267 IsMovValueToStack(llvm::X86::MOV32mi, 0x11111111UL, 28),
268 IsMovValueFromStack(llvm::X86::VMOVDQU32Z256rm, llvm::X86::YMM0),
269 IsStackDeallocate(32)}));
270}
271
272TEST_F(Core2Avx512TargetTest, SetRegToVR512Value) {
273 const char ValueStr[] =
274 "1111111122222222333333334444444455555555666666667777777788888888"
275 "99999999AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDDEEEEEEEEFFFFFFFF00000000";
276 EXPECT_THAT(
277 setRegTo(llvm::X86::ZMM0, APInt(512, ValueStr, 16)),
278 ElementsAreArray(
279 {IsStackAllocate(64),
280 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 0),
281 IsMovValueToStack(llvm::X86::MOV32mi, 0xFFFFFFFFUL, 4),
282 IsMovValueToStack(llvm::X86::MOV32mi, 0xEEEEEEEEUL, 8),
283 IsMovValueToStack(llvm::X86::MOV32mi, 0xDDDDDDDDUL, 12),
284 IsMovValueToStack(llvm::X86::MOV32mi, 0xCCCCCCCCUL, 16),
285 IsMovValueToStack(llvm::X86::MOV32mi, 0xBBBBBBBBUL, 20),
286 IsMovValueToStack(llvm::X86::MOV32mi, 0xAAAAAAAAUL, 24),
287 IsMovValueToStack(llvm::X86::MOV32mi, 0x99999999UL, 28),
288 IsMovValueToStack(llvm::X86::MOV32mi, 0x88888888UL, 32),
289 IsMovValueToStack(llvm::X86::MOV32mi, 0x77777777UL, 36),
290 IsMovValueToStack(llvm::X86::MOV32mi, 0x66666666UL, 40),
291 IsMovValueToStack(llvm::X86::MOV32mi, 0x55555555UL, 44),
292 IsMovValueToStack(llvm::X86::MOV32mi, 0x44444444UL, 48),
293 IsMovValueToStack(llvm::X86::MOV32mi, 0x33333333UL, 52),
294 IsMovValueToStack(llvm::X86::MOV32mi, 0x22222222UL, 56),
295 IsMovValueToStack(llvm::X86::MOV32mi, 0x11111111UL, 60),
296 IsMovValueFromStack(llvm::X86::VMOVDQU32Zrm, llvm::X86::ZMM0),
297 IsStackDeallocate(64)}));
298}
299
Clement Courbetc51f4522018-10-19 09:56:54 +0000300// Note: We always put 80 bits on the stack independently of the size of the
301// value. This uses a bit more space but makes the code simpler.
302
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000303TEST_F(Core2TargetTest, SetRegToST0_32Bits) {
304 EXPECT_THAT(
305 setRegTo(llvm::X86::ST0, APInt(32, 0x11112222ULL)),
Clement Courbetc51f4522018-10-19 09:56:54 +0000306 ElementsAre(IsStackAllocate(10),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000307 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 0),
Clement Courbetc51f4522018-10-19 09:56:54 +0000308 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 4),
309 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
310 OpcodeIs(llvm::X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000311}
312
313TEST_F(Core2TargetTest, SetRegToST1_32Bits) {
314 const MCInst CopySt0ToSt1 =
315 llvm::MCInstBuilder(llvm::X86::ST_Frr).addReg(llvm::X86::ST1);
316 EXPECT_THAT(
317 setRegTo(llvm::X86::ST1, APInt(32, 0x11112222ULL)),
Clement Courbetc51f4522018-10-19 09:56:54 +0000318 ElementsAre(IsStackAllocate(10),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000319 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 0),
Clement Courbetc51f4522018-10-19 09:56:54 +0000320 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 4),
321 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
322 OpcodeIs(llvm::X86::LD_F80m), CopySt0ToSt1,
323 IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000324}
325
326TEST_F(Core2TargetTest, SetRegToST0_64Bits) {
327 EXPECT_THAT(
328 setRegTo(llvm::X86::ST0, APInt(64, 0x1111222233334444ULL)),
Clement Courbetc51f4522018-10-19 09:56:54 +0000329 ElementsAre(IsStackAllocate(10),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000330 IsMovValueToStack(llvm::X86::MOV32mi, 0x33334444UL, 0),
331 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 4),
Clement Courbetc51f4522018-10-19 09:56:54 +0000332 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
333 OpcodeIs(llvm::X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000334}
335
336TEST_F(Core2TargetTest, SetRegToST0_80Bits) {
337 EXPECT_THAT(
338 setRegTo(llvm::X86::ST0, APInt(80, "11112222333344445555", 16)),
339 ElementsAre(IsStackAllocate(10),
340 IsMovValueToStack(llvm::X86::MOV32mi, 0x44445555UL, 0),
341 IsMovValueToStack(llvm::X86::MOV32mi, 0x22223333UL, 4),
342 IsMovValueToStack(llvm::X86::MOV16mi, 0x1111UL, 8),
343 OpcodeIs(llvm::X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000344}
345
Clement Courbetc51f4522018-10-19 09:56:54 +0000346TEST_F(Core2TargetTest, SetRegToFP0_80Bits) {
347 EXPECT_THAT(
348 setRegTo(llvm::X86::FP0, APInt(80, "11112222333344445555", 16)),
349 ElementsAre(IsStackAllocate(10),
350 IsMovValueToStack(llvm::X86::MOV32mi, 0x44445555UL, 0),
351 IsMovValueToStack(llvm::X86::MOV32mi, 0x22223333UL, 4),
352 IsMovValueToStack(llvm::X86::MOV16mi, 0x1111UL, 8),
353 OpcodeIs(llvm::X86::LD_Fp80m), IsStackDeallocate(10)));
354}
355
356TEST_F(Core2TargetTest, SetRegToFP1_32Bits) {
357 EXPECT_THAT(
358 setRegTo(llvm::X86::FP1, APInt(32, 0x11112222ULL)),
359 ElementsAre(IsStackAllocate(10),
360 IsMovValueToStack(llvm::X86::MOV32mi, 0x11112222UL, 0),
361 IsMovValueToStack(llvm::X86::MOV32mi, 0x00000000UL, 4),
362 IsMovValueToStack(llvm::X86::MOV16mi, 0x0000UL, 8),
Clement Courbetbbab5462018-11-19 14:31:43 +0000363 OpcodeIs(llvm::X86::LD_Fp80m), IsStackDeallocate(10)));
Clement Courbetc51f4522018-10-19 09:56:54 +0000364}
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),
Clement Courbetbbab5462018-11-19 14:31:43 +0000373 OpcodeIs(llvm::X86::LD_Fp80m), IsStackDeallocate(10)));
374}
375
376TEST_F(Core2Avx512TargetTest, FillMemoryOperands_ADD64rm) {
377 Instruction I(State.getInstrInfo(), State.getRATC(), X86::ADD64rm);
378 InstructionTemplate IT(I);
379 constexpr const int kOffset = 42;
380 State.getExegesisTarget().fillMemoryOperands(IT, X86::RDI, kOffset);
381 // Memory is operands 2-6.
382 EXPECT_THAT(IT.getValueFor(I.Operands[2]), IsReg(X86::RDI));
383 EXPECT_THAT(IT.getValueFor(I.Operands[3]), IsImm(1));
384 EXPECT_THAT(IT.getValueFor(I.Operands[4]), IsReg(0));
385 EXPECT_THAT(IT.getValueFor(I.Operands[5]), IsImm(kOffset));
386 EXPECT_THAT(IT.getValueFor(I.Operands[6]), IsReg(0));
387}
388
389TEST_F(Core2Avx512TargetTest, FillMemoryOperands_VGATHERDPSZ128rm) {
390 Instruction I(State.getInstrInfo(), State.getRATC(), X86::VGATHERDPSZ128rm);
391 InstructionTemplate IT(I);
392 constexpr const int kOffset = 42;
393 State.getExegesisTarget().fillMemoryOperands(IT, X86::RDI, kOffset);
394 // Memory is operands 4-8.
395 EXPECT_THAT(IT.getValueFor(I.Operands[4]), IsReg(X86::RDI));
396 EXPECT_THAT(IT.getValueFor(I.Operands[5]), IsImm(1));
397 EXPECT_THAT(IT.getValueFor(I.Operands[6]), IsReg(0));
398 EXPECT_THAT(IT.getValueFor(I.Operands[7]), IsImm(kOffset));
399 EXPECT_THAT(IT.getValueFor(I.Operands[8]), IsReg(0));
Clement Courbetc51f4522018-10-19 09:56:54 +0000400}
401
Clement Courbet44b4c542018-06-19 11:28:59 +0000402} // namespace
403} // namespace exegesis
Fangrui Song32401af2018-10-22 17:10:47 +0000404} // namespace llvm