You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LLVM中为自定义RISC-V标量指令添加简单Intrinsic

在LLVM中添加简单标量Intrinsic的实现步骤

1. 定义Intrinsic元数据

找到对应目标的Intrinsic表生成文件(如自定义目标的llvm/IR/IntrinsicsYourTarget.td,现有目标如X86则找IntrinsicsX86.td),添加如下定义:

def int_yourtarget_myinstruction : Intrinsic<
  [llvm_i32_ty],          // 返回类型:32位整数
  [llvm_i32_ty, llvm_i32_ty],  // 输入参数:两个32位整数
  [IntrNoMem]             // 标记:不访问内存,无副作用
>;

2. 映射Intrinsic到目标指令

在目标的ISelLowering实现文件(如YourTargetISelLowering.cpp)中,添加Intrinsic到自定义指令的转换逻辑:

case Intrinsic::yourtarget_myinstruction: {
  // 获取Intrinsic的两个输入操作数
  SDValue Src1 = Op.getOperand(1);
  SDValue Src2 = Op.getOperand(2);
  // 生成对应目标指令的SDNode
  return DAG.getNode(YourTarget::MYINSTRUCTION, SDLoc(Op), MVT::i32, Src1, Src2);
}

注:YourTarget::MYINSTRUCTION是你之前添加的自定义指令的枚举值。

3. 实现汇编代码生成

在目标的AsmPrinter文件(如YourTargetAsmPrinter.cpp)中,确保指令能输出符合要求的汇编格式:

void YourTargetAsmPrinter::emitInstruction(const MachineInstr *MI) {
  switch (MI->getOpcode()) {
  case YourTarget::MYINSTRUCTION: {
    const MachineOperand &Dst = MI->getOperand(0);
    const MachineOperand &Src1 = MI->getOperand(1);
    const MachineOperand &Src2 = MI->getOperand(2);
    // 输出指定格式的汇编指令
    OutStreamer->emitRawText(
      "\tmyinstruction " + getRegisterName(Dst.getReg()) + "," +
      getRegisterName(Src1.getReg()) + "," + getRegisterName(Src2.getReg())
    );
    return;
  }
  // 其他指令的处理逻辑...
  }
  AsmPrinter::emitInstruction(MI);
}

4. 暴露Intrinsic给C语言调用

编写C头文件,声明对应的内置函数:

#ifndef MY_INTRINSIC_H
#define MY_INTRINSIC_H

#include <stdint.h>

// LLVM内置函数前缀为__builtin_,对应定义的Intrinsic名称
extern "C" uint32_t __builtin_yourtarget_myinstruction(uint32_t src1, uint32_t src2);

#endif

5. 测试验证

编写测试C代码:

#include "my_intrinsic.h"

int main() {
  int b = 10, c = 20;
  int a = __builtin_yourtarget_myinstruction(b, c);
  return a;
}

用目标交叉编译链编译后,通过反汇编工具(如llvm-objdump)查看输出,确认生成了myinstruction a0,a1,a2格式的汇编指令。

内容的提问来源于stack exchange,提问作者Vadim Kustov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:54:53