|
楼主 |
发表于 2013-1-10 22:02:13
|
显示全部楼层
本帖最后由 dr2001 于 2013-1-10 22:15 编辑
最终版本;更新了C代码,以获得最佳优化结果。
该文件展示了这样的内容:配合针对目标体系结构的,优质的编译器,纯C语言生成的代码几乎等价于手工汇编的结果。
在Keil MDK上,O2优化,Cortex-M3,编译得到的结果中,除了Switch/Case没有进行查找表优化外,其他的汇编代码就是我想要的汇编代码。
使用Keil MDK软件仿真功能计算指令执行周期数进行性能分析。(和CortexM3手册对过,结果应该没问题。)
Cortex-M3:
1、不进行循环展开的代码,进行N字节的CRC,需要约:22 + 15 * N周期。
2、进行循环展开,CRC的移位方向和内存的大小端模式都是低位在前或者高位在前,计算CRC的循环开销为:9.75周期/字节。
3、如果CRC和内存大小端是反的,那么CRC循环的开销是:10周期/字节。
A、循环展开受到起始地址是否32Bit对齐;剩余0-3个逐字节访问等影响,额外的开销不定。
B、计算8字节以上CRC,使用循环展开模式就能快了。
C、代码大小:循环展开后256字节左右(含查找表)。
ARM926EJ-S:
循环展开后的核心循环周期数为:12-13周期/字节。和上边的2/3点一致。
以下是CortexM3 MDK编译结果,加了简要注释,CRC是MSB模式;内存布局是小端。- PUSH {r4-r6,lr}
- LDR r2, = CRC_INITR
- LDR r3, = crcLUT ; CRC_LUT_Table
- ; If(len <= 4) Jump to Final.
- CMP r1,#0x04
- BCC Final
- ; Load First Word.
- AND r4,r0,#0x03
- SUBS r0,r0,r4
- LSLS r6,r4,#3
- LDM r0!,{r5}
- LSRS r5,r5,r6
- REV r5,r5
- EORS r2,r2,r5
- ADDS r5,r1,r4
- AND r1,r5,#0x03
- SUBS r5,r5,r1
- ; Swtich/Case Jump.
- CMP r4,#0x01
- BEQ Case1
- CMP r4,#0x02
- BEQ Case2
- CMP r4,#0x03
- BNE Case0
- B Case3
- ; Main Loop.
- CRC_UnRoll: LDM r0!,{r4}
- REV r4,r4
- EORS r2,r2,r4
- Case0: LSRS r4,r2,#28
- LDR r4,[r3,r4,LSL #2]
- EOR r2,r4,r2,LSL #4
- LSRS r4,r2,#28
- LDR r4,[r3,r4,LSL #2]
- EOR r2,r4,r2,LSL #4
- Case1: LSRS r4,r2,#28
- LDR r4,[r3,r4,LSL #2]
- EOR r2,r4,r2,LSL #4
- LSRS r4,r2,#28
- LDR r4,[r3,r4,LSL #2]
- EOR r2,r4,r2,LSL #4
- Case2: LSRS r4,r2,#28
- LDR r4,[r3,r4,LSL #2]
- EOR r2,r4,r2,LSL #4
- LSRS r4,r2,#28
- LDR r4,[r3,r4,LSL #2]
- EOR r2,r4,r2,LSL #4
- Case3: LSRS r4,r2,#28
- LDR r4,[r3,r4,LSL #2]
- EOR r2,r4,r2,LSL #4
- LSRS r4,r2,#28
- LDR r4,[r3,r4,LSL #2]
- EOR r2,r4,r2,LSL #4
- SUBS r5,r5,#4
- BNE CRC_UnRoll
- B Final
- ; Final Bytes.
- CRC_Final: LDRB r4,[r0],#0x01
- EOR r2,r2,r4,LSL #24
- LSRS r4,r2,#28
- LDR r4,[r3,r4,LSL #2]
- EOR r2,r4,r2,LSL #4
- LSRS r4,r2,#28
- LDR r4,[r3,r4,LSL #2]
- EOR r2,r4,r2,LSL #4
- Final: SUBS r1,r1,#1
- BCS CRC_Final
- ; Result XOR
- LDR r0, = CRC_RSXOR
- EORS r0,r0,r2, LSR (32 - (CRC_WIDTH))
- POP {r4-r6,pc}
复制代码 不知道现在IAR的编译器结果如何,如果有人能贴一个就更好了。
GCC产生的汇编代码质量略差,数据预处理看起来不是太精简;核心循环里多了一条跳转,主要是对switch/case的结构实现有一个小瑕疵,导致多消耗一个周期。
文件如下:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|