@@ -56,6 +56,10 @@ class RISCVMCCodeEmitter : public MCCodeEmitter {
5656 SmallVectorImpl<MCFixup> &Fixups,
5757 const MCSubtargetInfo &STI) const ;
5858
59+ void expandQCJump (const MCInst &MI, SmallVectorImpl<char > &CB,
60+ SmallVectorImpl<MCFixup> &Fixups,
61+ const MCSubtargetInfo &STI) const ;
62+
5963 void expandTLSDESCCall (const MCInst &MI, SmallVectorImpl<char > &CB,
6064 SmallVectorImpl<MCFixup> &Fixups,
6165 const MCSubtargetInfo &STI) const ;
@@ -169,6 +173,26 @@ void RISCVMCCodeEmitter::expandFunctionCall(const MCInst &MI,
169173 support::endian::write (CB, Binary, llvm::endianness::little);
170174}
171175
176+ void RISCVMCCodeEmitter::expandQCJump (const MCInst &MI,
177+ SmallVectorImpl<char > &CB,
178+ SmallVectorImpl<MCFixup> &Fixups,
179+ const MCSubtargetInfo &STI) const {
180+ MCOperand Func = MI.getOperand (0 );
181+ assert (Func.isExpr () && " Expected expression" );
182+
183+ auto Opcode =
184+ (MI.getOpcode () == RISCV::PseudoQC_E_J) ? RISCV::QC_E_J : RISCV::QC_E_JAL;
185+ MCInst Jump = MCInstBuilder (Opcode).addExpr (Func.getExpr ());
186+
187+ uint64_t Bits = getBinaryCodeForInstr (Jump, Fixups, STI) & 0xffff'ffff'ffffu ;
188+ SmallVector<char , 8 > Encoding;
189+ support::endian::write (Encoding, Bits, llvm::endianness::little);
190+ assert (Encoding[6 ] == 0 && Encoding[7 ] == 0 &&
191+ " Unexpected encoding for 48-bit instruction" );
192+ Encoding.truncate (6 );
193+ CB.append (Encoding);
194+ }
195+
172196void RISCVMCCodeEmitter::expandTLSDESCCall (const MCInst &MI,
173197 SmallVectorImpl<char > &CB,
174198 SmallVectorImpl<MCFixup> &Fixups,
@@ -440,6 +464,11 @@ void RISCVMCCodeEmitter::encodeInstruction(const MCInst &MI,
440464 expandTLSDESCCall (MI, CB, Fixups, STI);
441465 MCNumEmitted += 1 ;
442466 return ;
467+ case RISCV::PseudoQC_E_J:
468+ case RISCV::PseudoQC_E_JAL:
469+ expandQCJump (MI, CB, Fixups, STI);
470+ MCNumEmitted += 1 ;
471+ return ;
443472 }
444473
445474 switch (Size) {
@@ -656,6 +685,9 @@ uint64_t RISCVMCCodeEmitter::getImmOpValue(const MCInst &MI, unsigned OpNo,
656685 case RISCVMCExpr::VK_QC_ABS20:
657686 FixupKind = RISCV::fixup_riscv_qc_abs20_u;
658687 break ;
688+ case RISCVMCExpr::VK_QC_E_JUMP_PLT:
689+ FixupKind = RISCV::fixup_riscv_qc_e_jump_plt;
690+ break ;
659691 }
660692 } else if (Kind == MCExpr::SymbolRef || Kind == MCExpr::Binary) {
661693 // FIXME: Sub kind binary exprs have chance of underflow.
0 commit comments