龙芯开源社区

 找回密码
 注册新用户(newuser)
查看: 6720|回复: 71

公开本人另一项发明专利:立即数扩展的方法

  [复制链接]
发表于 2016-4-18 23:52:35 | 显示全部楼层 |阅读模式
      RISC指令可以携带的立即数一般都不大,比如ARM的数据运算指令携带的立即数最大是12位,而MIPS指令系统的数据运算指令携带的立即数最大是16位,要这些RISC指令系统携带32位的立即数是不可能的,因为其指令长度只有32位,所以在RISC指令系统中要取得32位立即数就费不少周折了,目前常用的方法有两种:第一种是分段读取法,具体是先后分别读取低16位的立即数和高16位的立即数,从而组成32位立即数,为了支持这种分段读取法,几乎所有的RISC指令系统都是专门制定了相应的指令,比如ARM的MOVW和MOVT指令、MIPS的LUI和ADDIU指令;第二种是访存法,具体是把32位立即数当做常数放在离当前PC值不太远的地方,然后使用一条与PC相关的访存指令读取它。但是不管使用哪种读取方法,要获取一个32位的立即数都是费时,怎么都要花2个周期才能完成。
比如要处理表达式:R2=R3&0x87654321,当前ARM的做法是:
     使用分段读取法的是:
         MOVW   R1,#4321H;(取得低16位常数,要花1个周期时间)
         MOVT    R1,#8765H;(取得高16位常数,要花1个周期时间)
         AND    R2,R3,R1;
     使用访存法的是:
LDR   R1, [PC,  #offest];(这条指令要花2个周期时间)
         AND   R2,R3,R1;
由此可见,ARM处理R2=R3&0x87654321共需要花3个周期时间,其中获取32位常数0x87654321需要花2个周期时间。
为了解决现有的RISC指令系统获取大立即数执行效率低下的不足,又要维持RISC指令系统精简、统一长度的优点,本人提出了一种将计算机指令中立即数扩展的专利方法,其方法是:在RISC指令系统中至少新增一条立即数扩展指令,该指令包含有操作码和立即数域,具体应用是将一个大的立即数分成两段,一段是高位立即数,另一段是低位立即数,将高位立即数经过有符号或无符号扩展后装入该立即数扩展指令的立即数域,而将低位立即数要刚好装满执行指令的立即数域,并且规定该立即数扩展指令要前缀于携带该低位立即数的执行指令,中间不能插入别的指令。在取指令时,取指令电路将该立即数扩展指令和紧随其后的执行指令同步送入它们各自的译码器进行译码,立即数扩展指令译码器输出高位立即数经过逻辑左移位后再和执行指令译码器输出的低位立即数进行合并,合并结果输出的立即数再经过有符号数或无符号数扩展后还原为原来的大的立即数。该立即数扩展指令是一条非执行指令,它到译码这一阶段就终结了,它不需要经历执行、回写的阶段。具体内容见本人的专利资料详细说明(专利号:201512153746.1,专利名:一种将计算机指令中立即数扩展的方法和装置)。
通过使用本发明的方法,同样要处理上述的表达式:R2=R3&0x87654321,其做法是:
        HIMM   #8765h;         (这是新增的立即数扩展指令,其携带高位立即数#8765h)
        AND    R2, R3,  #4321h;(执行指令携带低16位立即数#4321h)
如果取指令电路工作于单倍速取指令模式(即程序存贮器每次只能在其接口总线上输出1条指令),则处理R2=R3&0x87654321共需要花2个周期时间,其中立即数扩展指令(HIMM  #8765h)需要延迟 1条指令的时间,以等待紧随其后的执行指令(AND   R2, R3,  #4321h)的到来,才能同步译码。
如果取指令电路工作于双倍速取指令模式(即程序存贮器每次都能在其接口总线上输出2条指令),则处理R2=R3&0x87654321仅需要花1个周期时间,此时立即数扩展指令(HIMM    #8765h)不需要任何延迟就可以和紧随其后的执行指令(AND   R2, R3,  #4321h)同步译码,所以它不花任何时间!
对比ARM和本发明的做法可以看出,使用本发明的方法可以极大改善RISC指令集计算机执行程序的效率,既节省时间又节省空间。
      这项发明专利将对RISC指令集产生重大影响:即RISC指令可以由基础指令和转意指令组成。这是新的概念,绝对颠覆你的世界观。以后再来逐步介绍。
 楼主| 发表于 2017-12-24 16:02:39 | 显示全部楼层
取消计算前导1指令CLO,增加按位反转指令RBIT。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-12-21 18:43:23 | 显示全部楼层
本帖最后由 吾要单片机 于 2017-12-23 19:49 编辑

硬件中断时自动保存LR、PSR。
回复 支持 1 反对 0

使用道具 举报

发表于 2016-4-19 10:01:24 | 显示全部楼层
捐给龙芯吧,或者说中科大的ARM,能用上对你才是最大的鼓励。
 楼主| 发表于 2016-4-19 20:02:41 | 显示全部楼层
本专利资料附图。其中图3是单倍速取指模式,图4是双倍速取指令模式。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册新用户(newuser)

x
 楼主| 发表于 2016-4-19 20:33:51 | 显示全部楼层
本帖最后由 吾要单片机 于 2016-4-22 00:39 编辑

上面有说到这项发明将对指令集产生重要影响,它不单是为紧随其后的执行指令提供高位立即数,而且也向执行指令提供其他的译码信息。比如执行指令AND<cond>   Rd, Rn, Rj, [E]jmp  #v_6,如果前缀了立即数扩展指令:
HIMM   #imm27
AND<cond>   Rd, Rn, Rj, [E]jmp  #v_6
这时指令AND <cond>  Rd, Rn, Rj, [E]jmp  #v_6中操作数Rj的索引值j变为低5位立即数#imm5。因此这两条指令转意为:
HIMM   #imm27
AND<cond>   Rd, Rn, #imm5, [E]jmp  #v_6
其等效于:
AND<cond>   Rd, Rn, #imm32, [E]jmp  #v_6

 楼主| 发表于 2016-4-19 22:37:52 | 显示全部楼层
上面所说的转意指的是改变执行指令操作数的属性,操作码所定义的执行操作没有变。这一方法对16位指令集非常有用,本人在我的16位指令集中定义了4条立即数扩展指令,它们是:
HIMM   #imm28                                                /*指令长32bits*/
MIMM   #imm12                                                /*指令长16bits*/
HIMMJ      #imm12   <cond>  , [E]jmp  #v_11      /*指令长32bits*/
MIMMJ     <cond>  , [E]jmp  #v_7                       /*指令长16bits*/
其中:
      32位指令HIMM   #imm28 为紧随其后的16位执行指令提供高28bits的立即数,而32位指令HIMMJ      #imm12   <cond>  , [E]jmp  #v_11为紧随其后的16位执行指令提供高12bits的立即数、执行条件码cond、反条件码E以及11位的跳转矢量。
      16位指令MIMM   #imm12 为紧随其后的16位执行指令提供高12bits的立即数,而16位指令MIMMJ      <cond>  , [E]jmp  #v_7为紧随其后的16位执行指令提供执行条件码cond、反条件码E以及7位的跳转矢量。
      在32位指令集中,本人只定义一条32位的立即数扩展指令:HIMM   #imm27,它为紧随其后的32位执行指令提供高27bits的立即数。
发表于 2016-4-20 08:00:19 | 显示全部楼层
有个道理叫做,说起来容易,你做给我看看(或者说实践是检验真理的唯一标准)。

Linus Torvalds说:Talk is cheap, Show me the code.

楼主,我给你出三道作业题:

1.写一个指令集级别的模拟器。
2.写一个模拟到时钟级别(Cycle Accurate Simulator)的模拟器。
3.写一个能在FPGA上跑的CPU。(用HDL)
HDL是硬件描述语言,比如VHDL或Verilog
发表于 2016-4-20 12:31:33 | 显示全部楼层
如果我没有弄错,你所说的这项发明龙芯3某些型号的CPU早已在实际应用了。
 楼主| 发表于 2016-4-22 00:39:05 | 显示全部楼层
龙芯有立即数扩展指令?在哪里啊?
 楼主| 发表于 2016-4-22 00:43:57 | 显示全部楼层
cb001 发表于 2016-4-20 08:00
有个道理叫做,说起来容易,你做给我看看(或者说实践是检验真理的唯一标准)。

Linus Torvalds说:Talk ...

哈哈,超级版主,你留的作业太多了,目前正在做第三道题,要不你把第一、二道题做一遍,让大家瞧瞧。
发表于 2016-4-22 09:08:21 | 显示全部楼层
吾要单片机 发表于 2016-4-22 00:43
哈哈,超级版主,你留的作业太多了,目前正在做第三道题,要不你把第一、二道题做一遍,让大家瞧瞧。

我为什么要出三道作业,是为了说明弄个玩具CPU与工程化的CPU的区别。
先等你第三个作业做完,我就把你的CPU的两个模拟器写出来。

本版积分规则

小黑屋|手机版|Archiver|Lemote Inc.  

GMT+8, 2019-1-23 22:11 , Processed in 0.204217 second(s), 19 queries .

快速回复 返回顶部 返回列表