33#define DEBUG_TYPE "mccodeemitter"
35STATISTIC(MCNumEmitted,
"Number of MC instructions emitted");
36STATISTIC(MCNumFixups,
"Number of MC fixups created");
40 RISCVMCCodeEmitter(
const RISCVMCCodeEmitter &) =
delete;
41 void operator=(
const RISCVMCCodeEmitter &) =
delete;
47 : Ctx(ctx), MCII(MCII) {}
49 ~RISCVMCCodeEmitter()
override =
default;
51 void encodeInstruction(
const MCInst &
MI, SmallVectorImpl<char> &CB,
52 SmallVectorImpl<MCFixup> &Fixups,
53 const MCSubtargetInfo &STI)
const override;
55 void expandFunctionCall(
const MCInst &
MI, SmallVectorImpl<char> &CB,
56 SmallVectorImpl<MCFixup> &Fixups,
57 const MCSubtargetInfo &STI)
const;
59 void expandTLSDESCCall(
const MCInst &
MI, SmallVectorImpl<char> &CB,
60 SmallVectorImpl<MCFixup> &Fixups,
61 const MCSubtargetInfo &STI)
const;
63 void expandAddTPRel(
const MCInst &
MI, SmallVectorImpl<char> &CB,
64 SmallVectorImpl<MCFixup> &Fixups,
65 const MCSubtargetInfo &STI)
const;
67 void expandLongCondBr(
const MCInst &
MI, SmallVectorImpl<char> &CB,
68 SmallVectorImpl<MCFixup> &Fixups,
69 const MCSubtargetInfo &STI)
const;
71 void expandFunctionCallLpad(
const MCInst &
MI, SmallVectorImpl<char> &CB,
72 SmallVectorImpl<MCFixup> &Fixups,
73 const MCSubtargetInfo &STI)
const;
75 void expandQCLongCondBrImm(
const MCInst &
MI, SmallVectorImpl<char> &CB,
76 SmallVectorImpl<MCFixup> &Fixups,
77 const MCSubtargetInfo &STI,
unsigned Size)
const;
79 void expandPseudoQCAccess(
const MCInst &
MI, SmallVectorImpl<char> &CB,
80 SmallVectorImpl<MCFixup> &Fixups,
81 const MCSubtargetInfo &STI)
const;
85 uint64_t getBinaryCodeForInstr(
const MCInst &
MI,
86 SmallVectorImpl<MCFixup> &Fixups,
87 const MCSubtargetInfo &STI)
const;
91 uint64_t getMachineOpValue(
const MCInst &
MI,
const MCOperand &MO,
92 SmallVectorImpl<MCFixup> &Fixups,
93 const MCSubtargetInfo &STI)
const;
95 uint64_t getImmOpValueMinus1(
const MCInst &
MI,
unsigned OpNo,
96 SmallVectorImpl<MCFixup> &Fixups,
97 const MCSubtargetInfo &STI)
const;
99 uint64_t getImmOpValueSlist(
const MCInst &
MI,
unsigned OpNo,
100 SmallVectorImpl<MCFixup> &Fixups,
101 const MCSubtargetInfo &STI)
const;
103 template <
unsigned N>
104 unsigned getImmOpValueAsrN(
const MCInst &
MI,
unsigned OpNo,
105 SmallVectorImpl<MCFixup> &Fixups,
106 const MCSubtargetInfo &STI)
const;
108 uint64_t getImmOpValueZibi(
const MCInst &
MI,
unsigned OpNo,
109 SmallVectorImpl<MCFixup> &Fixups,
110 const MCSubtargetInfo &STI)
const;
112 uint64_t getImmOpValue(
const MCInst &
MI,
unsigned OpNo,
113 SmallVectorImpl<MCFixup> &Fixups,
114 const MCSubtargetInfo &STI)
const;
116 unsigned getYBNDSWImmOpValue(
const MCInst &
MI,
unsigned OpNo,
117 SmallVectorImpl<MCFixup> &Fixups,
118 const MCSubtargetInfo &STI)
const;
120 unsigned getVMaskReg(
const MCInst &
MI,
unsigned OpNo,
121 SmallVectorImpl<MCFixup> &Fixups,
122 const MCSubtargetInfo &STI)
const;
124 unsigned getRlistOpValue(
const MCInst &
MI,
unsigned OpNo,
125 SmallVectorImpl<MCFixup> &Fixups,
126 const MCSubtargetInfo &STI)
const;
128 unsigned getRlistS0OpValue(
const MCInst &
MI,
unsigned OpNo,
129 SmallVectorImpl<MCFixup> &Fixups,
130 const MCSubtargetInfo &STI)
const;
136 return new RISCVMCCodeEmitter(Ctx, MCII);
143 case ELF::R_RISCV_CALL_PLT:
169void RISCVMCCodeEmitter::expandFunctionCall(
const MCInst &
MI,
176 if (
MI.getOpcode() == RISCV::PseudoTAIL) {
179 }
else if (
MI.getOpcode() == RISCV::PseudoTAILReg) {
181 Ra =
MI.getOperand(1).getReg();
182 }
else if (
MI.getOpcode() == RISCV::PseudoCALLReg) {
184 Ra =
MI.getOperand(0).getReg();
185 }
else if (
MI.getOpcode() == RISCV::PseudoCALL) {
188 }
else if (
MI.getOpcode() == RISCV::PseudoJump) {
190 Ra =
MI.getOperand(0).getReg();
194 assert(
Func.isExpr() &&
"Expected expression");
196 const MCExpr *CallExpr =
Func.getExpr();
200 if (
MI.getOpcode() == RISCV::PseudoTAIL ||
201 MI.getOpcode() == RISCV::PseudoTAILReg ||
202 MI.getOpcode() == RISCV::PseudoJump)
204 TmpInst = MCInstBuilder(RISCV::JAL).addReg(RISCV::X0).
addOperand(FuncOp);
207 TmpInst = MCInstBuilder(RISCV::JAL).addReg(Ra).
addOperand(FuncOp);
208 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
213 TmpInst = MCInstBuilder(RISCV::AUIPC).addReg(Ra).addExpr(CallExpr);
214 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
217 if (
MI.getOpcode() == RISCV::PseudoTAIL ||
218 MI.getOpcode() == RISCV::PseudoTAILReg ||
219 MI.getOpcode() == RISCV::PseudoJump)
221 TmpInst = MCInstBuilder(RISCV::JALR).addReg(RISCV::X0).addReg(Ra).addImm(0);
224 TmpInst = MCInstBuilder(RISCV::JALR).addReg(Ra).addReg(Ra).addImm(0);
225 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
232void RISCVMCCodeEmitter::expandFunctionCallLpad(
233 const MCInst &
MI, SmallVectorImpl<char> &CB,
234 SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI)
const {
235 bool IsIndirect =
MI.getOpcode() == RISCV::PseudoCALLIndirectLpadAlign;
240 const MCOperand &
Func =
MI.getOperand(0);
241 assert(
Func.isExpr() &&
"Expected expression for call target");
246 MCSubtargetInfo NoRelaxSTI(STI);
248 NoRelaxSTI.ToggleFeature(RISCV::FeatureRelax);
251 MCInstBuilder(RISCV::AUIPC).addReg(RISCV::X1).addExpr(
Func.getExpr());
252 Binary = getBinaryCodeForInstr(TmpInst, Fixups, NoRelaxSTI);
255 TmpInst = MCInstBuilder(RISCV::JALR)
259 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
262 TmpInst = MCInstBuilder(RISCV::JALR)
264 .addReg(
MI.getOperand(0).getReg())
266 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
271 TmpInst = MCInstBuilder(RISCV::AUIPC)
273 .addImm(
MI.getOperand(1).getImm());
274 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
278void RISCVMCCodeEmitter::expandTLSDESCCall(
const MCInst &
MI,
279 SmallVectorImpl<char> &CB,
280 SmallVectorImpl<MCFixup> &Fixups,
281 const MCSubtargetInfo &STI)
const {
282 MCOperand SrcSymbol =
MI.getOperand(3);
284 "Expected expression as first input to TLSDESCCALL");
286 MCRegister Link =
MI.getOperand(0).getReg();
287 MCRegister Dest =
MI.getOperand(1).getReg();
288 int64_t
Imm =
MI.getOperand(2).getImm();
289 addFixup(Fixups, 0, Expr, ELF::R_RISCV_TLSDESC_CALL);
291 MCInstBuilder(RISCV::JALR).addReg(Link).addReg(Dest).addImm(
Imm);
293 uint32_t
Binary = getBinaryCodeForInstr(
Call, Fixups, STI);
298void RISCVMCCodeEmitter::expandAddTPRel(
const MCInst &
MI,
299 SmallVectorImpl<char> &CB,
300 SmallVectorImpl<MCFixup> &Fixups,
301 const MCSubtargetInfo &STI)
const {
302 MCOperand DestReg =
MI.getOperand(0);
303 MCOperand SrcReg =
MI.getOperand(1);
304 MCOperand TPReg =
MI.getOperand(2);
306 "Expected thread pointer as second input to TP-relative add");
308 MCOperand SrcSymbol =
MI.getOperand(3);
310 "Expected expression as third input to TP-relative add");
313 assert(Expr && Expr->getSpecifier() == ELF::R_RISCV_TPREL_ADD &&
314 "Expected tprel_add relocation on TP-relative symbol");
316 addFixup(Fixups, 0, Expr, ELF::R_RISCV_TPREL_ADD);
318 Fixups.back().setLinkerRelaxable();
321 MCInst TmpInst = MCInstBuilder(RISCV::ADD)
325 uint32_t
Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
333 case RISCV::PseudoLongBEQ:
335 case RISCV::PseudoLongBNE:
337 case RISCV::PseudoLongBEQI:
339 case RISCV::PseudoLongBNEI:
341 case RISCV::PseudoLongBLT:
343 case RISCV::PseudoLongBGE:
345 case RISCV::PseudoLongBLTU:
347 case RISCV::PseudoLongBGEU:
349 case RISCV::PseudoLongQC_BEQI:
350 return RISCV::QC_BNEI;
351 case RISCV::PseudoLongQC_BNEI:
352 return RISCV::QC_BEQI;
353 case RISCV::PseudoLongQC_BLTI:
354 return RISCV::QC_BGEI;
355 case RISCV::PseudoLongQC_BGEI:
356 return RISCV::QC_BLTI;
357 case RISCV::PseudoLongQC_BLTUI:
358 return RISCV::QC_BGEUI;
359 case RISCV::PseudoLongQC_BGEUI:
360 return RISCV::QC_BLTUI;
361 case RISCV::PseudoLongQC_E_BEQI:
362 return RISCV::QC_E_BNEI;
363 case RISCV::PseudoLongQC_E_BNEI:
364 return RISCV::QC_E_BEQI;
365 case RISCV::PseudoLongQC_E_BLTI:
366 return RISCV::QC_E_BGEI;
367 case RISCV::PseudoLongQC_E_BGEI:
368 return RISCV::QC_E_BLTI;
369 case RISCV::PseudoLongQC_E_BLTUI:
370 return RISCV::QC_E_BGEUI;
371 case RISCV::PseudoLongQC_E_BGEUI:
372 return RISCV::QC_E_BLTUI;
373 case RISCV::PseudoLongCV_BEQIMM:
374 return RISCV::CV_BNEIMM;
375 case RISCV::PseudoLongCV_BNEIMM:
376 return RISCV::CV_BEQIMM;
382void RISCVMCCodeEmitter::expandLongCondBr(
const MCInst &
MI,
383 SmallVectorImpl<char> &CB,
384 SmallVectorImpl<MCFixup> &Fixups,
385 const MCSubtargetInfo &STI)
const {
386 MCRegister SrcReg1 =
MI.getOperand(0).getReg();
387 const MCOperand &Src2 =
MI.getOperand(1);
388 const MCOperand &SrcSymbol =
MI.getOperand(2);
389 unsigned Opcode =
MI.getOpcode();
391 Opcode == RISCV::PseudoLongBNE || Opcode == RISCV::PseudoLongBEQ;
393 bool UseCompressedBr =
false;
394 if (IsEqTest && STI.
hasFeature(RISCV::FeatureStdExtZca)) {
395 MCRegister SrcReg2 = Src2.
getReg();
396 if (RISCV::X8 <= SrcReg1.
id() && SrcReg1.
id() <= RISCV::X15 &&
397 SrcReg2.
id() == RISCV::X0) {
398 UseCompressedBr =
true;
399 }
else if (RISCV::X8 <= SrcReg2.
id() && SrcReg2.
id() <= RISCV::X15 &&
400 SrcReg1.
id() == RISCV::X0) {
402 UseCompressedBr =
true;
407 if (UseCompressedBr) {
409 Opcode == RISCV::PseudoLongBNE ? RISCV::C_BEQZ : RISCV::C_BNEZ;
410 MCInst TmpInst = MCInstBuilder(InvOpc).addReg(SrcReg1).addImm(6);
411 uint16_t
Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
417 MCInstBuilder(InvOpc).addReg(SrcReg1).
addOperand(Src2).addImm(8);
418 uint32_t
Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
424 size_t FixupStartIndex =
Fixups.size();
428 MCInstBuilder(RISCV::JAL).addReg(RISCV::X0).
addOperand(SrcSymbol);
429 uint32_t
Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
433 Fixups.resize(FixupStartIndex);
438 Fixups.back().setLinkerRelaxable();
444void RISCVMCCodeEmitter::expandQCLongCondBrImm(
const MCInst &
MI,
445 SmallVectorImpl<char> &CB,
446 SmallVectorImpl<MCFixup> &Fixups,
447 const MCSubtargetInfo &STI,
448 unsigned Size)
const {
449 MCRegister SrcReg1 =
MI.getOperand(0).getReg();
450 auto BrImm =
MI.getOperand(1).getImm();
451 MCOperand SrcSymbol =
MI.getOperand(2);
452 unsigned Opcode =
MI.getOpcode();
461 MCInstBuilder(InvOpc).addReg(SrcReg1).addImm(BrImm).addImm(8);
462 uint32_t BrBinary = getBinaryCodeForInstr(TmpBr, Fixups, STI);
466 MCInstBuilder(InvOpc).addReg(SrcReg1).addImm(BrImm).addImm(10);
468 getBinaryCodeForInstr(TmpBr, Fixups, STI) & 0xffff'ffff'ffffu;
469 SmallVector<char, 8> Encoding;
471 assert(Encoding[6] == 0 && Encoding[7] == 0 &&
472 "Unexpected encoding for 48-bit instruction");
478 size_t FixupStartIndex =
Fixups.size();
481 MCInstBuilder(RISCV::JAL).addReg(RISCV::X0).addOperand(SrcSymbol);
482 uint32_t JBinary = getBinaryCodeForInstr(TmpJ, Fixups, STI);
485 Fixups.resize(FixupStartIndex);
489 Fixups.back().setLinkerRelaxable();
493void RISCVMCCodeEmitter::expandPseudoQCAccess(
494 const MCInst &
MI, SmallVectorImpl<char> &CB,
495 SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI)
const {
498 switch (
MI.getOpcode()) {
499#define QC_ACCESS_CASE(_Suffix) \
500 case RISCV::PseudoQCAccess##_Suffix: \
501 AccessOpc = RISCV::_Suffix; \
524 MCInst TmpAccess = MCInstBuilder(AccessOpc)
525 .addOperand(
MI.getOperand(0))
526 .addOperand(
MI.getOperand(1))
527 .addOperand(
MI.getOperand(2));
534 uint16_t AccessBinary = getBinaryCodeForInstr(TmpAccess, Fixups, STI);
540 uint32_t AccessBinary = getBinaryCodeForInstr(TmpAccess, Fixups, STI);
552 const MCOperand &AccessSymbol =
MI.getOperand(3);
553 assert(AccessSymbol.
isExpr() &&
"Expected expression in PseudoQCAccess");
557 "Expected qc.access specifier on symbol");
561 Fixups.back().setLinkerRelaxable();
564void RISCVMCCodeEmitter::encodeInstruction(
const MCInst &
MI,
565 SmallVectorImpl<char> &CB,
566 SmallVectorImpl<MCFixup> &Fixups,
567 const MCSubtargetInfo &STI)
const {
568 const MCInstrDesc &
Desc = MCII.
get(
MI.getOpcode());
575 switch (
MI.getOpcode()) {
578 case RISCV::PseudoCALLReg:
579 case RISCV::PseudoCALL:
580 case RISCV::PseudoTAIL:
581 case RISCV::PseudoTAILReg:
582 case RISCV::PseudoJump:
583 expandFunctionCall(
MI, CB, Fixups, STI);
586 case RISCV::PseudoCALLLpadAlign:
587 expandFunctionCallLpad(
MI, CB, Fixups, STI);
590 case RISCV::PseudoCALLIndirectLpadAlign:
591 expandFunctionCallLpad(
MI, CB, Fixups, STI);
594 case RISCV::PseudoAddTPRel:
595 expandAddTPRel(
MI, CB, Fixups, STI);
598 case RISCV::PseudoLongBEQ:
599 case RISCV::PseudoLongBNE:
600 case RISCV::PseudoLongBEQI:
601 case RISCV::PseudoLongBNEI:
602 case RISCV::PseudoLongBLT:
603 case RISCV::PseudoLongBGE:
604 case RISCV::PseudoLongBLTU:
605 case RISCV::PseudoLongBGEU:
606 expandLongCondBr(
MI, CB, Fixups, STI);
609 case RISCV::PseudoLongQC_BEQI:
610 case RISCV::PseudoLongQC_BNEI:
611 case RISCV::PseudoLongQC_BLTI:
612 case RISCV::PseudoLongQC_BGEI:
613 case RISCV::PseudoLongQC_BLTUI:
614 case RISCV::PseudoLongQC_BGEUI:
615 case RISCV::PseudoLongCV_BEQIMM:
616 case RISCV::PseudoLongCV_BNEIMM:
617 expandQCLongCondBrImm(
MI, CB, Fixups, STI, 4);
620 case RISCV::PseudoLongQC_E_BEQI:
621 case RISCV::PseudoLongQC_E_BNEI:
622 case RISCV::PseudoLongQC_E_BLTI:
623 case RISCV::PseudoLongQC_E_BGEI:
624 case RISCV::PseudoLongQC_E_BLTUI:
625 case RISCV::PseudoLongQC_E_BGEUI:
626 expandQCLongCondBrImm(
MI, CB, Fixups, STI, 6);
629 case RISCV::PseudoTLSDESCCall:
630 expandTLSDESCCall(
MI, CB, Fixups, STI);
633 case RISCV::PseudoQCAccessLB:
634 case RISCV::PseudoQCAccessLBU:
635 case RISCV::PseudoQCAccessLH:
636 case RISCV::PseudoQCAccessLHU:
637 case RISCV::PseudoQCAccessLW:
638 case RISCV::PseudoQCAccessSB:
639 case RISCV::PseudoQCAccessSH:
640 case RISCV::PseudoQCAccessSW:
641 case RISCV::PseudoQCAccessC_LBU:
642 case RISCV::PseudoQCAccessC_LH:
643 case RISCV::PseudoQCAccessC_LHU:
644 case RISCV::PseudoQCAccessC_LW:
645 case RISCV::PseudoQCAccessC_SB:
646 case RISCV::PseudoQCAccessC_SH:
647 case RISCV::PseudoQCAccessC_SW:
648 expandPseudoQCAccess(
MI, CB, Fixups, STI);
657 uint16_t
Bits = getBinaryCodeForInstr(
MI, Fixups, STI);
662 uint32_t
Bits = getBinaryCodeForInstr(
MI, Fixups, STI);
667 uint64_t Bits = getBinaryCodeForInstr(
MI, Fixups, STI) & 0xffff'ffff'ffffu;
668 SmallVector<char, 8> Encoding;
670 assert(Encoding[6] == 0 && Encoding[7] == 0 &&
671 "Unexpected encoding for 48-bit instruction");
687RISCVMCCodeEmitter::getMachineOpValue(
const MCInst &
MI,
const MCOperand &MO,
688 SmallVectorImpl<MCFixup> &Fixups,
689 const MCSubtargetInfo &STI)
const {
702RISCVMCCodeEmitter::getImmOpValueMinus1(
const MCInst &
MI,
unsigned OpNo,
703 SmallVectorImpl<MCFixup> &Fixups,
704 const MCSubtargetInfo &STI)
const {
705 const MCOperand &MO =
MI.getOperand(OpNo);
717RISCVMCCodeEmitter::getImmOpValueSlist(
const MCInst &
MI,
unsigned OpNo,
718 SmallVectorImpl<MCFixup> &Fixups,
719 const MCSubtargetInfo &STI)
const {
720 const MCOperand &MO =
MI.getOperand(OpNo);
721 assert(MO.
isImm() &&
"Slist operand must be immediate");
748RISCVMCCodeEmitter::getImmOpValueAsrN(
const MCInst &
MI,
unsigned OpNo,
749 SmallVectorImpl<MCFixup> &Fixups,
750 const MCSubtargetInfo &STI)
const {
751 const MCOperand &MO =
MI.getOperand(OpNo);
755 assert((Res & ((1 <<
N) - 1)) == 0 &&
"LSB is non-zero");
759 return getImmOpValue(
MI, OpNo, Fixups, STI);
763RISCVMCCodeEmitter::getImmOpValueZibi(
const MCInst &
MI,
unsigned OpNo,
764 SmallVectorImpl<MCFixup> &Fixups,
765 const MCSubtargetInfo &STI)
const {
766 const MCOperand &MO =
MI.getOperand(OpNo);
767 assert(MO.
isImm() &&
"Zibi operand must be an immediate");
768 int64_t Res = MO.
getImm();
775uint64_t RISCVMCCodeEmitter::getImmOpValue(
const MCInst &
MI,
unsigned OpNo,
776 SmallVectorImpl<MCFixup> &Fixups,
777 const MCSubtargetInfo &STI)
const {
778 bool EnableRelax = STI.
hasFeature(RISCV::FeatureRelax);
779 const MCOperand &MO =
MI.getOperand(OpNo);
781 MCInstrDesc
const &
Desc = MCII.
get(
MI.getOpcode());
789 "getImmOpValue expects only expressions or immediates");
790 const MCExpr *Expr = MO.
getExpr();
800 bool RelaxCandidate =
false;
801 auto AsmRelaxToLinkerRelaxable = [&]() ->
void {
802 if (!STI.
hasFeature(RISCV::FeatureExactAssembly))
803 RelaxCandidate =
true;
810 switch (RVExpr->getSpecifier()) {
813 "invalid specifier");
815 case ELF::R_RISCV_TPREL_ADD:
821 "ELF::R_RISCV_TPREL_ADD should not represent an instruction operand");
827 "S_QC_ACCESS should not represent an instruction operand");
835 RelaxCandidate =
true;
837 case ELF::R_RISCV_HI20:
839 RelaxCandidate =
true;
848 RelaxCandidate =
true;
852 RelaxCandidate =
true;
856 RelaxCandidate =
true;
865 RelaxCandidate =
true;
873 RelaxCandidate =
true;
877 RelaxCandidate =
true;
879 case ELF::R_RISCV_GOT_HI20:
880 case ELF::R_RISCV_TPREL_HI20:
881 case ELF::R_RISCV_TLSDESC_HI20:
882 RelaxCandidate =
true;
889 RelaxCandidate =
true;
893 AsmRelaxToLinkerRelaxable();
897 AsmRelaxToLinkerRelaxable();
901 AsmRelaxToLinkerRelaxable();
905 if (STI.
hasFeature(RISCV::FeatureVendorXqcili))
906 AsmRelaxToLinkerRelaxable();
912 AsmRelaxToLinkerRelaxable();
915 RelaxCandidate =
true;
918 RelaxCandidate =
true;
930 if (EnableRelax && RelaxCandidate)
931 Fixups.back().setLinkerRelaxable();
938RISCVMCCodeEmitter::getYBNDSWImmOpValue(
const MCInst &
MI,
unsigned OpNo,
939 SmallVectorImpl<MCFixup> &Fixups,
940 const MCSubtargetInfo &STI)
const {
941 unsigned Imm = getImmOpValue(
MI, OpNo, Fixups, STI);
948 if (
Imm > 0 &&
Imm <= 255)
952 if (
Imm >= 256 &&
Imm <= 504 && (
Imm % 8) == 0) {
955 unsigned MultipleOf8 = (
Imm - 256) >> 3;
956 unsigned OddMultiple = MultipleOf8 & 1;
957 unsigned Bits3To0 = MultipleOf8 >> 1;
958 return 256 | (OddMultiple << 4) | Bits3To0;
961 if (
Imm >= 512 &&
Imm <= 4080 && (
Imm % 16) == 0)
962 return 256 | (
Imm >> 4);
966unsigned RISCVMCCodeEmitter::getVMaskReg(
const MCInst &
MI,
unsigned OpNo,
967 SmallVectorImpl<MCFixup> &Fixups,
968 const MCSubtargetInfo &STI)
const {
969 MCOperand MO =
MI.getOperand(OpNo);
977 case RISCV::NoRegister:
982unsigned RISCVMCCodeEmitter::getRlistOpValue(
const MCInst &
MI,
unsigned OpNo,
983 SmallVectorImpl<MCFixup> &Fixups,
984 const MCSubtargetInfo &STI)
const {
985 const MCOperand &MO =
MI.getOperand(OpNo);
986 assert(MO.
isImm() &&
"Rlist operand must be immediate");
988 assert(
Imm >= 4 &&
"EABI is currently not implemented");
992RISCVMCCodeEmitter::getRlistS0OpValue(
const MCInst &
MI,
unsigned OpNo,
993 SmallVectorImpl<MCFixup> &Fixups,
994 const MCSubtargetInfo &STI)
const {
995 const MCOperand &MO =
MI.getOperand(OpNo);
996 assert(MO.
isImm() &&
"Rlist operand must be immediate");
998 assert(
Imm >= 4 &&
"EABI is currently not implemented");
1003#include "RISCVGenMCCodeEmitter.inc"
static void addFixup(SmallVectorImpl< MCFixup > &Fixups, uint32_t Offset, const MCExpr *Value, uint16_t Kind, bool PCRel=false)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define QC_ACCESS_CASE(_Suffix)
static unsigned getInvertedBranchOp(unsigned BrOp)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
MCCodeEmitter - Generic instruction encoding interface.
Context object for machine code objects.
const MCRegisterInfo * getRegisterInfo() const
const Triple & getTargetTriple() const
Base class for the full range of assembler expressions which are needed for parsing.
@ SymbolRef
References to labels and assigned expressions.
@ Specifier
Expression with a relocation specifier.
@ Binary
Binary expressions.
static MCFixup create(uint32_t Offset, const MCExpr *Value, MCFixupKind Kind, bool PCRel=false)
Consider bit fields if we need more flags.
Instances of this class represent a single low-level machine instruction.
void addOperand(const MCOperand Op)
unsigned getSize() const
Return the number of bytes in the encoding of this instruction, or zero if the encoding size cannot b...
Interface to description of machine instruction set.
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
static MCOperand createExpr(const MCExpr *Val)
MCRegister getReg() const
Returns the register number.
const MCExpr * getExpr() const
uint16_t getEncodingValue(MCRegister Reg) const
Returns the encoding for Reg.
constexpr unsigned id() const
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
const Triple & getTargetTriple() const
const FeatureBitset & getFeatureBits() const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void truncate(size_type N)
Like resize, but requires that N is less than size().
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
LLVM Value Representation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static unsigned getFormat(uint64_t TSFlags)
@ InstFormatNDS_BRANCH_10
static MCRegister getTailExpandUseRegNo(const FeatureBitset &FeatureBits)
@ fixup_riscv_pcrel_lo12_i
@ fixup_riscv_pcrel_lo12_s
@ fixup_riscv_nds_branch_10
@ fixup_riscv_qc_e_call_plt
@ fixup_riscv_qc_e_branch
bool isValidYBNDSWImm(int64_t Imm)
NodeAddr< FuncNode * > Func
void write(void *memory, value_type value, endianness endian)
Write a value to memory with a particular endianness.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
MCCodeEmitter * createRISCVMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)
static Lanai::Fixups FixupKind(const MCExpr *Expr)
static void addFixup(SmallVectorImpl< MCFixup > &Fixups, uint32_t Offset, const MCExpr *Value, uint16_t Kind)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.