CN107203403B - 一种处理c语言switch/case语句的方法 - Google Patents
一种处理c语言switch/case语句的方法 Download PDFInfo
- Publication number
- CN107203403B CN107203403B CN201710300450.6A CN201710300450A CN107203403B CN 107203403 B CN107203403 B CN 107203403B CN 201710300450 A CN201710300450 A CN 201710300450A CN 107203403 B CN107203403 B CN 107203403B
- Authority
- CN
- China
- Prior art keywords
- instruction
- register
- byte
- word
- source
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 57
- 238000012545 processing Methods 0.000 title claims abstract description 16
- 239000013598 vector Substances 0.000 claims abstract description 25
- 238000012546 transfer Methods 0.000 claims abstract description 4
- 230000001343 mnemonic effect Effects 0.000 claims description 6
- 238000010586 diagram Methods 0.000 description 10
- 238000012360 testing method Methods 0.000 description 2
- 230000004075 alteration Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/425—Lexical analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/441—Register allocation; Assignment of physical memory space to logical memory space
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本发明公开一种处理C语言SWITCH/CASE语句的方法,在指令系统中增加字节型查找指令、半字型查找指令、散转指令;首先将若干个待查找的CASE常数项按照顺序填满所述的字节型查找指令或半字型查找指令的第二源操作数和把SWITCH表达式的值装入所述的字节型查找指令或半字型查找指令第一源寄存器中,执行所述的字节型查找指令或半字型查找指令后,在其目的寄存器就得到相等标记z和位置编号n;然后将查找指令的第二源操作数的CASE常数项所对应的跳转矢量装入散转指令的第二源操作数中,再使用上述的查找指令的结果值来索引散转指令的第二源操作数中的跳转矢量,并完成分支转移。使用本发明来编译C语言SWITCH/CASE语句时,能够产生简洁高效的代码,以提高计算机的执行速度。
Description
技术领域
本发明属于计算机领域,具体涉及一种处理C语言SWITCH/CASE语句的方法。
背景技术
C语言SWITCH/CASE语句是大家经常用到的语句,从字面上看程序逻辑清晰,结构一目了然,很受程序员欢迎,但是基于现有的指令集,C编译器编译C语言SWITCH/CASE语句成汇编指令时相当费劲。目前C编译器处理C语言SWITCH/CASE语句时通常使用两种方法,它们是:列表驱动法和逐项查找法。其中列表驱动法是在程序存贮器中建立一个常数的数组,该数组是所有CASE常数项所对应的跳转矢量的集合,所以该数组被称为CASE跳转矢量表,某个CASE常数项对应的跳转矢量在该表格的位置等于该CASE常数项与最小CASE常数项的差值,然后使用SWITCH的表达式的值减去最小CASE常数项的差值去索引所述的CASE跳转矢量表,从而得到跳转的目标,这种方法处理速度很快,也是C编译器优先使用的方法;而逐项查找法是使用SWITCH的表达式的值和CASE常数项逐个比较,如果有相等,则跳转到该CASE常数项所对应的地址,也就是说C编译器使用if/else的方法从上往下逐个比较,从而找到跳转的目标,这就造成了越靠后的case项查找的时间就越长,所以这种方法处理速度很慢。
虽然列表驱动法具有快速的优点,但是那是用空间换取时间。该方法的缺点是CASE跳转矢量表的规模往往很大,其大小等于CASE常数项的最大值与最小值的差值+1,在实际应用中,CASE常数项的离散性往往很大,没有规律可循,那么CASE跳转矢量表就有很多空白项,这会浪费很多程序空间。如果浪费程序的空间过多,C编译器只好使用逐项查找法进行编译。另外,如果case项比较少,C编译器也会使用逐项查找法进行编译。
例如下面这段C语言代码,如果使用列表驱动法进行编译,则CASE跳转矢量表长达247项(246=0xf7-0x01+1),而实际有用的case项只有4个(0x01,0x22,0x4c,0xf7),显然浪费的程序空间太多了,所以C编译器就会使用逐项查找法进行编译。
汇编代码如下:(逐项查找法,使用ARM指令集)
从上面的汇编代码可以看出,在使用逐项查找法时,越靠后的case项查找的时间就越长,因此改善逐项查找法的执行效率具有重要意义。
观察C程序中的SWITCH/CASE语句不难发现,在绝大多数SWITCH/CASE语句中:SWITCH表达式的值的字长为8位或16位,CASE常数项所对应的跳转都是小范围相对跳转,而且都是往前跳转。
发明内容
本发明提供一种处理C语言SWITCH/CASE语句的方法,能够产生简洁高效的代码,以提高计算机的执行速度。
一种处理C语言SWITCH/CASE语句的方法,该方法包括如下内容:
在现有的指令系统中增加3条指令,它们是字节型查找指令、半字型查找指令、散转指令;
所述的字节型查找指令包含目的寄存器、第一源寄存器和第二源操作数;其中,所述字节型查找指令的目的寄存器是通用寄存器或PSR(即程序状态寄存器),所述字节型查找指令的第一源寄存器是通用寄存器,所述字节型查找指令的第二源操作数是通用寄存器或立即数;采用所述的字节型查找指令的助记符为CASEB,那么该字节型查找指令的汇编格式是:CASEB Rd,Rs,Rt或者CASEB Rd,Rs,#imm,其中Rd是目的寄存器,Rs是第一源寄存器,Rt是第二源寄存器,#imm是立即数;对于指令CASEB Rd,Rs,Rt来说:如果Rt是32位通用寄存器,那么Rt里面装载的是4个字长为字节的常数,如果Rt是64位通用寄存器,那么Rt里面装载的是8个字长为字节的常数;对于指令CASEB Rd,Rs,#imm来说:如果#imm是32位立即数,那么该#imm是由4个字长为字节的常数组成,如果#imm是16位立即数,那么该#imm是由2个字长为字节的常数组成;
所述的字节型查找指令的处理内容是:将字节型查找指令的第一源寄存器(Rs)中的第0字节同时分别与字节型查找指令的第二源操作数(Rt或#imm)中的所有字长为字节的常数进行比较,如果在这些比较运算中有一个运算结果为相等,那么置相等标记z为1,否则置相等标记z为0,并且按照一定的优先级顺序来选择其中一个运算结果为相等的、参与该字节型查找指令的比较运算的常数处于字节型查找指令的第二源操作数(Rs或#imm)中的位置序号n,再把该位置序号n以及相等标记z保存到字节型查找指令的目的寄存器Rd;
所述的半字型查找指令包含目的寄存器、第一源寄存器和第二源操作数;其中,所述半字型查找指令的目的寄存器是通用寄存器或PSR(即程序状态寄存器),所述半字型查找指令的第一源寄存器是通用寄存器,所述半字型查找指令的第二源操作数是通用寄存器或立即数;采用所述的半字型查找指令的助记符为CASEH,那么半字型查找指令的汇编格式是:CASEH Rd,Rs,Rt,或者CASEH Rd,Rs,#imm,其中Rd是目的寄存器,Rs是第一源寄存器,Rt是第二源寄存器,#imm是立即数;对于指令CASEH Rd,Rs,Rt来说:如果Rt是32位通用寄存器,那么Rt里面装载的是2个字长为半字的常数,如果Rt是64位通用寄存器,那么Rt里面装载的是4个字长为半字的常数;对于指令CASEH Rd,Rs,#imm来说:如果#imm是32位立即数,那么该#imm是由2个字长为半字的常数组成;
所述的半字型查找指令的处理内容是:将半字型查找指令的第一源寄存器(Rs)中的第0半字同时分别与半字型查找指令的第二源操作数(Rt或#imm)中的所有字长为半字的常数进行比较,如果在这些比较运算中有一个运算结果为相等,那么置相等标记z为1,否则置相等标记z为0,并且按照一定的优先级顺序来选择其中一个运算结果为相等的、参与该半字型查找指令的比较运算的常数处于半字型查找指令的第二源操作数(Rs或#imm)中的位置序号n,再把该位置序号n以及相等标记z保存到半字型查找指令的目的寄存器Rd;
所述的散转指令包含第一源寄存器和第二源操作数;其中,所述散转指令的第一源寄存器是通用寄存器或PSR(即程序状态寄存器),该散转指令的第一源寄存器包含使能位和索引值;所述散转指令的第二源操作数是通用寄存器或立即数;采用所述的散转指令的助记符为SWITCH,那么该散转指令的汇编格式是:SWITCH Rs,Rt或SWITCH Rs,#imm,其中Rs是第一源寄存器,Rt是第二源寄存器,#imm是立即数;如果Rt是32位通用寄存器,那么Rt里面装载的是4个字长为字节的常数;如果Rt是64位通用寄存器,那么Rt里面装载的是8个字长为字节的常数;如果#imm是32位立即数,那么该#imm是由4个字长为字节的常数组成,如果#imm是16位立即数,那么该#imm是由2个字长为字节的常数组成;
所述的散转指令的处理内容是:如果散转指令的Rs中的使能位为真,那么使用散转指令的Rs中的索引值选择第二源操作数(Rt或#imm)中的一个字长为字节的常数作为跳转矢量(该跳转矢量是无符号数),然后用该跳转矢量与当前的PC值相加,相加的结果就是跳转的目标地址,从而完成跳转;如果散转指令的Rs中的使能位为假,则顺序执行;
所述的散转指令另外还设定:散转指令的第一源寄存器中的使能位是对应于字节型查找指令和半字型查找指令的目的寄存器中的相等标记z,而散转指令的第一源寄存器中的索引值是对应于字节型查找指令和半字型查找指令的目的寄存器中的位置序号n,这样做就使得字节型查找指令和半字型查找指令的执行结果值直接被散转指令使用。
在编译C语言SWITCH/CASE语句时,采用如下编译步骤:
第一步是根据C语言SWITCH表达式的值的字长来选择字节型查找指令或半字型查找指令,查找相等的CASE常数项,具体是:
如果C语言SWITCH表达式的值的字长为8位,那么CASE常数项的字长也是8位,所以要使用字节型查找指令(CASEB Rd,Rs,Rt或者CASEB Rd,Rs,#imm)来查找相等的CASE常数项;如果C语言SWITCH表达式的值的字长为16位,那么CASE常数项的字长也是16位,所以要使用半字型查找指令(CASEH Rd,Rs,Rt或者CASEH Rd,Rs,#imm)来查找相等的CASE常数项。查找的方法是:将若干个待查找的CASE常数项按照一定的顺序填满第二源操作数(Rt或#imm)和把SWITCH表达式的值装入源寄存器(Rs)中,执行字节型查找指令或半字型查找指令后,在其目的寄存器(Rd)就得到相等标记z和位置序号n。另外,如果待查找的CASE常数项不够填满第二源操作数(Rt或#imm),那么重复使用其中某一个待查找的CASE常数项来填充,直到填满为止。
第二步是使用所述的散转指令根据上述第一步的字节型查找指令或半字型查找指令的结果值来索引跳转矢量,完成分支转移,具体是:
将构成第一步的字节型查找指令或半字型查找指令的第二源操作数(Rt或#imm)的CASE常数项所对应的跳转矢量装入散转指令的第二源操作数(Rt或#imm)中,并且要求各CASE常数项所对应的跳转矢量处于该散转指令的第二源操作数(Rt或#imm)中的位置顺序是与该CASE常数项处于字节型查找指令或半字型查找指令的第二源操作数(Rt或#imm)的位置顺序相同。由于散转指令的第一源寄存器中的使能位是对应于字节型查找指令和半字型查找指令的目的寄存器中的相等标记z,还有散转指令的第一源寄存器中的索引值是对应于字节型查找指令和半字型查找指令的目的寄存器中的位置序号n,所以如果散转指令的第一源寄存器等于字节型查找指令或半字型查找指令的目的寄存器,那么执行散转指令就可以索引到正确的跳转矢量,并根据其使能位的状态决定跳转还是顺序执行。
本发明方法和本方法的计算机指令,使得C编译器利用这些指令来编译C语言SWITCH/CASE语句时,能够产生简洁高效的代码,其汇编代码非常简短,能够显著提高计算机的执行效率。
附图说明
图1描绘了本发明方法基于32位的寄存器或立即数的字节型查找指令的功能原理图。
图2描绘了本发明方法基于32位的寄存器或立即数的半字型查找指令的功能原理图。
图3描绘了本发明方法基于32位的寄存器或立即数的散转指令的功能原理图。
图4描绘了本发明方法基于16位立即数的字节型查找指令的功能原理图。
图5描绘了本发明方法基于16位立即数的散转指令的功能原理图。
图6描绘了本发明方法基于64位寄存器的字节型查找指令的功能原理图。
图7描绘了本发明方法基于64位寄存器的半字型查找指令的功能原理图。
图8描绘了本发明方法基于64位寄存器的散转指令的功能原理图。
优先实施例描述
参考图1描绘了本发明方法基于32位的寄存器或立即数的字节型查找指令的功能原理图,该原理图中包含有1个第一源寄存器Rs(U0)、1个第二源操作数(32位的寄存器Rt或立即数#imm)(U1)、4个相等比较器(U2、U3、U4、U5)、1个四输入或门(U6)和4个二选一数据选择器(U7、U8、U9、U10)、1个目的寄存器Rd(U11)。U0中的第0字节(byte0)分别输入4个相等比较器(U2、U3、U4、U5)的一个输入端,而U1中的4个字长为8位的常数(byte0,byte1,byte2,byte3)分别输入4个相等比较器(U2、U3、U4、U5)的另一个输入端,这4个相等比较器(U2、U3、U4、U5)输出4个标志信号(z0、z1、z2、z3):如果U2的比较结果为相等,则标志信号z0=1,否则z0=0;如果U3的比较结果为相等,则标志信号z1=1,否则z1=0;如果U4的比较结果为相等,则标志信号z2=1,否则z2=0;如果U5的比较结果为相等,则标志信号z3=1,否则z3=0。这4个标志信号(z0、z1、z2、z3)一路送入U6的输入端,而另一路分别送入4个二选一数据选择器(U7、U8、U9、U10)的选择端,即z0控制U7,z1控制U8,z2控制U9,z3控制U10。如果z0等于1,则U7输出0,否则U7输出U8的输出值;如果z1等于1,则U8输出1,否则U8输出U9的输出值;如果z2等于1,则U9输出2,否则U9输出U10的输出值;如果z3等于1,则U10输出3,否则U10输出0。U6输出的数值就是相等标记z,而U7输出的数值n就是按照一定的优先级顺序选择其中一个比较运算结果为相等的、参与该比较运算的8位常数处于该第二源操作数(U1)中的位置序号,再把U7输出的数值n以及U6输出的相等标记z保存到目的寄存器Rd(U11)。从图1可以看出,4个相等比较器(U2、U3、U4、U5)输出的4个标志信号(z0、z1、z2、z3)的优先级大小顺序是:z0>z1>z2>z3。
参考图2描绘了本发明方法基于32位的寄存器或立即数的半字型查找指令的功能原理图,该原理图中包含有1个第一源寄存器Rs(U0)、1个第二源操作数(32位的寄存器Rt或立即数#imm)(U1)、2个相等比较器(U2、U3)、1个二输入或门(U4)和2个二选一数据选择器(U5、U6)、1个目的寄存器Rd(U7)。U0中的第0半字(half0)分别输入2个相等比较器(U2、U3)的一个输入端,而U1中的2个字长为16位的常数(half 0,half1)分别输入到2个相等比较器(U2、U3)的另一个输入端,这2个相等比较器(U2、U3)输出2个标志信号(z0、z1):如果U2的比较结果为相等,则标志信号z0=1,否则z0=0;如果U3的比较结果为相等,则标志信号z1=1,否则z1=0。这2个标志信号(z0、z1)一路送入U4的输入端,而另一路分别送入2个二选一数据选择器(U5、U6)的选择端,即z0控制U5,z1控制U6。如果z0等于1,则U5输出0,否则U5输出U6的输出值;如果z1等于1,则U6输出1,否则U6输出0。U4输出的数值就是相等标记z,而U5输出的数值n就是按照一定的优先级顺序选择其中一个比较运算结果为相等的、参与该比较运算的16位常数处于该第二源操作数(U1)中的位置序号,再把U5输出的数值n以及U4输出的相等标记z保存到目的寄存器Rd(U7)。从图2可以看出,2个相等比较器(U2、U3)输出的2个标志信号(z0、z1)的优先级大小顺序是:z0>z1。
参考图3描绘了本发明方法基于32位的寄存器或立即数的散转指令的功能原理图,该原理图中包含有1个第一源寄存器Rs(U0)、1个第二源操作数(32位的寄存器Rt或立即数#imm)(U1)、1个四选一数据选择器(U2)、1个加法器(U3)、1个二选一数据选择器(U4)。将U1中的4个字长为8位的常数(byte0,byte1,byte2,byte3)分别送入U2的4个输入端,而U0的索引值送入U2的选择端,实现由U0的索引值选择U2的4个输入端中的一个数据作为U2的输出值。U2的输出值与当前PC值(PC_current)分别送入加法器U3的两个输入端进行加法运算,加法器U3输出的运算结果与顺序执行的下一条指令的地址(PC_next)分别送入U4的两个数据送入端口,而U0的使能位送入U4的选择端,由U0的使能位选择U4的两个数据送入端的其中一个数据作为U4的输出值:如果U0的使能位为1,则U4选择U3输出值作为U4的输出值,否则U4选择下一条指令的地址值(PC_next)作为U4的输出值。
参考图4描绘了本发明方法基于16位立即数的字节型查找指令的功能原理图,该原理图中包含有1个第一源寄存器Rs(U0)、1个第二源操作数(16位的立即数#imm)(U1)、2个相等比较器(U2、U3)、1个二输入或门(U4)和2个二选一数据选择器(U5、U6)、1个目的寄存器Rd(U7)。U0中的第0字节(byte0)分别输入2个相等比较器(U2、U3)的一个输入端,而U1中的2个字长为8位的常数(byte0,byte1)分别输入到2个相等比较器(U2、U3)的另一个输入端,这2个相等比较器(U2、U3)输出2个标志信号(z0、z1):如果U2的比较结果为相等,则标志信号z0=1,否则z0=0;如果U3的比较结果为相等,则标志信号z1=1,否则z1=0。这2个标志信号(z0、z1)一路送入U4的输入端,而另一路分别送入2个二选一数据选择器(U5、U6)的选择端,即z0控制U5,z1控制U6。如果z0等于1,则U5输出0,否则U5输出U6的输出值;如果z1等于1,则U6输出1,否则U6输出0。U4输出的数值就是相等标记z,而U5输出的数值n就是按照一定的优先级顺序选择其中一个比较运算结果为相等的、参与该比较运算的16位常数处于该第二源操作数(U1)中的位置序号,再把U5输出的数值n以及U4输出的相等标记z保存到目的寄存器Rd(U7)。从图4可以看出,2个相等比较器(U2、U3)输出的2个标志信号(z0、z1)的优先级大小顺序是:z0>z1。
参考图5描绘了本发明方法基于16位立即数的散转指令的功能原理图,该原理图中包含有1个第一源寄存器Rs(U0)、1个第二源操作数(16位的立即数#imm)(U1)、1个二选一数据选择器(U2)、1个加法器(U3)、1个二选一数据选择器(U4)。将U1中的2个字长为8位的常数(byte0,byte1)分别送入U2的2个输入端,而U0的索引值送入U2的选择端,实现由U0的索引值选择U2的2个输入端中的一个数据作为U2的输出值。U2的输出值与当前PC值(PC_current)分别送入加法器U3的两个输入端进行加法运算,加法器U3输出的运算结果与顺序执行的下一条指令的地址(PC_next)分别送入U4的两个数据送入端口,而U0的使能位送入U4的选择端,由U0的使能位选择U4的两个数据送入端的其中一个数据作为U4的输出值:如果U0的使能位为1,则U4选择U3输出值作为U4的输出值,否则U4选择下一条指令的地址值(PC_next)作为U4的输出值。
参考图6描绘了本发明方法基于64位寄存器的字节型查找指令的功能原理图,该原理图中包含有1个第一源寄存器Rs(U0)、1个第二源操作数(64位寄存器Rt)(U1)、8个相等比较器(U2、U3、U4、U5,U6、U7、U8、U9)、1个八输入或门(U10)和8个二选一数据选择器(U11、U12、U13、U14,U15、U16、U17、U18)、1个目的寄存器Rd(U19)。U0的第0字节(byte0)分别输入8个相等比较器(U2、U3、U4、U5,U6、U7、U8、U9)的一个输入端,而U1中的8个字长为8位的常数(byte0,byte1,byte2,byte3,byte4,byte5,byte6,byte7)分别输入到8个相等比较器(U2、U3、U4、U5,U6、U7、U8、U9)的另一个输入端,该8个相等比较器(U2、U3、U4、U5,U6、U7、U8、U9)分别输出8个标志信号(z0、z1、z2、z3、z4、z5、z6、z7):如果U2的比较结果为相等,则标志信号z0=1,否则z0=0;如果U3的比较结果为相等,则标志信号z1=1,否则z1=0;如果U4的比较结果为相等,则标志信号z2=1,否则z2=0;如果U5的比较结果为相等,则标志信号z3=1,否则z3=0;如果U6的比较结果为相等,则标志信号z4=1,否则z4=0;如果U7的比较结果为相等,则标志信号z5=1,否则z5=0;如果U8的比较结果为相等,则标志信号z6=1,否则z6=0;如果U9的比较结果为相等,则标志信号z7=1,否则z7=0。这8个标志信号(z0、z1、z2、z3、z4、z5、z6、z7)一路送入八输入或门(U10)的输入端,另一路分别送入8个二选一数据选择器(U11、U12、U13、U14,U15、U16、U17、U18)的选择端,即z0控制U11,z1控制U12,z2控制U13,z3控制U14,z4控制U15,z5控制U16,z6控制U17,z7控制U18。如果z0等于1,则U11输出0,否则U11输出U12的输出值;如果z1等于1,则U12输出1,否则U12输出U13的输出值;如果z2等于1,则U13输出2,否则U13输出U14的输出值;如果z3等于1,则U14输出3,否则U14输出U15的输出值;如果z4等于1,则U15输出4,否则U15输出U16的输出值;如果z5等于1,则U16输出5,否则U16输出U17的输出值;如果z6等于1,则U17输出6,否则U17输出U18的输出值;如果z7等于1,则U18输出7,否则U18输出0值。八输入或门U10输出的数值就是相等标记z,而U11输出的数值n就是按照一定的优先级顺序选择其中一个比较运算结果为相等的、参与该比较运算的8位常数处于该第二源操作数(U1)中的位置序号,再把U11输出的数值n以及U10输出的相等标记z保存到目的寄存器Rd(U19)。从图6可以看出,8个相等比较器(U2、U3、U4、U5,U6、U7、U8、U9)输出的8个标志信号(z0、z1、z2、z3、z4、z5、z6、z7)的优先级大小顺序是:z0>z1>z2>z3>z4>z5>z6>z7。
参考图7描绘了本发明方法基于64位寄存器的半字型查找指令的功能原理图,该原理图中包含有1个第一源寄存器Rs(U0)、1个第二源操作数(64位寄存器Rt)(U1)、4个相等比较器(U2、U3、U4、U5)、1个四输入或门(U6)和4个二选一数据选择器(U7、U8、U9、U10)、1个目的寄存器Rd(U11)。U0中的第0半字(half0)分别输入4个相等比较器(U2、U3、U4、U5)的一个输入端,而U1中的4个字长为16位的常数(half0,half1,half2,half3)分别输入4个相等比较器(U2、U3、U4、U5)的另一个输入端,这4个相等比较器(U2、U3、U4、U5)输出4个标志信号(z0、z1、z2、z3):如果U2的比较结果为相等,则标志信号z0=1,否则z0=0;如果U3的比较结果为相等,则标志信号z1=1,否则z1=0;如果U4的比较结果为相等,则标志信号z2=1,否则z2=0;如果U5的比较结果为相等,则标志信号z3=1,否则z3=0。这4个标志信号(z0、z1、z2、z3)一路送入U6的输入端,而另一路分别送入4个二选一数据选择器(U7、U8、U9、U10)的选择端,即z0控制U7,z1控制U8,z2控制U9,z3控制U10。如果z0等于1,则U7输出0,否则U7输出U8的输出值;如果z1等于1,则U8输出1,否则U8输出U9的输出值;如果z2等于1,则U9输出2,否则U9输出U10的输出值;如果z3等于1,则U10输出3,否则U10输出0。U6输出的数值就是相等标记z,而U7输出的数值n就是按照一定的优先级顺序选择其中一个比较运算结果为相等的、参与该比较运算的16位常数处于该第二源操作数(U1)中的位置序号,再把U7输出的数值n以及U6输出的相等标记z保存到目的寄存器Rd(U11)。从图7可以看出,4个相等比较器(U2、U3、U4、U5)输出的4个标志信号(z0、z1、z2、z3)的优先级大小顺序是:z0>z1>z2>z3。
在图8描绘了本发明方法基于64位寄存器的散转指令的功能原理图,该原理图中包含有1个第一源寄存器Rs(U0)、1个第二源操作数(64位的寄存器Rt)(U1)、1个八选一数据选择器(U2)、1个加法器(U3)、1个二选一数据选择器(U4)。将U1中的8个字长为8位的常数(byte0,byte1,byte2,byte3,byte4,byte5,byte6,byte7)分别送入U2的8个输入端,而U0的索引值送入U2的选择端,实现由U0的索引值选择U2的8个输入端中的一个数据作为输出值。U2的输出值与当前PC值(PC_current)分别送入加法器U3的两个输入端进行加法运算,加法器U3输出的结果与顺序执行的下一条指令的地址(PC_next)分别送入U4的两个数据送入端口,而U0的使能位送入U4的选择端,由U0的使能位选择U4的两个数据送入端的中一个数据作为输出值:如果U0的使能位为1,则U4选择U3输出值作为U4的输出值,否则U4选择下一条指令的地址值(PC_next)作为U4的输出值。
使用本发明的方法,同样要处理背景技术所述的C程序:
假设test的字长为字节,指令系统可以携带32位立即数,那么使用本发明的方法,其汇编代码如下:
如果test的字长为半字,指令系统可以携带32位立即数,那么使用本发明的方法,其汇编代码如下:
从以上的汇编代码可以看到,由CASE常数项构成的字节型查找指令或半字型查找指令的第二源操作数(通用寄存器或立即数)的位置顺序是与由该CASE常数项所对应的跳转矢量所构成的散转指令的第二源操作数(通用寄存器或立即数)的位置顺序完全相同。
对比处理背景技术所述的汇编代码不难发现,使用本发明方法的指令,其汇编代码非常简短,能够显著提高计算机的执行效率。
本发明的实施方式不限于此,按照本发明的上述内容,利用本领域的普通技术知识和惯用手段,在不脱离本发明的上述基本技术思想前提下,本发明还可以做出其它多种形式的修改、替换或变更,均落在本发明权利保护范围之内。
Claims (7)
1.一种处理C语言SWITCH/CASE语句的方法,其特征是:
在现有的指令系统中增加3条指令,它们是字节型查找指令、半字型查找指令、散转指令;其中:
所述的字节型查找指令包含目的寄存器、第一源寄存器和第二源操作数;其中,所述字节型查找指令的目的寄存器是通用寄存器或程序状态寄存器PSR,所述字节型查找指令的第一源寄存器是通用寄存器,所述字节型查找指令的第二源操作数是通用寄存器或立即数;
所述的字节型查找指令的处理内容是:将字节型查找指令的第一源寄存器中的第0字节同时分别与字节型查找指令的第二源操作数中的所有字长为字节的常数进行比较,如果在这些比较运算中有一个运算结果为相等,那么置相等标记z为1,否则置相等标记z为0,并且按照一定的优先级顺序来选择其中一个运算结果为相等的、参与该字节型查找指令的比较运算的常数处于字节型查找指令的第二源操作数中的位置序号n,再把该位置序号n以及相等标记z保存到字节型查找指令的目的寄存器;
所述的半字型查找指令包含目的寄存器、第一源寄存器和第二源操作数;其中,所述半字型查找指令的目的寄存器是通用寄存器或程序状态寄存器PSR,所述半字型查找指令的第一源寄存器是通用寄存器,所述半字型查找指令的第二源操作数是通用寄存器或立即数;
所述的半字型查找指令的处理内容是:将半字型查找指令的第一源寄存器中的第0半字同时分别与半字型查找指令的第二源操作数中的所有字长为半字的常数进行比较,如果在这些比较运算中有一个运算结果为相等,那么置相等标记z为1,否则置相等标记z为0,并且按照一定的优先级顺序来选择其中一个运算结果为相等的、参与该半字型查找指令的比较运算的常数处于半字型查找指令的第二源操作数中的位置序号n,再把该位置序号n以及相等标记z保存到半字型查找指令的目的寄存器;
所述的散转指令包含第一源寄存器和第二源操作数;其中,所述散转指令的第一源寄存器是通用寄存器或程序状态寄存器PSR,该散转指令的第一源寄存器包含使能位和索引值;所述散转指令的第二源操作数是通用寄存器或立即数;
所述的散转指令的处理内容是:如果散转指令的第一源寄存器中的使能位为真,那么使用散转指令的第一源寄存器中的索引值选择第二源操作数中的一个字长为字节的常数作为跳转矢量,然后用该跳转矢量与当前的PC值相加,相加的结果就是跳转的目标地址,从而完成跳转;如果散转指令的第一源寄存器中的使能位为假,则顺序执行。
2.根据权利要求1所述的方法,其特征是:
所述的散转指令另外还设定:散转指令的第一源寄存器中的使能位是对应于字节型查找指令和半字型查找指令的目的寄存器中的相等标记z,而散转指令的第一源寄存器中的索引值是对应于字节型查找指令和半字型查找指令的目的寄存器中的位置序号n。
3.根据权利要求1或2所述的方法,其特征是:采用所述的字节型查找指令的助记符为CASEB,那么该字节型查找指令的汇编格式是:CASEB Rd,Rs,Rt或者CASEB Rd,Rs,#imm,其中Rd是目的寄存器,Rs是第一源寄存器,Rt是第二源寄存器,#imm是立即数;对于指令CASEBRd,Rs,Rt来说:如果Rt是32位通用寄存器,那么Rt里面装载的是4个字长为字节的常数,如果Rt是64位通用寄存器,那么Rt里面装载的是8个字长为字节的常数;对于指令CASEB Rd,Rs,#imm来说:如果#imm是32位立即数,那么该#imm是由4个字长为字节的常数组成,如果#imm是16位立即数,那么该#imm是由2个字长为字节的常数组成;
采用所述的半字型查找指令的助记符为CASEH,那么半字型查找指令的汇编格式是:CASEH Rd,Rs,Rt,或者CASEH Rd,Rs,#imm,其中Rd是目的寄存器,Rs是第一源寄存器,Rt是第二源寄存器,#imm是立即数;对于指令CASEH Rd,Rs,Rt来说:如果Rt是32位通用寄存器,那么Rt里面装载的是2个字长为半字的常数,如果Rt是64位通用寄存器,那么Rt里面装载的是4个字长为半字的常数;对于指令CASEH Rd,Rs,#imm来说:如果#imm是32位立即数,那么该#imm是由2个字长为半字的常数组成;
采用所述的散转指令的助记符为SWITCH,那么该散转指令的汇编格式是:SWITCH Rs,Rt或SWITCH Rs,#imm,其中Rs是第一源寄存器,Rt是第二源寄存器,#imm是立即数;如果Rt是32位通用寄存器,那么Rt里面装载的是4个字长为字节的常数;如果Rt是64位通用寄存器,那么Rt里面装载的是8个字长为字节的常数;如果#imm是32位立即数,那么该#imm是由4个字长为字节的常数组成,如果#imm是16位立即数,那么该#imm是由2个字长为字节的常数组成。
4.根据权利要求3所述的方法,其特征是:如果所述的字节型查找指令、半字型查找指令、散转指令中的第二源操作数是通用寄存器,那么该通用寄存器是64位或32位;如果其第二源操作数是立即数,那么该立即数是32位或16位。
5.根据权利要求4所述的方法,其特征是:还包括在处理C语言SWITCH/CASE语句时,进行如下编译步骤:
第一步是根据C语言SWITCH表达式的值的字长来选择字节型查找指令或半字型查找指令,查找相等的CASE常数项,具体是:
如果C语言SWITCH表达式的值的字长为8位,那么CASE常数项的字长也是8位,所以要使用字节型查找指令来查找相等的CASE常数项,所述字节型查找指令为CASEB Rd,Rs,Rt或者CASEB Rd,Rs,#imm;如果C语言SWITCH表达式的值的字长为16位,那么CASE常数项的字长也是16位,所以要使用半字型查找指令来查找相等的CASE常数项,所述半字型查找指令为CASEH Rd,Rs,Rt或者CASEH Rd,Rs,#imm;
第二步是使用所述的散转指令根据上述第一步的字节型查找指令或半字型查找指令的结果值来索引跳转矢量,完成分支转移,具体是:
将构成第一步的字节型查找指令或半字型查找指令的第二源操作数的CASE常数项所对应的跳转矢量装入散转指令的第二源操作数中,并且要求各CASE常数项所对应的跳转矢量处于该散转指令的第二源操作数中的位置顺序是与该CASE常数项处于字节型查找指令或半字型查找指令的第二源操作数的位置顺序相同,所述第二源操作数为Rt或#imm;如果散转指令的第一源寄存器等于字节型查找指令或半字型查找指令的目的寄存器,那么执行散转指令就索引到正确的跳转矢量,并根据其使能位的状态决定跳转还是顺序执行。
6.根据权利要求5所述的方法,其特征是:所述使用半字型查找指令来查找相等的CASE常数项的查找的方法是:将若干个待查找的CASE常数项按照一定的顺序填满第二源操作数和把SWITCH表达式的值装入源寄存器中,执行字节型查找指令或半字型查找指令后,在其目的寄存器就得到相等标记z和位置序号n;另外,如果待查找的CASE常数项不够填满第二源操作数,那么重复使用其中某一个待查找的CASE常数项来填充,直到填满为止。
7.根据权利要求4至6任意一项所述的方法,其特征是:所述跳转矢量是无符号数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710300450.6A CN107203403B (zh) | 2017-04-28 | 2017-04-28 | 一种处理c语言switch/case语句的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710300450.6A CN107203403B (zh) | 2017-04-28 | 2017-04-28 | 一种处理c语言switch/case语句的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107203403A CN107203403A (zh) | 2017-09-26 |
CN107203403B true CN107203403B (zh) | 2020-08-07 |
Family
ID=59905062
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710300450.6A Active CN107203403B (zh) | 2017-04-28 | 2017-04-28 | 一种处理c语言switch/case语句的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107203403B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0695877A (ja) * | 1990-06-29 | 1994-04-08 | Digital Equip Corp <Dec> | 簡略命令セットプロセッサの性能改善方法 |
CN103927149A (zh) * | 2013-01-14 | 2014-07-16 | 想象力科技有限公司 | 间接分支预测 |
-
2017
- 2017-04-28 CN CN201710300450.6A patent/CN107203403B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0695877A (ja) * | 1990-06-29 | 1994-04-08 | Digital Equip Corp <Dec> | 簡略命令セットプロセッサの性能改善方法 |
CN103927149A (zh) * | 2013-01-14 | 2014-07-16 | 想象力科技有限公司 | 间接分支预测 |
Non-Patent Citations (1)
Title |
---|
深入探析C语言中多分支结构的性能;宋雅娟;《长春大学学报》;20071031(第10期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN107203403A (zh) | 2017-09-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP2569694B1 (en) | Conditional compare instruction | |
US9880842B2 (en) | Using control flow data structures to direct and track instruction execution | |
JP5209609B2 (ja) | ハードウェアエンドループ情報の命令へのコード化 | |
US11803379B2 (en) | Vector floating-point classification | |
KR20030036858A (ko) | 어레이 처리 동작 | |
WO2014143042A1 (en) | Path profiling using hardware and software combination | |
CN109214149B (zh) | 一种mips固件基地址自动化检测方法 | |
US11681532B2 (en) | Method for forming constant extensions in the same execute packet in a VLIW processor | |
TW201643698A (zh) | 用於執行衝突檢測的方法及裝置 | |
US20230367598A1 (en) | Vector maximum and minimum with indexing | |
EP0093430A2 (en) | Pipeline data processing system | |
US10402199B2 (en) | Conditional execution specification of instructions using conditional extension slots in the same execute packet in a VLIW processor | |
CN107589960B (zh) | 一种基于寄存器访问冲突检测的dsp指令模拟方法 | |
KR100986375B1 (ko) | 피연산자의 빠른 조건부 선택 | |
CN111782270A (zh) | 一种数据处理方法及装置、存储介质 | |
CN107203403B (zh) | 一种处理c语言switch/case语句的方法 | |
US20170242696A1 (en) | System and Method for Contextual Vectorization of Instructions at Runtime | |
US20230359385A1 (en) | Quick clearing of registers | |
US10235167B2 (en) | Microprocessor with supplementary commands for binary search and associated search method | |
US11995441B1 (en) | Instruction decoding using hash tables | |
CN109710310B (zh) | 用于嵌入式环境的数据处理方法、系统、终端及存储介质 | |
TWI751990B (zh) | 衝突罩生成 | |
KR20230158257A (ko) | 명령어를 처리하는 방법 및 이를 위한 프로세서 모듈 | |
Lutsyk et al. | Basic Processor Design | |
JP2015130057A (ja) | 処理装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20240617 Address after: No. 401, shantiehe Road, Huadu District, Guangdong 510000 Patentee after: Guangzhou Yier Electronics Co.,Ltd. Country or region after: China Address before: Yin Lu Panyu District Luoxi Metro Guangzhou City, Guangdong province 511400 Hua Hui Ming Hua 53 Building No. 602 Patentee before: Li Chaobo Country or region before: China |