Skip to content

Commit 3721648

Browse files
committed
[BOLT] Fixed createLoadImmediate when Imm=0
1 parent df903ac commit 3721648

File tree

2 files changed

+47
-18
lines changed

2 files changed

+47
-18
lines changed

bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2174,24 +2174,34 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
21742174
InstructionListType createLoadImmediate(const MCPhysReg Dest,
21752175
uint64_t Imm) const override {
21762176
InstructionListType Insts;
2177-
for (int I = 0, Shift = 0; I < 4; I++, Shift += 16) {
2178-
uint16_t HalfWord = (Imm >> Shift) & 0xFFFF;
2179-
if (!HalfWord)
2180-
continue;
2177+
if (Imm == 0) {
21812178
MCInst Inst;
2182-
if (Insts.size() == 0) {
2183-
Inst.setOpcode(AArch64::MOVZXi);
2184-
Inst.addOperand(MCOperand::createReg(Dest));
2185-
Inst.addOperand(MCOperand::createImm(HalfWord));
2186-
Inst.addOperand(MCOperand::createImm(Shift));
2187-
Insts.push_back(Inst);
2188-
} else {
2189-
Inst.setOpcode(AArch64::MOVKXi);
2190-
Inst.addOperand(MCOperand::createReg(Dest));
2191-
Inst.addOperand(MCOperand::createReg(Dest));
2192-
Inst.addOperand(MCOperand::createImm(HalfWord));
2193-
Inst.addOperand(MCOperand::createImm(Shift));
2194-
Insts.push_back(Inst);
2179+
Inst.setOpcode(AArch64::ORRXrs);
2180+
Inst.addOperand(MCOperand::createReg(Dest));
2181+
Inst.addOperand(MCOperand::createReg(AArch64::XZR));
2182+
Inst.addOperand(MCOperand::createReg(AArch64::XZR));
2183+
Inst.addOperand(MCOperand::createImm(0));
2184+
Insts.push_back(Inst);
2185+
} else {
2186+
for (int I = 0, Shift = 0; I < 4; I++, Shift += 16) {
2187+
uint16_t HalfWord = (Imm >> Shift) & 0xFFFF;
2188+
if (!HalfWord)
2189+
continue;
2190+
MCInst Inst;
2191+
if (Insts.size() == 0) {
2192+
Inst.setOpcode(AArch64::MOVZXi);
2193+
Inst.addOperand(MCOperand::createReg(Dest));
2194+
Inst.addOperand(MCOperand::createImm(HalfWord));
2195+
Inst.addOperand(MCOperand::createImm(Shift));
2196+
Insts.push_back(Inst);
2197+
} else {
2198+
Inst.setOpcode(AArch64::MOVKXi);
2199+
Inst.addOperand(MCOperand::createReg(Dest));
2200+
Inst.addOperand(MCOperand::createReg(Dest));
2201+
Inst.addOperand(MCOperand::createImm(HalfWord));
2202+
Inst.addOperand(MCOperand::createImm(Shift));
2203+
Insts.push_back(Inst);
2204+
}
21952205
}
21962206
}
21972207
return Insts;

bolt/unittests/Core/MCPlusBuilder.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,26 @@ TEST_P(MCPlusBuilderTester, AArch64_CmpJNE) {
167167
ASSERT_EQ(Label, BB->getLabel());
168168
}
169169

170-
TEST_P(MCPlusBuilderTester, AArch64_LoadImm32) {
170+
TEST_P(MCPlusBuilderTester, AArch64_LoadZero) {
171+
if (GetParam() != Triple::aarch64)
172+
GTEST_SKIP();
173+
BinaryFunction *BF = BC->createInjectedBinaryFunction("BF", true);
174+
std::unique_ptr<BinaryBasicBlock> BB = BF->createBasicBlock();
175+
176+
InstructionListType Instrs = BC->MIB->createLoadImmediate(AArch64::X0, 0);
177+
BB->addInstructions(Instrs.begin(), Instrs.end());
178+
179+
ASSERT_EQ(BB->size(), 1);
180+
auto II = BB->begin();
181+
// mov x0, xzr <=> orr x0, xzr, xzr, lsl #0
182+
ASSERT_EQ(II->getOpcode(), AArch64::ORRXrs);
183+
ASSERT_EQ(II->getOperand(0).getReg(), AArch64::X0);
184+
ASSERT_EQ(II->getOperand(1).getReg(), AArch64::XZR);
185+
ASSERT_EQ(II->getOperand(2).getReg(), AArch64::XZR);
186+
ASSERT_EQ(II->getOperand(3).getImm(), 0);
187+
}
188+
189+
TEST_P(MCPlusBuilderTester, AArch64_LoadImm16) {
171190
if (GetParam() != Triple::aarch64)
172191
GTEST_SKIP();
173192
BinaryFunction *BF = BC->createInjectedBinaryFunction("BF", true);

0 commit comments

Comments
 (0)