RISC-V技术论坛
直播中

lalajie

9年用户 1279经验值
擅长:模拟技术 存储技术
私信 关注
[经验]

C内联汇编nice指令解读

一、指令基本结构


支持类型:只支持R型
[tr]Nameopcodetype[/tr]
CUSTOM07'h0bR type
CUSTOM17'h2bR tpye
CUSTOM27'h5bR type
CUSTOM37'h7bR type
1.costom3 lbuf(a1): 加载内存中的数据至row_buf :

​ .insn r opcode,func3,func7,rd,rs1,rs2
2.costom3 sbuf(a1): 保存数据row_buf的数据至内存:
​ .insn r opcode,func3,func7,rd,rs1,rs2
3.costom3 acc rowsum: 加载a1地址的数据,累加row 数据并写回:
rowsum rd,a1,x0

​ .insn r opcode,func3,func7,rd,rs1,rs2



二、示例分析




1.custom_lbuf

".insn r 0x7b, 2, 1, x0, %1, x0"
:"=r"(zero)
:"r"(addr)


  • 字母“r”表示使用编译器自动分配的寄存器来存储该操作数变量;字母“m” 表示使用内存地址来存储该操作数变量。如果同时指明“rm”,则编译器自动选择最优方案。。
  • 对于“输出操作数”而言,等号“=”代表输出变量用作输出,原来的值会被新值替换;“+”代表输出变量不仅作为输出,而且作为输入。

[tr]opcodefunc3func7rdrs1rs2[/tr]
0x7b21x0%1x0
custom3只读取rs1的数据第一种操作零寄存器保存addr地址零寄存器
11110110100000001000000101000000


机器码:
[tr]funct7rs2rs1funct3rdopcode[/tr]
00000010000001010010000001111011

把addr的地址加载到源寄存器1,编译器会自动分配rs1用哪一个寄存器(这里是x10),执行lbuf操作,将数据导入nice_core。
2.custom_sbuf

".insn r 0x7b, 2, 2, x0, %1, x0"
:"=r"(zero)
:"r"(addr)
[tr]opcodefunc3func7rdrs1rs2[/tr]
0x7b22x0%1x0
custom3只读取rs1的数据第二种操作零寄存器保存addr地址零寄存器
11110110100000010000000101000000
机器码:
[tr]funct7rs2rs1funct3rdopcode[/tr]
00000100000001010010000001111011

把addr的地址加载到源寄存器1,编译器会自动分配rs1用哪一个寄存器(这里是x10),执行sbuf操作,将nice_core的数据导出addr。
3.custom_rowsum

".insn r 0x7b, 6, 6, %0, %1, x0"
:"=r"(rowsum)
:"r"(addr)
[tr]opcodefunc3func7rdrs1rs2[/tr]
0x7b66%0%1x0
custom3读取rs1、rd的数据第六种操作rowsum地址保存addr地址零寄存器
11110111100000110010110101000000
机器码:
[tr]funct7rs2rs1funct3rdopcode[/tr]
00001100000001010110010111111011
把addr、rd的地址加载到读源寄存器1,写目标寄存器rd,编译器会自动分配rs1,rd用哪一个寄存器(这里是x10、x11),执行sumrow操作。



riscv 寄存器编号:





更多回帖

发帖
×
20
完善资料,
赚取积分