@@ -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;
0 commit comments