Risc-V支持16位压缩格式,压缩格式立即数位数更少,能使用的寄存器也比较少,有些指令只能用常用8个整数寄存器(x8-x15)或者(f8-f15)。

每个RVC指令都有对应的32位指令,下表列出所有的RV32C指令。

指令分组 Fmt 16位指令 对应32位指令 机器码
stack-point based loads and
stores,这些指令可以使用所有的通用寄存器作为操作数
  c.lwsp rd, offset[7:2] lw rd, offset[7:2](x2) 010[12,uimm[5]][11-7,rd!=0][6-2,uimm[4:2|7:6]10
  c.flwsp rd, offset[7:2] flw rd, offset[7:2](x2) 011[12,uimm[5]][11-7,rd][6-2,uimm[4:2|7:6]10
  c.fldsp rd, offset[8:3] fld rd, offset[8:3](x2) 001[12,uimm[5]][11-7,rd][6-2,uimm[4:3|8:6]10
  c.swsp rd, offset[7:2] sw rs2, offset[7:2](x2) 110[12-7,uimm[5:2][7:6]][6-2,rs2]10
  c.fswsp rd, offset[7:2] fsw rs2, offset[7:2](x2) 111[12-7,uimm[5:2][7:6]][6-2,rs2]10
  c.fsdsp rd, offset[8:3] fsd rs2, offset[8:3](x2) 101[12-7,uimm[5:3][8:6]][6-2,rs2]10
register-based loads and
stores,此指令只能使用常用的8个寄存器作为操作数,其中c.flw/c.fld的rd和c.fsw/c.fsd
的rs2位通用浮点寄存器
  c.lw rd, offset[6:2](rs1) lw rd, offset[6:2](rs1) 010[12-10,uimm[5:3]][9-7,rs1'][6-5,uimm[2|6]][4-2,rd']00
  c.flw rd, offset[6:2](rs1) flw rd, offset[6:2](rs1) 011[12-10,uimm[5:3]][9-7,rs1'][6-5,uimm[2|6]][4-2,rd']00
  c.fld rd, offset[7:3](rs1) fld rd, offset[7:3](rs1) 001[12-10,uimm[5:3]][9-7,rs1'][6-5,uimm[7:6]][4-2,rd']00
  c.sw rs2, offset[6:2](rs1) sw rs2, offset[6:2](rs1) 110[12-10,uimm[5:3]][9-7,rs1'][6-5,uimm[2|6]][4-2,rd']00
  c.fsw rs2, offset[6:2](rs1) fsw rs2, offset[6:2](rs1) 111[12-10,uimm[5:3]][9-7,rs1'][6-5,uimm[2|6]][4-2,rd']00
  c.fsd rs2, offset[7:3](rs1) fsd rs2, offset[7:3](rs1) 101[12-10,uimm[5:3]][9-7,rs1'][6-5,uimm[7:6]][4-2,rd']00
control transfer
instruction
  c.j offset[11:1] jal x0,offset[11:1] 101[12-2,imm[11|4|9:8|10|6|7|3:1|5]01
  c.jal offset[11:1] jal x1,offset[11:1] 001[imm[11]4|9:8|10|6|7|3:1|5]01
可以使用所有通用寄存器作为操作数 c.jr rs1 jalr x0, rs1, 0 1000[11-7,rs1!=0]0000010
c.jalr rs1 jalr x1,rs1,0 1001[11-7,rs1!=0]0000010
只能使用8个最为常用的通用寄存器作为操作数 c.beqz rs1 offset[8:1] beq rs1, x0, offset[8:1] 110[12-10,imm[8:4:3][9-7,rs1'][6-2,imm[7:6|2:1|5]01
c.bnez rs1 offset[8:1] bne rs1, x0, offset[8:1] 111[12-10,imm[8:4:3][9-7,rs1'][6-2,imm[7:6|2:1|5]01
整数计算指令 可以使用所有通用寄存器作为操作数 c.li rd, imm[5:0] addi rd, x0, imm[5:0] 010[12,imm[5]][11-7,rd!=0][6-2,imm[4:0]]01
c.lui rd, nzuimm[17:12] lui rd, nzuimm[17:12] 011[12,imm[17]][11-7,rd!=0,2][6-2,nzimm[16:12]]01
c.addi rd, nzimm[5:0] addi rd, rd, nzimm[5:0] ’000[12,nzimm[5]][11-7,rs1/rd!=0][6-2,
nzimm[4:0]]01
  c.addi16sp nzimm[9:4] addi x2, x2, nzimm[9:4] ’011[12,nzimm[9]][11-7,2][6-2,
nzimm[4|6|8:7|5]]01
只能使用8个最为常用的通用寄存器作为操作数 c.addi4spn rd, nzuimm[9:2] addi rd, x2, nzuimm[9:2] 000[12-5,nzuimm[5:4|9:6|2|3][4-2,rd']00
可以使用所有通用寄存器作为操作数 c.slli rd, shamt[5:0] slli rd, rd, shamt[5:0] 000[12,nxuimm[5]][11-7,rs1/rd!=0][6-2,nzuimm[4:0]]10
只能使用8个最为常用的通用寄存器作为操作数 c.srli rd,rd, shamt[5:0] srli rd, rd,shamt[5:0] ’100[12,nzimm[5]]00[9-7,rs'/rd'][6-2,
nzimm[4:0]]01
c.srai rd,shamt[5:0] srai rd, rd,shamt[5:0] ’100[12,nzimm[5]]01[9-7,rs'/rd'][6-2,
nzimm[4:0]]01
c.andi rd, imm[5:0] andi rd, rd,shamt[5:0] ’100[12,nzimm[5]]10[9-7,rs'/rd'][6-2,
nzimm[4:0]]01
可以使用所有通用寄存器作为操作数 c.mv rd rs2 add rd, x0, rs2 1000[11-7,rd!=0][6-2,rs2!=0]10
c.add rd rs2 add rd, rd, rs2 1001[11-7,rs1/rd!=0][6-2,rs2!=0]10
只能使用8个最为常用的通用寄存器作为操作数 c.and rd rs2 and rd, rd, rs2 100011[9-7,rs1'/rd']11[4-2,rs2']01
c.or rd rs2 or rd, rd, rs2 100011[9-7,rs1'/rd']10[4-2,rs2']01
c.xor rd rs2 xor rd, rd, rs2 100011[9-7,rs1'/rd']01[4-2,rs2']01
c.sub rd rs2 sub rd, rd, rs2 100011[9-7,rs1'/rd']00[4-2,rs2']01
NOP指令 和32位对应的一样 c.nop add x0, x0, 0 ‘0000000000000001
断点指令   c.ebreak ebreak 1001000000000010

RV32C指令集的更多相关文章

  1. Risc-V指令集

    https://riscv.org/specifications/ Risc-V文档包括:用户层指令集文档和特权架构文档,下面这两个文件的官网链接. User-Level ISA Specificat ...

  2. SSE指令集学习:Compiler Intrinsic

    大多数的函数是在库中,Intrinsic Function却内嵌在编译器中(built in to the compiler). 1. Intrinsic Function Intrinsic Fun ...

  3. ARM-汇编指令集(总结)

    ARM汇编指令集 指令.伪指令 (汇编)指令:   是机器码的助记符,经过汇编器编译后,由CPU执行. (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码. 有两种不同风格的ARM指 ...

  4. iOS------苹果设备处理器指令集(iPhone初代到iPhone5s)

    (via 雅香小筑) Arm处理器,因为其低功耗和小尺寸而闻名,几乎所有的手机处理器都基于arm,其在嵌入式系统中的应用非常广泛,它的性能在同等功耗产品中也很出色. Armv6.armv7.armv7 ...

  5. SSE指令集优化学习:双线性插值

    对SSE的学习总算迈出了第一步,用2天时间对双线性插值的代码进行了优化,现将实现的过程梳理以下,算是对这段学习的一个总结. 1. 什么是SSE 说到SSE,首先要弄清楚的一个概念是SIMD(单指令多数 ...

  6. RISC指令集的五个周期

    RISC指令集的五个周期 RISC(reduced instruction set computer,精简指令集计算机)简称为精简指令集.RISC把执行指令的精力主要放在了经常使用的指令上面.本文主要 ...

  7. x86指令集同频性能提升

    x86近5000条指令,迄今为止最复杂的指令集.这里不研究CISC & RISC,也不考虑process制程变化,主要是看最近几代IA架构对于同频率下性能的提升. x86指令集nasm文档 h ...

  8. CPU指令集

    cpu作为一台电脑中的核心,它的作用是无法替代的.而cpu本身只是在块硅晶片上所集成的超大规模的集成电路,集成的晶体管数量可达到上亿个,是由非常先进复杂的制造工艺制造出来的,拥有相当高的科技含量. C ...

  9. 在UWP应用中加入Cortana语音指令集

    本文介绍小娜语音指令集的使用场景,如何将UWP应用接入小娜的语音指令集,使用户直接通过小娜启动应用并使用应用中 一些轻量级的功能.文中以必应词典作为实例讲解必应词典UWP版本是如何接入小娜语音功能的. ...

随机推荐

  1. pip 安装包提速

    豆瓣源 pip3 install 第三方库名 -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com

  2. LruCacahe在美团DSP系统中的应用演进

    背景 DSP系统是互联网广告需求方平台,用于承接媒体流量,投放广告.业务特点是并发度高,平均响应低(百毫秒). 为了能够有效提高DSP系统的性能,美团平台引入了一种带有清退机制的缓存结构LruCach ...

  3. android 手机不能断点

    一个安卓平板 型号 联想 .. ,用andriod studio 打断点 调试, 应用 就卡死2秒,然后就挂掉了.  不知如何解决.

  4. Android Data Binding

    Android官方数据绑定框架DataBinding, 1.什么是DataBinding 2.DataBinding基础用法 3.DataBinding原理 4.表达式 5.null检查 6.incl ...

  5. BZOJ 3621: 我想那还真是令人高兴啊 计算几何 复数

    https://www.lydsy.com/JudgeOnline/problem.php?id=3621 给定两个三角形,其中一个可以通过以某点为中心旋转并放缩的方式得到另一个,求这个中心 http ...

  6. [POJ1655]Balancing Act

    思路:DP求树的重心.对于每个结点$i$,$d_i=\displaystyle{\sum_{j\in s(i)}}d_j+1$.删去这个点能得到的最大子树大小即为$\max(\max\limits_{ ...

  7. hdu 4417 区间内比h小的数 划分树

    二分查找最近一个比h小的数 #include<cstdio> #include<iostream> #include<algorithm> #include< ...

  8. stm32f103串口实现映射功能

    在实际开发中,常常遇到串口的默认输出IO口被其它模块占用了,所以我们要用到串口IO口映射功能.是指将原来实现功能的IO口映射到其它指定IO口,其它不变.详细操作例如以下: 先贴出默认下的串口初始化设置 ...

  9. 正余弦信号的DFT频谱分析

    一般的,对正余弦信号进行採样并DFT运算,画出频谱图,会发现频谱并不干净.这样的现象称为频谱泄漏.由于DFT运算仅仅能是有限序列,突然的截断产生了泄漏. 会有这种特殊情况.当採样截取的刚好是整数个周期 ...

  10. 关于STM32 SPI NSS的讨论

    NSS分为内部引脚和外部引脚. NSS外部引脚可以作为输入信号或者输出信号, 输入信号一般用作硬件方式从机的片选, 而输出信号一般用于主SPI去片选与之相连的从SPI. NSS从设备选择有两种模式: ...