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::PseudoCALLReg) {
181 Ra =
MI.getOperand(0).getReg();
182 }
else if (
MI.getOpcode() == RISCV::PseudoCALL) {
185 }
else if (
MI.getOpcode() == RISCV::PseudoJump) {
187 Ra =
MI.getOperand(0).getReg();
191 assert(
Func.isExpr() &&
"Expected expression");
193 const MCExpr *CallExpr =
Func.getExpr();
197 if (
MI.getOpcode() == RISCV::PseudoTAIL ||
198 MI.getOpcode() == RISCV::PseudoJump)
200 TmpInst = MCInstBuilder(RISCV::JAL).addReg(RISCV::X0).
addOperand(FuncOp);
203 TmpInst = MCInstBuilder(RISCV::JAL).addReg(Ra).
addOperand(FuncOp);
204 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
209 TmpInst = MCInstBuilder(RISCV::AUIPC).addReg(Ra).addExpr(CallExpr);
210 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
213 if (
MI.getOpcode() == RISCV::PseudoTAIL ||
214 MI.getOpcode() == RISCV::PseudoJump)
216 TmpInst = MCInstBuilder(RISCV::JALR).addReg(RISCV::X0).addReg(Ra).addImm(0);
219 TmpInst = MCInstBuilder(RISCV::JALR).addReg(Ra).addReg(Ra).addImm(0);
220 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
227void RISCVMCCodeEmitter::expandFunctionCallLpad(
228 const MCInst &
MI, SmallVectorImpl<char> &CB,
229 SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI)
const {
230 bool IsIndirect =
MI.getOpcode() == RISCV::PseudoCALLIndirectLpadAlign;
235 const MCOperand &
Func =
MI.getOperand(0);
236 assert(
Func.isExpr() &&
"Expected expression for call target");
241 MCSubtargetInfo NoRelaxSTI(STI);
243 NoRelaxSTI.ToggleFeature(RISCV::FeatureRelax);
246 MCInstBuilder(RISCV::AUIPC).addReg(RISCV::X1).addExpr(
Func.getExpr());
247 Binary = getBinaryCodeForInstr(TmpInst, Fixups, NoRelaxSTI);
250 TmpInst = MCInstBuilder(RISCV::JALR)
254 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
257 TmpInst = MCInstBuilder(RISCV::JALR)
259 .addReg(
MI.getOperand(0).getReg())
261 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
266 TmpInst = MCInstBuilder(RISCV::AUIPC)
268 .addImm(
MI.getOperand(1).getImm());
269 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
273void RISCVMCCodeEmitter::expandTLSDESCCall(
const MCInst &
MI,
274 SmallVectorImpl<char> &CB,
275 SmallVectorImpl<MCFixup> &Fixups,
276 const MCSubtargetInfo &STI)
const {
277 MCOperand SrcSymbol =
MI.getOperand(3);
279 "Expected expression as first input to TLSDESCCALL");
281 MCRegister Link =
MI.getOperand(0).getReg();
282 MCRegister Dest =
MI.getOperand(1).getReg();
283 int64_t
Imm =
MI.getOperand(2).getImm();
284 addFixup(Fixups, 0, Expr, ELF::R_RISCV_TLSDESC_CALL);
286 MCInstBuilder(RISCV::JALR).addReg(Link).addReg(Dest).addImm(Imm);
288 uint32_t
Binary = getBinaryCodeForInstr(
Call, Fixups, STI);
293void RISCVMCCodeEmitter::expandAddTPRel(
const MCInst &
MI,
294 SmallVectorImpl<char> &CB,
295 SmallVectorImpl<MCFixup> &Fixups,
296 const MCSubtargetInfo &STI)
const {
297 MCOperand DestReg =
MI.getOperand(0);
298 MCOperand SrcReg =
MI.getOperand(1);
299 MCOperand TPReg =
MI.getOperand(2);
301 "Expected thread pointer as second input to TP-relative add");
303 MCOperand SrcSymbol =
MI.getOperand(3);
305 "Expected expression as third input to TP-relative add");
308 assert(Expr && Expr->getSpecifier() == ELF::R_RISCV_TPREL_ADD &&
309 "Expected tprel_add relocation on TP-relative symbol");
311 addFixup(Fixups, 0, Expr, ELF::R_RISCV_TPREL_ADD);
313 Fixups.back().setLinkerRelaxable();
316 MCInst TmpInst = MCInstBuilder(RISCV::ADD)
320 uint32_t
Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
328 case RISCV::PseudoLongBEQ:
330 case RISCV::PseudoLongBNE:
332 case RISCV::PseudoLongBEQI:
334 case RISCV::PseudoLongBNEI:
336 case RISCV::PseudoLongBLT:
338 case RISCV::PseudoLongBGE:
340 case RISCV::PseudoLongBLTU:
342 case RISCV::PseudoLongBGEU:
344 case RISCV::PseudoLongQC_BEQI:
345 return RISCV::QC_BNEI;
346 case RISCV::PseudoLongQC_BNEI:
347 return RISCV::QC_BEQI;
348 case RISCV::PseudoLongQC_BLTI:
349 return RISCV::QC_BGEI;
350 case RISCV::PseudoLongQC_BGEI:
351 return RISCV::QC_BLTI;
352 case RISCV::PseudoLongQC_BLTUI:
353 return RISCV::QC_BGEUI;
354 case RISCV::PseudoLongQC_BGEUI:
355 return RISCV::QC_BLTUI;
356 case RISCV::PseudoLongQC_E_BEQI:
357 return RISCV::QC_E_BNEI;
358 case RISCV::PseudoLongQC_E_BNEI:
359 return RISCV::QC_E_BEQI;
360 case RISCV::PseudoLongQC_E_BLTI:
361 return RISCV::QC_E_BGEI;
362 case RISCV::PseudoLongQC_E_BGEI:
363 return RISCV::QC_E_BLTI;
364 case RISCV::PseudoLongQC_E_BLTUI:
365 return RISCV::QC_E_BGEUI;
366 case RISCV::PseudoLongQC_E_BGEUI:
367 return RISCV::QC_E_BLTUI;
368 case RISCV::PseudoLongCV_BEQIMM:
369 return RISCV::CV_BNEIMM;
370 case RISCV::PseudoLongCV_BNEIMM:
371 return RISCV::CV_BEQIMM;
377void RISCVMCCodeEmitter::expandLongCondBr(
const MCInst &
MI,
378 SmallVectorImpl<char> &CB,
379 SmallVectorImpl<MCFixup> &Fixups,
380 const MCSubtargetInfo &STI)
const {
381 MCRegister SrcReg1 =
MI.getOperand(0).getReg();
382 const MCOperand &Src2 =
MI.getOperand(1);
383 const MCOperand &SrcSymbol =
MI.getOperand(2);
384 unsigned Opcode =
MI.getOpcode();
386 Opcode == RISCV::PseudoLongBNE || Opcode == RISCV::PseudoLongBEQ;
388 bool UseCompressedBr =
false;
389 if (IsEqTest && STI.
hasFeature(RISCV::FeatureStdExtZca)) {
390 MCRegister SrcReg2 = Src2.
getReg();
391 if (RISCV::X8 <= SrcReg1.
id() && SrcReg1.
id() <= RISCV::X15 &&
392 SrcReg2.
id() == RISCV::X0) {
393 UseCompressedBr =
true;
394 }
else if (RISCV::X8 <= SrcReg2.
id() && SrcReg2.
id() <= RISCV::X15 &&
395 SrcReg1.
id() == RISCV::X0) {
397 UseCompressedBr =
true;
402 if (UseCompressedBr) {
404 Opcode == RISCV::PseudoLongBNE ? RISCV::C_BEQZ : RISCV::C_BNEZ;
405 MCInst TmpInst = MCInstBuilder(InvOpc).addReg(SrcReg1).addImm(6);
406 uint16_t
Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
412 MCInstBuilder(InvOpc).addReg(SrcReg1).
addOperand(Src2).addImm(8);
413 uint32_t
Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
419 size_t FixupStartIndex =
Fixups.size();
423 MCInstBuilder(RISCV::JAL).addReg(RISCV::X0).
addOperand(SrcSymbol);
424 uint32_t
Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI);
428 Fixups.resize(FixupStartIndex);
433 Fixups.back().setLinkerRelaxable();
439void RISCVMCCodeEmitter::expandQCLongCondBrImm(
const MCInst &
MI,
440 SmallVectorImpl<char> &CB,
441 SmallVectorImpl<MCFixup> &Fixups,
442 const MCSubtargetInfo &STI,
443 unsigned Size)
const {
444 MCRegister SrcReg1 =
MI.getOperand(0).getReg();
445 auto BrImm =
MI.getOperand(1).getImm();
446 MCOperand SrcSymbol =
MI.getOperand(2);
447 unsigned Opcode =
MI.getOpcode();
456 MCInstBuilder(InvOpc).addReg(SrcReg1).addImm(BrImm).addImm(8);
457 uint32_t BrBinary = getBinaryCodeForInstr(TmpBr, Fixups, STI);
461 MCInstBuilder(InvOpc).addReg(SrcReg1).addImm(BrImm).addImm(10);
463 getBinaryCodeForInstr(TmpBr, Fixups, STI) & 0xffff'ffff'ffffu;
464 SmallVector<char, 8> Encoding;
466 assert(Encoding[6] == 0 && Encoding[7] == 0 &&
467 "Unexpected encoding for 48-bit instruction");
473 size_t FixupStartIndex =
Fixups.size();
476 MCInstBuilder(RISCV::JAL).addReg(RISCV::X0).addOperand(SrcSymbol);
477 uint32_t JBinary = getBinaryCodeForInstr(TmpJ, Fixups, STI);
480 Fixups.resize(FixupStartIndex);
484 Fixups.back().setLinkerRelaxable();
488void RISCVMCCodeEmitter::expandPseudoQCAccess(
489 const MCInst &
MI, SmallVectorImpl<char> &CB,
490 SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI)
const {
493 switch (
MI.getOpcode()) {
494#define QC_ACCESS_CASE(_Suffix) \
495 case RISCV::PseudoQCAccess##_Suffix: \
496 AccessOpc = RISCV::_Suffix; \
519 MCInst TmpAccess = MCInstBuilder(AccessOpc)
520 .addOperand(
MI.getOperand(0))
521 .addOperand(
MI.getOperand(1))
522 .addOperand(
MI.getOperand(2));
529 uint16_t AccessBinary = getBinaryCodeForInstr(TmpAccess, Fixups, STI);
535 uint32_t AccessBinary = getBinaryCodeForInstr(TmpAccess, Fixups, STI);
547 const MCOperand &AccessSymbol =
MI.getOperand(3);
548 assert(AccessSymbol.
isExpr() &&
"Expected expression in PseudoQCAccess");
552 "Expected qc.access specifier on symbol");
556 Fixups.back().setLinkerRelaxable();
559void RISCVMCCodeEmitter::encodeInstruction(
const MCInst &
MI,
560 SmallVectorImpl<char> &CB,
561 SmallVectorImpl<MCFixup> &Fixups,
562 const MCSubtargetInfo &STI)
const {
563 const MCInstrDesc &
Desc = MCII.
get(
MI.getOpcode());
570 switch (
MI.getOpcode()) {
573 case RISCV::PseudoCALLReg:
574 case RISCV::PseudoCALL:
575 case RISCV::PseudoTAIL:
576 case RISCV::PseudoJump:
577 expandFunctionCall(
MI, CB, Fixups, STI);
580 case RISCV::PseudoCALLLpadAlign:
581 expandFunctionCallLpad(
MI, CB, Fixups, STI);
584 case RISCV::PseudoCALLIndirectLpadAlign:
585 expandFunctionCallLpad(
MI, CB, Fixups, STI);
588 case RISCV::PseudoAddTPRel:
589 expandAddTPRel(
MI, CB, Fixups, STI);
592 case RISCV::PseudoLongBEQ:
593 case RISCV::PseudoLongBNE:
594 case RISCV::PseudoLongBEQI:
595 case RISCV::PseudoLongBNEI:
596 case RISCV::PseudoLongBLT:
597 case RISCV::PseudoLongBGE:
598 case RISCV::PseudoLongBLTU:
599 case RISCV::PseudoLongBGEU:
600 expandLongCondBr(
MI, CB, Fixups, STI);
603 case RISCV::PseudoLongQC_BEQI:
604 case RISCV::PseudoLongQC_BNEI:
605 case RISCV::PseudoLongQC_BLTI:
606 case RISCV::PseudoLongQC_BGEI:
607 case RISCV::PseudoLongQC_BLTUI:
608 case RISCV::PseudoLongQC_BGEUI:
609 case RISCV::PseudoLongCV_BEQIMM:
610 case RISCV::PseudoLongCV_BNEIMM:
611 expandQCLongCondBrImm(
MI, CB, Fixups, STI, 4);
614 case RISCV::PseudoLongQC_E_BEQI:
615 case RISCV::PseudoLongQC_E_BNEI:
616 case RISCV::PseudoLongQC_E_BLTI:
617 case RISCV::PseudoLongQC_E_BGEI:
618 case RISCV::PseudoLongQC_E_BLTUI:
619 case RISCV::PseudoLongQC_E_BGEUI:
620 expandQCLongCondBrImm(
MI, CB, Fixups, STI, 6);
623 case RISCV::PseudoTLSDESCCall:
624 expandTLSDESCCall(
MI, CB, Fixups, STI);
627 case RISCV::PseudoQCAccessLB:
628 case RISCV::PseudoQCAccessLBU:
629 case RISCV::PseudoQCAccessLH:
630 case RISCV::PseudoQCAccessLHU:
631 case RISCV::PseudoQCAccessLW:
632 case RISCV::PseudoQCAccessSB:
633 case RISCV::PseudoQCAccessSH:
634 case RISCV::PseudoQCAccessSW:
635 case RISCV::PseudoQCAccessC_LBU:
636 case RISCV::PseudoQCAccessC_LH:
637 case RISCV::PseudoQCAccessC_LHU:
638 case RISCV::PseudoQCAccessC_LW:
639 case RISCV::PseudoQCAccessC_SB:
640 case RISCV::PseudoQCAccessC_SH:
641 case RISCV::PseudoQCAccessC_SW:
642 expandPseudoQCAccess(
MI, CB, Fixups, STI);
651 uint16_t
Bits = getBinaryCodeForInstr(
MI, Fixups, STI);
656 uint32_t
Bits = getBinaryCodeForInstr(
MI, Fixups, STI);
661 uint64_t
Bits = getBinaryCodeForInstr(
MI, Fixups, STI) & 0xffff'ffff'ffffu;
662 SmallVector<char, 8> Encoding;
664 assert(Encoding[6] == 0 && Encoding[7] == 0 &&
665 "Unexpected encoding for 48-bit instruction");
671 uint64_t
Bits = getBinaryCodeForInstr(
MI, Fixups, STI);
681RISCVMCCodeEmitter::getMachineOpValue(
const MCInst &
MI,
const MCOperand &MO,
682 SmallVectorImpl<MCFixup> &Fixups,
683 const MCSubtargetInfo &STI)
const {
696RISCVMCCodeEmitter::getImmOpValueMinus1(
const MCInst &
MI,
unsigned OpNo,
697 SmallVectorImpl<MCFixup> &Fixups,
698 const MCSubtargetInfo &STI)
const {
699 const MCOperand &MO =
MI.getOperand(OpNo);
702 uint64_t Res = MO.
getImm();
711RISCVMCCodeEmitter::getImmOpValueSlist(
const MCInst &
MI,
unsigned OpNo,
712 SmallVectorImpl<MCFixup> &Fixups,
713 const MCSubtargetInfo &STI)
const {
714 const MCOperand &MO =
MI.getOperand(OpNo);
715 assert(MO.
isImm() &&
"Slist operand must be immediate");
717 uint64_t Res = MO.
getImm();
742RISCVMCCodeEmitter::getImmOpValueAsrN(
const MCInst &
MI,
unsigned OpNo,
743 SmallVectorImpl<MCFixup> &Fixups,
744 const MCSubtargetInfo &STI)
const {
745 const MCOperand &MO =
MI.getOperand(OpNo);
748 uint64_t Res = MO.
getImm();
749 assert((Res & ((1 <<
N) - 1)) == 0 &&
"LSB is non-zero");
753 return getImmOpValue(
MI, OpNo, Fixups, STI);
757RISCVMCCodeEmitter::getImmOpValueZibi(
const MCInst &
MI,
unsigned OpNo,
758 SmallVectorImpl<MCFixup> &Fixups,
759 const MCSubtargetInfo &STI)
const {
760 const MCOperand &MO =
MI.getOperand(OpNo);
761 assert(MO.
isImm() &&
"Zibi operand must be an immediate");
762 int64_t Res = MO.
getImm();
769uint64_t RISCVMCCodeEmitter::getImmOpValue(
const MCInst &
MI,
unsigned OpNo,
770 SmallVectorImpl<MCFixup> &Fixups,
771 const MCSubtargetInfo &STI)
const {
772 bool EnableRelax = STI.
hasFeature(RISCV::FeatureRelax);
773 const MCOperand &MO =
MI.getOperand(OpNo);
775 MCInstrDesc
const &
Desc = MCII.
get(
MI.getOpcode());
783 "getImmOpValue expects only expressions or immediates");
784 const MCExpr *Expr = MO.
getExpr();
794 bool RelaxCandidate =
false;
795 auto AsmRelaxToLinkerRelaxable = [&]() ->
void {
796 if (!STI.
hasFeature(RISCV::FeatureExactAssembly))
797 RelaxCandidate =
true;
804 switch (RVExpr->getSpecifier()) {
807 "invalid specifier");
809 case ELF::R_RISCV_TPREL_ADD:
815 "ELF::R_RISCV_TPREL_ADD should not represent an instruction operand");
821 "S_QC_ACCESS should not represent an instruction operand");
829 RelaxCandidate =
true;
831 case ELF::R_RISCV_HI20:
833 RelaxCandidate =
true;
842 RelaxCandidate =
true;
846 RelaxCandidate =
true;
850 RelaxCandidate =
true;
859 RelaxCandidate =
true;
867 RelaxCandidate =
true;
871 RelaxCandidate =
true;
873 case ELF::R_RISCV_GOT_HI20:
874 case ELF::R_RISCV_TPREL_HI20:
875 case ELF::R_RISCV_TLSDESC_HI20:
876 RelaxCandidate =
true;
883 RelaxCandidate =
true;
887 AsmRelaxToLinkerRelaxable();
891 AsmRelaxToLinkerRelaxable();
895 AsmRelaxToLinkerRelaxable();
899 if (STI.
hasFeature(RISCV::FeatureVendorXqcili))
900 AsmRelaxToLinkerRelaxable();
906 AsmRelaxToLinkerRelaxable();
909 RelaxCandidate =
true;
912 RelaxCandidate =
true;
924 if (EnableRelax && RelaxCandidate)
925 Fixups.back().setLinkerRelaxable();
932RISCVMCCodeEmitter::getYBNDSWImmOpValue(
const MCInst &
MI,
unsigned OpNo,
933 SmallVectorImpl<MCFixup> &Fixups,
934 const MCSubtargetInfo &STI)
const {
935 unsigned Imm = getImmOpValue(
MI, OpNo, Fixups, STI);
942 if (Imm > 0 && Imm <= 255)
946 if (Imm >= 256 && Imm <= 504 && (Imm % 8) == 0) {
949 unsigned MultipleOf8 = (
Imm - 256) >> 3;
950 unsigned OddMultiple = MultipleOf8 & 1;
951 unsigned Bits3To0 = MultipleOf8 >> 1;
952 return 256 | (OddMultiple << 4) | Bits3To0;
955 if (Imm >= 512 && Imm <= 4080 && (Imm % 16) == 0)
956 return 256 | (
Imm >> 4);
960unsigned RISCVMCCodeEmitter::getVMaskReg(
const MCInst &
MI,
unsigned OpNo,
961 SmallVectorImpl<MCFixup> &Fixups,
962 const MCSubtargetInfo &STI)
const {
963 MCOperand MO =
MI.getOperand(OpNo);
971 case RISCV::NoRegister:
976unsigned RISCVMCCodeEmitter::getRlistOpValue(
const MCInst &
MI,
unsigned OpNo,
977 SmallVectorImpl<MCFixup> &Fixups,
978 const MCSubtargetInfo &STI)
const {
979 const MCOperand &MO =
MI.getOperand(OpNo);
980 assert(MO.
isImm() &&
"Rlist operand must be immediate");
982 assert(Imm >= 4 &&
"EABI is currently not implemented");
986RISCVMCCodeEmitter::getRlistS0OpValue(
const MCInst &
MI,
unsigned OpNo,
987 SmallVectorImpl<MCFixup> &Fixups,
988 const MCSubtargetInfo &STI)
const {
989 const MCOperand &MO =
MI.getOperand(OpNo);
990 assert(MO.
isImm() &&
"Rlist operand must be immediate");
992 assert(Imm >= 4 &&
"EABI is currently not implemented");
997#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.
@ InstFormatNDS_BRANCH_10
static unsigned getFormat(uint64_t TSFlags)
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.