blob: eefed6dd5441b21f97435341ac7bd3bf48389d67 [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 Chateletc96a97b2018-09-20 12:22:18 +000063Matcher<MCOperand> IsImm(int64_t Value) {
64 return AllOf(Property(&MCOperand::isImm, Eq(true)),
65 Property(&MCOperand::getImm, Eq(Value)));
66}
Clement Courbete7851692018-07-03 06:17:05 +000067
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000068Matcher<MCOperand> IsReg(unsigned Reg) {
69 return AllOf(Property(&MCOperand::isReg, Eq(true)),
70 Property(&MCOperand::getReg, Eq(Reg)));
71}
72
73Matcher<MCInst> OpcodeIs(unsigned Opcode) {
74 return Property(&MCInst::getOpcode, Eq(Opcode));
75}
76
77Matcher<MCInst> IsMovImmediate(unsigned Opcode, int64_t Reg, int64_t Value) {
78 return AllOf(OpcodeIs(Opcode), ElementsAre(IsReg(Reg), IsImm(Value)));
79}
80
81Matcher<MCInst> IsMovValueToStack(unsigned Opcode, int64_t Value,
82 size_t Offset) {
83 return AllOf(OpcodeIs(Opcode),
Clement Courbetd422d3a2019-10-09 11:29:21 +000084 ElementsAre(IsReg(X86::RSP), IsImm(1), IsReg(0), IsImm(Offset),
85 IsReg(0), IsImm(Value)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000086}
87
88Matcher<MCInst> IsMovValueFromStack(unsigned Opcode, unsigned Reg) {
89 return AllOf(OpcodeIs(Opcode),
Clement Courbetd422d3a2019-10-09 11:29:21 +000090 ElementsAre(IsReg(Reg), IsReg(X86::RSP), IsImm(1), IsReg(0),
91 IsImm(0), IsReg(0)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000092}
93
94Matcher<MCInst> IsStackAllocate(unsigned Size) {
Clement Courbetd422d3a2019-10-09 11:29:21 +000095 return AllOf(OpcodeIs(X86::SUB64ri8),
96 ElementsAre(IsReg(X86::RSP), IsReg(X86::RSP), IsImm(Size)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +000097}
98
99Matcher<MCInst> IsStackDeallocate(unsigned Size) {
Clement Courbetd422d3a2019-10-09 11:29:21 +0000100 return AllOf(OpcodeIs(X86::ADD64ri8),
101 ElementsAre(IsReg(X86::RSP), IsReg(X86::RSP), IsImm(Size)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000102}
103
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +0000104constexpr const char kTriple[] = "x86_64-unknown-linux";
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000105
Clement Courbet44b4c542018-06-19 11:28:59 +0000106class X86TargetTest : public ::testing::Test {
107protected:
Clement Courbetbbab5462018-11-19 14:31:43 +0000108 X86TargetTest(const char *Features) : State(kTriple, "core2", Features) {}
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000109
Clement Courbete7851692018-07-03 06:17:05 +0000110 static void SetUpTestCase() {
111 LLVMInitializeX86TargetInfo();
112 LLVMInitializeX86Target();
113 LLVMInitializeX86TargetMC();
114 InitializeX86ExegesisTarget();
115 }
Clement Courbeta51efc22018-06-25 13:12:02 +0000116
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000117 std::vector<MCInst> setRegTo(unsigned Reg, const APInt &Value) {
Clement Courbetbbab5462018-11-19 14:31:43 +0000118 return State.getExegesisTarget().setRegTo(State.getSubtargetInfo(), Reg,
119 Value);
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000120 }
121
Guillaume Chatelet32d384c2019-12-18 12:08:38 +0100122 const Instruction &getInstr(unsigned OpCode) {
123 return State.getIC().getInstr(OpCode);
124 }
125
Clement Courbetbbab5462018-11-19 14:31:43 +0000126 LLVMState State;
Clement Courbet44b4c542018-06-19 11:28:59 +0000127};
128
Guillaume Chatelet12ca74e2018-09-20 13:37:04 +0000129class Core2TargetTest : public X86TargetTest {
130public:
131 Core2TargetTest() : X86TargetTest("") {}
132};
133
134class Core2AvxTargetTest : public X86TargetTest {
135public:
136 Core2AvxTargetTest() : X86TargetTest("+avx") {}
137};
138
139class Core2Avx512TargetTest : public X86TargetTest {
140public:
141 Core2Avx512TargetTest() : X86TargetTest("+avx512vl") {}
142};
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000143
Clement Courbet52da9382019-03-26 15:44:57 +0000144TEST_F(Core2TargetTest, NoHighByteRegs) {
145 EXPECT_TRUE(State.getRATC().reservedRegisters().test(X86::AH));
146}
147
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000148TEST_F(Core2TargetTest, SetFlags) {
Clement Courbetd422d3a2019-10-09 11:29:21 +0000149 const unsigned Reg = X86::EFLAGS;
150 EXPECT_THAT(setRegTo(Reg, APInt(64, 0x1111222233334444ULL)),
151 ElementsAre(IsStackAllocate(8),
152 IsMovValueToStack(X86::MOV32mi, 0x33334444UL, 0),
153 IsMovValueToStack(X86::MOV32mi, 0x11112222UL, 4),
154 OpcodeIs(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;
Clement Courbetd422d3a2019-10-09 11:29:21 +0000159 const unsigned Reg = X86::AL;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000160 EXPECT_THAT(setRegTo(Reg, APInt(8, Value)),
Clement Courbetd422d3a2019-10-09 11:29:21 +0000161 ElementsAre(IsMovImmediate(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;
Clement Courbetd422d3a2019-10-09 11:29:21 +0000166 const unsigned Reg = X86::BX;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000167 EXPECT_THAT(setRegTo(Reg, APInt(16, Value)),
Clement Courbetd422d3a2019-10-09 11:29:21 +0000168 ElementsAre(IsMovImmediate(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;
Clement Courbetd422d3a2019-10-09 11:29:21 +0000173 const unsigned Reg = X86::ECX;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000174 EXPECT_THAT(setRegTo(Reg, APInt(32, Value)),
Clement Courbetd422d3a2019-10-09 11:29:21 +0000175 ElementsAre(IsMovImmediate(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;
Clement Courbetd422d3a2019-10-09 11:29:21 +0000180 const unsigned Reg = X86::RDX;
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000181 EXPECT_THAT(setRegTo(Reg, APInt(64, Value)),
Clement Courbetd422d3a2019-10-09 11:29:21 +0000182 ElementsAre(IsMovImmediate(X86::MOV64ri, Reg, Value)));
Clement Courbete7851692018-07-03 06:17:05 +0000183}
184
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000185TEST_F(Core2TargetTest, SetRegToVR64Value) {
Clement Courbetd422d3a2019-10-09 11:29:21 +0000186 EXPECT_THAT(setRegTo(X86::MM0, APInt(64, 0x1111222233334444ULL)),
187 ElementsAre(IsStackAllocate(8),
188 IsMovValueToStack(X86::MOV32mi, 0x33334444UL, 0),
189 IsMovValueToStack(X86::MOV32mi, 0x11112222UL, 4),
190 IsMovValueFromStack(X86::MMX_MOVQ64rm, 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(
Clement Courbetd422d3a2019-10-09 11:29:21 +0000196 setRegTo(X86::XMM0, APInt(128, "11112222333344445555666677778888", 16)),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000197 ElementsAre(IsStackAllocate(16),
Clement Courbetd422d3a2019-10-09 11:29:21 +0000198 IsMovValueToStack(X86::MOV32mi, 0x77778888UL, 0),
199 IsMovValueToStack(X86::MOV32mi, 0x55556666UL, 4),
200 IsMovValueToStack(X86::MOV32mi, 0x33334444UL, 8),
201 IsMovValueToStack(X86::MOV32mi, 0x11112222UL, 12),
202 IsMovValueFromStack(X86::MOVDQUrm, X86::XMM0),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000203 IsStackDeallocate(16)));
Clement Courbete7851692018-07-03 06:17:05 +0000204}
205
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000206TEST_F(Core2AvxTargetTest, SetRegToVR128Value_Use_VMOVDQUrm) {
207 EXPECT_THAT(
Clement Courbetd422d3a2019-10-09 11:29:21 +0000208 setRegTo(X86::XMM0, APInt(128, "11112222333344445555666677778888", 16)),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000209 ElementsAre(IsStackAllocate(16),
Clement Courbetd422d3a2019-10-09 11:29:21 +0000210 IsMovValueToStack(X86::MOV32mi, 0x77778888UL, 0),
211 IsMovValueToStack(X86::MOV32mi, 0x55556666UL, 4),
212 IsMovValueToStack(X86::MOV32mi, 0x33334444UL, 8),
213 IsMovValueToStack(X86::MOV32mi, 0x11112222UL, 12),
214 IsMovValueFromStack(X86::VMOVDQUrm, X86::XMM0),
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000215 IsStackDeallocate(16)));
Clement Courbet44b4c542018-06-19 11:28:59 +0000216}
217
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000218TEST_F(Core2Avx512TargetTest, SetRegToVR128Value_Use_VMOVDQU32Z128rm) {
219 EXPECT_THAT(
Clement Courbetd422d3a2019-10-09 11:29:21 +0000220 setRegTo(X86::XMM0, APInt(128, "11112222333344445555666677778888", 16)),
221 ElementsAre(IsStackAllocate(16),
222 IsMovValueToStack(X86::MOV32mi, 0x77778888UL, 0),
223 IsMovValueToStack(X86::MOV32mi, 0x55556666UL, 4),
224 IsMovValueToStack(X86::MOV32mi, 0x33334444UL, 8),
225 IsMovValueToStack(X86::MOV32mi, 0x11112222UL, 12),
226 IsMovValueFromStack(X86::VMOVDQU32Z128rm, X86::XMM0),
227 IsStackDeallocate(16)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000228}
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000229
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000230TEST_F(Core2AvxTargetTest, SetRegToVR256Value_Use_VMOVDQUYrm) {
231 const char ValueStr[] =
232 "1111111122222222333333334444444455555555666666667777777788888888";
Clement Courbetd422d3a2019-10-09 11:29:21 +0000233 EXPECT_THAT(
234 setRegTo(X86::YMM0, APInt(256, ValueStr, 16)),
235 ElementsAreArray({IsStackAllocate(32),
236 IsMovValueToStack(X86::MOV32mi, 0x88888888UL, 0),
237 IsMovValueToStack(X86::MOV32mi, 0x77777777UL, 4),
238 IsMovValueToStack(X86::MOV32mi, 0x66666666UL, 8),
239 IsMovValueToStack(X86::MOV32mi, 0x55555555UL, 12),
240 IsMovValueToStack(X86::MOV32mi, 0x44444444UL, 16),
241 IsMovValueToStack(X86::MOV32mi, 0x33333333UL, 20),
242 IsMovValueToStack(X86::MOV32mi, 0x22222222UL, 24),
243 IsMovValueToStack(X86::MOV32mi, 0x11111111UL, 28),
244 IsMovValueFromStack(X86::VMOVDQUYrm, X86::YMM0),
245 IsStackDeallocate(32)}));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000246}
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000247
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000248TEST_F(Core2Avx512TargetTest, SetRegToVR256Value_Use_VMOVDQU32Z256rm) {
249 const char ValueStr[] =
250 "1111111122222222333333334444444455555555666666667777777788888888";
251 EXPECT_THAT(
Clement Courbetd422d3a2019-10-09 11:29:21 +0000252 setRegTo(X86::YMM0, APInt(256, ValueStr, 16)),
253 ElementsAreArray({IsStackAllocate(32),
254 IsMovValueToStack(X86::MOV32mi, 0x88888888UL, 0),
255 IsMovValueToStack(X86::MOV32mi, 0x77777777UL, 4),
256 IsMovValueToStack(X86::MOV32mi, 0x66666666UL, 8),
257 IsMovValueToStack(X86::MOV32mi, 0x55555555UL, 12),
258 IsMovValueToStack(X86::MOV32mi, 0x44444444UL, 16),
259 IsMovValueToStack(X86::MOV32mi, 0x33333333UL, 20),
260 IsMovValueToStack(X86::MOV32mi, 0x22222222UL, 24),
261 IsMovValueToStack(X86::MOV32mi, 0x11111111UL, 28),
262 IsMovValueFromStack(X86::VMOVDQU32Z256rm, X86::YMM0),
263 IsStackDeallocate(32)}));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000264}
265
266TEST_F(Core2Avx512TargetTest, SetRegToVR512Value) {
267 const char ValueStr[] =
268 "1111111122222222333333334444444455555555666666667777777788888888"
269 "99999999AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDDEEEEEEEEFFFFFFFF00000000";
270 EXPECT_THAT(
Clement Courbetd422d3a2019-10-09 11:29:21 +0000271 setRegTo(X86::ZMM0, APInt(512, ValueStr, 16)),
272 ElementsAreArray({IsStackAllocate(64),
273 IsMovValueToStack(X86::MOV32mi, 0x00000000UL, 0),
274 IsMovValueToStack(X86::MOV32mi, 0xFFFFFFFFUL, 4),
275 IsMovValueToStack(X86::MOV32mi, 0xEEEEEEEEUL, 8),
276 IsMovValueToStack(X86::MOV32mi, 0xDDDDDDDDUL, 12),
277 IsMovValueToStack(X86::MOV32mi, 0xCCCCCCCCUL, 16),
278 IsMovValueToStack(X86::MOV32mi, 0xBBBBBBBBUL, 20),
279 IsMovValueToStack(X86::MOV32mi, 0xAAAAAAAAUL, 24),
280 IsMovValueToStack(X86::MOV32mi, 0x99999999UL, 28),
281 IsMovValueToStack(X86::MOV32mi, 0x88888888UL, 32),
282 IsMovValueToStack(X86::MOV32mi, 0x77777777UL, 36),
283 IsMovValueToStack(X86::MOV32mi, 0x66666666UL, 40),
284 IsMovValueToStack(X86::MOV32mi, 0x55555555UL, 44),
285 IsMovValueToStack(X86::MOV32mi, 0x44444444UL, 48),
286 IsMovValueToStack(X86::MOV32mi, 0x33333333UL, 52),
287 IsMovValueToStack(X86::MOV32mi, 0x22222222UL, 56),
288 IsMovValueToStack(X86::MOV32mi, 0x11111111UL, 60),
289 IsMovValueFromStack(X86::VMOVDQU32Zrm, X86::ZMM0),
290 IsStackDeallocate(64)}));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000291}
292
Clement Courbetc51f4522018-10-19 09:56:54 +0000293// Note: We always put 80 bits on the stack independently of the size of the
294// value. This uses a bit more space but makes the code simpler.
295
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000296TEST_F(Core2TargetTest, SetRegToST0_32Bits) {
Clement Courbetd422d3a2019-10-09 11:29:21 +0000297 EXPECT_THAT(setRegTo(X86::ST0, APInt(32, 0x11112222ULL)),
298 ElementsAre(IsStackAllocate(10),
299 IsMovValueToStack(X86::MOV32mi, 0x11112222UL, 0),
300 IsMovValueToStack(X86::MOV32mi, 0x00000000UL, 4),
301 IsMovValueToStack(X86::MOV16mi, 0x0000UL, 8),
302 OpcodeIs(X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000303}
304
305TEST_F(Core2TargetTest, SetRegToST1_32Bits) {
Clement Courbetd422d3a2019-10-09 11:29:21 +0000306 const MCInst CopySt0ToSt1 = MCInstBuilder(X86::ST_Frr).addReg(X86::ST1);
307 EXPECT_THAT(setRegTo(X86::ST1, APInt(32, 0x11112222ULL)),
308 ElementsAre(IsStackAllocate(10),
309 IsMovValueToStack(X86::MOV32mi, 0x11112222UL, 0),
310 IsMovValueToStack(X86::MOV32mi, 0x00000000UL, 4),
311 IsMovValueToStack(X86::MOV16mi, 0x0000UL, 8),
312 OpcodeIs(X86::LD_F80m), CopySt0ToSt1,
313 IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000314}
315
316TEST_F(Core2TargetTest, SetRegToST0_64Bits) {
Clement Courbetd422d3a2019-10-09 11:29:21 +0000317 EXPECT_THAT(setRegTo(X86::ST0, APInt(64, 0x1111222233334444ULL)),
318 ElementsAre(IsStackAllocate(10),
319 IsMovValueToStack(X86::MOV32mi, 0x33334444UL, 0),
320 IsMovValueToStack(X86::MOV32mi, 0x11112222UL, 4),
321 IsMovValueToStack(X86::MOV16mi, 0x0000UL, 8),
322 OpcodeIs(X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chateletc96a97b2018-09-20 12:22:18 +0000323}
324
325TEST_F(Core2TargetTest, SetRegToST0_80Bits) {
Clement Courbetd422d3a2019-10-09 11:29:21 +0000326 EXPECT_THAT(setRegTo(X86::ST0, APInt(80, "11112222333344445555", 16)),
327 ElementsAre(IsStackAllocate(10),
328 IsMovValueToStack(X86::MOV32mi, 0x44445555UL, 0),
329 IsMovValueToStack(X86::MOV32mi, 0x22223333UL, 4),
330 IsMovValueToStack(X86::MOV16mi, 0x1111UL, 8),
331 OpcodeIs(X86::LD_F80m), IsStackDeallocate(10)));
Guillaume Chatelet5ad29092018-09-18 11:26:27 +0000332}
333
Clement Courbetc51f4522018-10-19 09:56:54 +0000334TEST_F(Core2TargetTest, SetRegToFP0_80Bits) {
Clement Courbetd422d3a2019-10-09 11:29:21 +0000335 EXPECT_THAT(setRegTo(X86::FP0, APInt(80, "11112222333344445555", 16)),
336 ElementsAre(IsStackAllocate(10),
337 IsMovValueToStack(X86::MOV32mi, 0x44445555UL, 0),
338 IsMovValueToStack(X86::MOV32mi, 0x22223333UL, 4),
339 IsMovValueToStack(X86::MOV16mi, 0x1111UL, 8),
340 OpcodeIs(X86::LD_Fp80m), IsStackDeallocate(10)));
Clement Courbetc51f4522018-10-19 09:56:54 +0000341}
342
343TEST_F(Core2TargetTest, SetRegToFP1_32Bits) {
Clement Courbetd422d3a2019-10-09 11:29:21 +0000344 EXPECT_THAT(setRegTo(X86::FP1, APInt(32, 0x11112222ULL)),
345 ElementsAre(IsStackAllocate(10),
346 IsMovValueToStack(X86::MOV32mi, 0x11112222UL, 0),
347 IsMovValueToStack(X86::MOV32mi, 0x00000000UL, 4),
348 IsMovValueToStack(X86::MOV16mi, 0x0000UL, 8),
349 OpcodeIs(X86::LD_Fp80m), IsStackDeallocate(10)));
Clement Courbetc51f4522018-10-19 09:56:54 +0000350}
351
352TEST_F(Core2TargetTest, SetRegToFP1_4Bits) {
Clement Courbetd422d3a2019-10-09 11:29:21 +0000353 EXPECT_THAT(setRegTo(X86::FP1, APInt(4, 0x1ULL)),
354 ElementsAre(IsStackAllocate(10),
355 IsMovValueToStack(X86::MOV32mi, 0x00000001UL, 0),
356 IsMovValueToStack(X86::MOV32mi, 0x00000000UL, 4),
357 IsMovValueToStack(X86::MOV16mi, 0x0000UL, 8),
358 OpcodeIs(X86::LD_Fp80m), IsStackDeallocate(10)));
Clement Courbetbbab5462018-11-19 14:31:43 +0000359}
360
361TEST_F(Core2Avx512TargetTest, FillMemoryOperands_ADD64rm) {
Guillaume Chatelet32d384c2019-12-18 12:08:38 +0100362 const Instruction &I = getInstr(X86::ADD64rm);
363 InstructionTemplate IT(&I);
Clement Courbetbbab5462018-11-19 14:31:43 +0000364 constexpr const int kOffset = 42;
365 State.getExegesisTarget().fillMemoryOperands(IT, X86::RDI, kOffset);
366 // Memory is operands 2-6.
367 EXPECT_THAT(IT.getValueFor(I.Operands[2]), IsReg(X86::RDI));
368 EXPECT_THAT(IT.getValueFor(I.Operands[3]), IsImm(1));
369 EXPECT_THAT(IT.getValueFor(I.Operands[4]), IsReg(0));
370 EXPECT_THAT(IT.getValueFor(I.Operands[5]), IsImm(kOffset));
371 EXPECT_THAT(IT.getValueFor(I.Operands[6]), IsReg(0));
372}
373
374TEST_F(Core2Avx512TargetTest, FillMemoryOperands_VGATHERDPSZ128rm) {
Guillaume Chatelet32d384c2019-12-18 12:08:38 +0100375 const Instruction &I = getInstr(X86::VGATHERDPSZ128rm);
376 InstructionTemplate IT(&I);
Clement Courbetbbab5462018-11-19 14:31:43 +0000377 constexpr const int kOffset = 42;
378 State.getExegesisTarget().fillMemoryOperands(IT, X86::RDI, kOffset);
379 // Memory is operands 4-8.
380 EXPECT_THAT(IT.getValueFor(I.Operands[4]), IsReg(X86::RDI));
381 EXPECT_THAT(IT.getValueFor(I.Operands[5]), IsImm(1));
382 EXPECT_THAT(IT.getValueFor(I.Operands[6]), IsReg(0));
383 EXPECT_THAT(IT.getValueFor(I.Operands[7]), IsImm(kOffset));
384 EXPECT_THAT(IT.getValueFor(I.Operands[8]), IsReg(0));
Clement Courbetc51f4522018-10-19 09:56:54 +0000385}
386
Clement Courbet44b4c542018-06-19 11:28:59 +0000387} // namespace
388} // namespace exegesis
Fangrui Song32401af2018-10-22 17:10:47 +0000389} // namespace llvm