打印
[国产单片机]

《酷能指令集》及相关专利技术

[复制链接]
楼主: 吾要单片机
手机看帖
扫描二维码
随时随地手机跟帖
101
airwill| | 2017-12-21 19:28 | 只看该作者 回帖奖励 |倒序浏览
吾要单片机 发表于 2017-12-21 18:34
你的建议很好,现在中断响应时,硬件自动保存的寄存器是:LR,R1,PSR,R2、R3、R4、R5。其中R1是指令UMA ...

保护寄存器, 涉及函数调用时可以最多传递多少参数.  可以考虑扩展到 R7;
AVR 不刷流水线的跳转, 其实是仅跳过一条指令(随后一条指令照样译码, 但不执行),
你的5级流水线, 也许还可扩展到 SKIP 2条3条指令. 反正比打断流水线要快些

使用特权

评论回复
102
wswh2o| | 2017-12-21 21:41 | 只看该作者
做出来的核应该放一楼让大家看看啊。

使用特权

评论回复
103
0零妖1| | 2017-12-23 09:56 | 只看该作者
顶!!支持搞这个。期待商用版本的。

使用特权

评论回复
104
吾要单片机|  楼主 | 2017-12-23 20:06 | 只看该作者
本帖最后由 吾要单片机 于 2017-12-23 20:08 编辑
airwill 发表于 2017-12-21 19:28
保护寄存器, 涉及函数调用时可以最多传递多少参数.  可以考虑扩展到 R7;
AVR 不刷流水线的跳转, 其实是 ...

更正:中断响应时(含软件中断)系统自动保存的寄存器是PSR、LR。通用寄存器由用户自行保存。

使用特权

评论回复
105
吾要单片机|  楼主 | 2017-12-23 20:09 | 只看该作者
更正除法指令执行周期数:T=4~16周期,以减小电路规模。

使用特权

评论回复
106
airwill| | 2017-12-23 22:24 | 只看该作者
本帖最后由 airwill 于 2017-12-23 22:25 编辑

中断响应时(含软件中断)系统自动保存的寄存器是PSR、LR。
又将使用 interrupt 关键词了


中断响应时(含软件中断)系统自动保存的寄存器是PSR、LR。通用寄存器由用户自行保存。
这将又要使用 interrupt 关键词了, 给编译器增加麻烦

前导1计算好象没有必要, 因为通过取反加前导0, 就能实现
倒是按位反转和按字节反转, 还是挺有用的指令, 软件实现也挺麻烦



























使用特权

评论回复
107
吾要单片机|  楼主 | 2017-12-23 22:58 | 只看该作者
airwill 发表于 2017-12-23 22:24
中断响应时(含软件中断)系统自动保存的寄存器是PSR、LR。
又将使用 interrupt 关键词了

非常感谢你的提醒,计算前导1指令的确是多余,实际上它和计算前导0是同一个电路的,所以没有必要让它占用一个宝贵的编码位置,取消它吧;软件处理位反转的确很难办,字节反转软件还好处理,位反转一般用在哪里呢?是不是用在通讯领域?

使用特权

评论回复
108
airwill| | 2017-12-24 07:24 | 只看该作者
位反转的需求, 求后导0可以反转后求前导0 来实现.  另外在串行通信里的位序变换(高位先发还是低位先发)

使用特权

评论回复
109
吾要单片机|  楼主 | 2017-12-24 23:29 | 只看该作者
airwill 发表于 2017-12-24 07:24
位反转的需求, 求后导0可以反转后求前导0 来实现.  另外在串行通信里的位序变换(高位先发还是低位先发) ...

高手!
指令集已经更新。

使用特权

评论回复
110
广东梁百万| | 2017-12-25 15:46 | 只看该作者
51单片机有几条指令基本是没用到的,如ajmp,acall,   如果能变成dec dptr,即dptr指针减1,那就好很多了

使用特权

评论回复
111
airwill| | 2017-12-25 19:21 | 只看该作者
你的 R0,R1 被特别功能占用, 好象也很大的浪费了编码资源.
能否把计算结果的特定寄存器放一个专用的寄存器 (如 PSW) 那样专用.
0值寄存器更为不必要.

使用特权

评论回复
112
吾要单片机|  楼主 | 2017-12-25 23:23 | 只看该作者
本帖最后由 吾要单片机 于 2017-12-26 10:51 编辑
airwill 发表于 2017-12-25 19:21
你的 R0,R1 被特别功能占用, 好象也很大的浪费了编码资源.
能否把计算结果的特定寄存器放一个专用的寄存器  ...

R0作为零寄存器好处很多,最常用是位段清零、寄存器变量清零、绝对地址变量访问,进行这些操作时可以减少代码量。
现在R1是指令UMAC的目标寄存器,UMAC指令主要用于计算多维数组的指针,UMAC指令能够显著提高计算多维数组的指针的效能。
举例:有个二维数组int  a[30][20],如果想要访问a[x][y]单元,先转化为一维数组a[k],k=x*20 + y。而计算表达式(k=x*20 + y)就是由1条UMAC指令完成(UMAC  Ry, Rx, #20),耗时为1个周期,这时R1就是k,一步到位,因为R1是通用寄存器,所以可以直接使用LD/STR  Rd,  [Ra, R1]访问了。如果使用ARM或MIPS指令,光计算表达式(k=x*20 + y)就要用3条指令才能完成(耗时为3个周期):首先取得立即数#20,第二步相乘,第三步再相加。

使用特权

评论回复
113
吾要单片机|  楼主 | 2017-12-25 23:41 | 只看该作者
本帖最后由 吾要单片机 于 2017-12-26 10:49 编辑

需要说明的是:UMAC指令只能处理多维数组转化为二维数组后、每维长度小于64K的场合。这是因为UMAC指令的乘积项是16位*16位。

使用特权

评论回复
114
airwill| | 2017-12-26 22:34 | 只看该作者
哦, 看明白这个 UMAC 了, 但是不明白为何 结果指针 要放 R1, 而不能是另外一个通用寄存器.
R0作为零寄存器好处很多,但  MOV  R0,#0 这条指令一个周期也很快啊

使用特权

评论回复
115
吾要单片机|  楼主 | 2018-1-8 11:28 | 只看该作者
乘法指令执行周期有更新。

使用特权

评论回复
116
吾要单片机|  楼主 | 2018-2-4 16:59 | 只看该作者
本帖最后由 吾要单片机 于 2018-2-4 17:54 编辑

指令集有更新:1、取消布尔指令BITA、BITO、BITX、BITN、ZMB,现在发现布尔指令意义不大,所以决定删除。
2、增加变指针访存指令,以直接支持C语言*p++,*p--,*++p,*--p,它们是:
在32位指令集中,其指令是:
ULD.type<cond>    Rd, [Rn+], #imm1, [E]JMP #v6
SLD.type<cond>    Rd, [Rn+], #imm1, [E]JMP #v6
STR.type<cond>   Rd, [Rn+], #imm1, [E]JMP #v6
ULD.type<cond>    Rd, [+Rn], #imm1, [E]JMP #v6
SLD.type<cond>    Rd, [+Rn], #imm1, [E]JMP #v6
STR.type<cond>   Rd, [+Rn], #imm1, [E]JMP #v6
在16位指令集中,其指令是:
ULD.type  Ra, [Rb+], #imm1
SLD.type  Ra, [Rb+], #imm1
STR.type  Ra, [Rb+], #imm1
ULD.type  Ra, [+Rb], #imm1
SLD.type  Ra, [+Rb], #imm1
STR.type  Ra, [+Rb], #imm1
其中:type表示字长(即byte / half / word), #imm1∈(-1, 1).



使用特权

评论回复
117
吾要单片机|  楼主 | 2018-2-4 17:11 | 只看该作者
airwill 发表于 2017-12-26 22:34
哦, 看明白这个 UMAC 了, 但是不明白为何 结果指针 要放 R1, 而不能是另外一个通用寄存器.
R0作为零寄存器 ...

UMAC指令的目的寄存器可以是其他的寄存器的,目前我暂时是安排在R1,
R0作为零寄存器主要用途是:1、可以作为算术/逻辑运算的目的寄存器,只是更新PSR的标志位。
2、快速获得零值作为源操作数,虽然本指令集架构已经可以实现立即数作为算术/逻辑运算的源操作数了,但是它需要用立即数前缀指令WIMM/HIMM,这样等效的指令长度会变长,不够紧凑。

使用特权

评论回复
118
吾要单片机|  楼主 | 2018-3-10 11:46 | 只看该作者
有改动:
      为了减小译码器的电路规模,本指令系统规定:16位指令集只用于MCU领域,而32位指令集只用于通用的CPU领域,处理器不再同时支持两套指令集。

使用特权

评论回复
119
吾要单片机|  楼主 | 2018-4-27 16:37 | 只看该作者
本帖最后由 吾要单片机 于 2018-5-15 16:19 编辑

f经过多次修改后终于把该指令集固定下来了:
指令集有改正。

使用特权

评论回复
120
吾要单片机|  楼主 | 2018-5-15 16:20 | 只看该作者
本帖最后由 吾要单片机 于 2018-11-4 11:22 编辑

指令集又有改进,主要有:
本指令集特有高效的CALL和RET指令(里面包含有对LR和FP的出入栈操作),可以大幅度简化调用子程序的操作,再配上独特的双向栈段结构,可以显著提高调用子程序的处理速度。
本帖最后由 吾要单片机 于 2018-5-15 21:47 编辑


七、 独特的栈段结构


栈段是用于保存寄存器数据和子程序自动变量数据的内存空间。当前主流CPU的栈段结构如图1所示,从图1中可看出在栈段(STACK)内,寄存器数据区和子程序自动变量数据区是混合在一起,并且寄存器数据区栈指针(SP)和子程序自动变量数据区栈帧指针(FP)都是从高地址向低地址方向增长,在此本人将这种栈段结构称为单向栈段结构。本酷能指令集架构所使用的栈段结构有别于当前主流CPU的栈段结构,其栈段结构如图2所示。从图2中可看出在该栈段(STACK)内,寄存器数据区和子程序自动变量数据区是完全分开的,寄存器数据区保存在高地址区域,而子程序自动变量数据区保存在低地址区域,寄存器数据区栈指针(SP)的增长方向是从高地址向低地址,而子程序自动变量数据区栈帧指针(FP)的增长方向是从低地址向高地址,在此本人将这种栈段结构称为双向栈段结构。





由于两者的栈段结构有不同,所以程序对栈段操作也是有所不同,主要有3个不同点:

1、FP对齐不同:

对于图1(当前主流CPU所使用的单向栈段结构)来说,FP总是和SP一样,都是与寄存器字长对齐,而对于图2(本指令集架构所使用的双向栈段结构)来说, SP是与寄存器字长对齐,而FP对齐于子程序第一个自动变量的数据类型(字节,半字,字,双字),与静态数据段存储的方式相同,存储更密集。

2、对SP、FP操作不同:

在图1(当前主流CPU所使用的单向栈段结构)中,由于寄存器数据区和子程序自动变量数据区是混合在一起,所以子程序func1对SP和FP的操作有:

对于ARM32来说(5级流水线),其操作有:

  func1:

           mov ip, sp; 保存栈指针,耗时为1T

           stmfd  sp!, {fp, ip, lr, pc};把fp, ip,lr, pc依次压栈,耗时为4T

           sub  fp, ip, #4;产生新的栈帧指针,耗时为1T

           sub  sp, sp, #16;开辟新的自动变量数据区,耗时为1T

           ......

           ldmdbfp, {fp, ip, pc};恢复fp、 ip、 pc,回到调用着的状态,耗时为4T

       ......


从ARM的这5条指令可以算出子程序对SP和FP操作的耗时为11T(周期),其代码长度为20Byte。

对于MIPS32来说(5级流水线),其操作有:

  func1:

           addi  sp, sp, -32;开辟新的自动变量数据区,耗时为1T

           sw    ra, 28(sp);保存ra,耗时为1T

           sw    s8, 24(sp);保存fp,耗时为1T

           move s8, sp;产生新的栈帧指针fp,耗时为1T

           ......

           lw    ra, 28(sp);恢复ra,耗时为1T

           lw    s8, 24(sp);恢复fp,耗时为1T

           jr    ra;子程序返回,恢复pc,耗时为2T

       addi sp, sp, 32;恢复sp,延时槽

       ......


从MIPS的这8条指令可以算出子程序对SP和FP操作的耗时为8T(周期),其代码长度为32Byte。

对于X86来说,其操作有:

  func1:

         push        ebp;耗时为1T

         mov         ebp,esp;耗时为1T

         sub         esp,40h;耗时为1T

         ......

         mov         esp,ebp;耗时为1T

         pop         ebp;耗时为1T

         ret;耗时为2T

         ......


从X86的这6条指令可以算出子程序对ESP和EBP操作的耗时为7T(周期),其代码长度为10Byte。


在图2(酷能指令集所使用的双向栈段结构)中,由于寄存器数据区和子程序自动变量数据区是完全分开的,所以子程序func1对SP和FP的操作有(使用酷能指令集):

  func1:

       add  fp, #24; 产生新的栈帧指针,耗时为1T

         ......

       ret;恢复sp、pc、lr、fp,回到调用者的状态,耗时为2T

       ......


从这2条指令可以看出,子程序不需要再用指令单独对SP进行操作,所以简化了进入/退出子程序的操作,其耗时为3T(周期),比图1(当前主流CPU的单向栈段结构)的ARM、MIPS和X86的操作快多了。当使用本32位指令集时,其代码长度为8Byte;而当使用本16位指令集时,其代码长度为6Byte,真是短小精悍的典范!

三种指令集调用子程序的情况对比表

  

指令集

  
  

ARM32

  
  

MIPS32

  
  

X86

  
  

酷能32

  
  

酷能16

  
  

代码长度(Byte)

  
  

20

  
  

32

  
  

10

  
  

8

  
  

6

  
  

总耗时(周期)

  
  

11

  
  

8

  
  

7

  
  

3

  
  

3

  


从上表可以看出本酷能指令集具有先进性和创新性。

3、对子程序的自动变量寻址不同:

在图1中,对子程序的自动变量寻址的偏移量都是负整数,而在图2中,对子程序的自动变量寻址的偏移量是正整数,这和静态数据段(DATA)变量寻址的偏移量相同。


从上面比较分析结果看出,使用图2(本指令集架构所使用的双向栈段结构)的结构具有操作简单的优点,主要原因是子程序自动变量数据区没有插入寄存器数据,从而使得计算fp变得简单,同样的,由于寄存器数据区没有插入子程序自动变量数据,也使得维护sp、pc寄存器时简化了一些操作,但是最主要的还是由于本酷能指令集有CALL和RET指令(看指令操作说明,里面包含有对LR和FP的出入栈操作,和X86有很大差别),可以大幅度的简化调用子程序时寄存器出入栈的操作,所以优势非常明显。








使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则