RISC-V 的设计目标之一就是为高级语言提供硬件支持,而有了 AUIPC 指令,可以很容易构建相对 PC 的寻址方式,从而实现独立于地址的代码(Position Independent Code,PIC)。如果要将相对于当前地址 0x1234 字节的内容载入 x4 寄存器,则可以通过 AUIPC 指令用如下的代码实现: aupic x4, 0x1 # PC + 0x1000 => x4 ...
我们计算csibe所有obj文件大小的平均值,以此用于Codesize的比较,标准化后的结果如下: RV64 code size的对比: 屏幕截图 2023-03-13 154248 RV32 code size的对比: 在不开压缩指令的情况下,RV64 GCC的代码体积就比LLVM要小2%,RV32要小6%;无论是GCC还是LLVM,C扩展大概可以减少17%的代码体积。gcZce相比于gc优化...
然后该 32 位数会与当前指令计数器(32 位寄存器)的值相加,并将结果存入目标寄存器 (RV32I 也用 PC 来存放当前活跃指令的内存地址)。 RISC-V 的设计目标之一就是为高级语言提供硬件支持,而有了 AUIPC 指令,可以很容易构建相对 PC 的寻址方式,从而实现独立于地址的代码(Position Independent Code,PIC)。如果要将...
LDR x1, [x1, x2, lsl #2] ; x1 ← mem[x1 + x2<<2] 在RISC-V 中,等效的指令需要 3 条不同的指令(# 标记注释): # RISC-V code SLLI x2, x2, 2 # x2 ← x2 << 2 ADD x1, x1, x2 # x1 ← x1 + x2 LW x1, x1, 0 # x1 ← mem[x1 ...
默认情况下面,GCC risc-v 使用的 code model 是medlow,在这种情况下,编译器生成的代码使用lui来构造全局变量的地址。 比如下面这段代码: charx[2u*1024*1024*1024];intmain(){x[0]=42;return0;} riscv64-unknown-elf-gcc main.c --save-temps -O2以后,生成的汇编代码如下: ...
基本的RISC-V基本整数指令子集(字母I表示 )规定的指令长度均为等长的32位,这种等长指令定义使得仅支持整数指令子集的基本RISC-V CPU非常容易设计。但是等长的32位编码指令也会造成代码体积(Code Size)相对较大的问题。 为了满足某些对于代码体积要求较高的场景(譬如嵌入式领域),RISC-V定义了一种可选的压缩(Compresse...
基本的RISC-V基本整数指令子集(字母I表示 )规定的指令长度均为等长的32位,这种等长指令定义使得仅支持整数指令子集的基本RISC-V CPU非常容易设计。但是等长的32位编码指令也会造成代码体积(Code Size)相对较大的问题。 为了满足某些对于代码体积要求较高的场景(譬如嵌入式领域),RISC-V定义了一种可选的压缩(Compresse...
而高级语言的编译器往往很难把这类复杂、多功能机器指令的威力全部发挥出来, 有违当初指令集的设计初衷。 当然,指令集复杂这个特点也并非一无是处。由于 CISC 指令集的指令复杂,也使得其代码密度(Code Density)一般要优于同等字宽的 RISC 处理器。 2)庞大的指令集 庞大的指令集必然导致指令的解码阶段变得更为复杂...
让我更详细地了解一些用于SISD的伪汇编代码(pseudo assembly code)。在这种情况下,我们要添加两个数组,每个数组包含两个元素。每个元素都是32位整数。一个从地址14开始,另一个从地址24开始: load r1,14 load r2,24 add r3,r1,r2; r3←r1 + r2
针对代码密度,RISC-V社区目前也在不断地优化中,比如code-size TG和EABI TG的成立。平头哥也参与其中,在优化代码密度的道路上不断前行。目前,平头哥所做的优化有如下两个方面: Runtime库 平头哥设计开发了一套针对嵌入式领域的、最大化优化代码密度的Lower-Level Runtime Library。目前玄铁E902、玄铁E906和玄铁E907...