打印

发现keil 4.12版本的一个bug

[复制链接]
3646|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yixuanyuxiao|  楼主 | 2012-4-14 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yixuanyuxiao 于 2012-4-14 16:57 编辑

我最近在stm32上移植mp3的软解码程序,用的是helix的源码,调试过程中发现一个问题,在helix的源码里有一个内联函数在做优化等级3的优化时会出现未定义指令,觉得是keil4.12版本优化的一个bug,因为我家里的电脑上是4.23,一直是优化等级3编译,没出现过问题,到公司的电脑上编译就出问题了,公司电脑是4.12版本,本人菜鸟,分析不出具体原因,希望牛人分析下。现贴出代码
这是内联函数的c语言代码:

static __inline void imdct12 (int *x, int *out)
{

int a0, a1, a2;


int x0, x1, x2, x3, x4, x5;



x0 = *x;
x+=3;
x1 = *x;
x+=3;


x2 = *x;
x+=3;
x3 = *x;
x+=3;


x4 = *x;
x+=3;
x5 = *x;
x+=3;



x4 -= x5;


x3 -= x4;


x2 -= x3;


x3 -= x5;


x1 -= x2;


x0 -= x1;


x1 -= x3;



x0 >>= 1;


x1 >>= 1;



a0 = MULSHIFT32(c3_0, x2) << 1;


a1 = x0 + (x4 >> 1);


a2 = x0 - x4;


x0 = a1 + a0;


x2 = a2;


x4 = a1 - a0;



a0 = MULSHIFT32(c3_0, x3) << 1;


a1 = x1 + (x5 >> 1);


a2 = x1 - x5;



/* cos window odd samples, mul by 2, eat sign bit */


x1 = MULSHIFT32(c6[0], a1 + a0) << 2;


x3 = MULSHIFT32(c6[1], a2) << 2;


x5 = MULSHIFT32(c6[2], a1 - a0) << 2;



*out = x0 + x1;
out++;


*out = x2 + x3;
out++;


*out = x4 + x5;
out++;


*out = x4 - x5;
out++;


*out = x2 - x3;
out++;


*out = x0 - x1;

}
沙发
yixuanyuxiao|  楼主 | 2012-4-14 16:50 | 只看该作者
这里是优化等级为0时的汇编代码:
   471: static __inline void imdct12 (int *x, int *out)
0x08004C30 B027      ADD      sp,sp,#0x9C
0x08004C32 E8BD8FF0  POP      {r4-r11,pc}
0x08004C36 0000      MOVS     r0,r0
0x08004C38 EBA16ED9  SUB      lr,r1,r9,LSR #27
0x08004C3C BE8B      BKPT     0x8B
0x08004C3E 620D      STR      r5,[r1,#0x20]
0x08004C40 1A7E      SUBS     r6,r7,r1
0x08004C42 163A      ASRS     r2,r7,#24
0x08004C44 DD49      BLE      0x08004CDA
0x08004C46 5246      STRH     r6,[r0,r1]
0x08004C48 2E32      CMP      r6,#0x32
0x08004C4A 7E0E      LDRB     r6,[r1,#0x18]
   472: {
   473:         int a0, a1, a2;
   474:         int x0, x1, x2, x3, x4, x5;
   475:  
0x08004C4C E92D4FFE  PUSH     {r1-r11,lr}
0x08004C50 4604      MOV      r4,r0
0x08004C52 460D      MOV      r5,r1
   476:         x0 = *x;        x+=3;   x1 = *x;   x+=3;
0x08004C54 F8D48000  LDR      r8,[r4,#0x00]
0x08004C58 340C      ADDS     r4,r4,#0x0C
0x08004C5A 6826      LDR      r6,[r4,#0x00]
0x08004C5C 340C      ADDS     r4,r4,#0x0C
   477:         x2 = *x;        x+=3;   x3 = *x;   x+=3;
0x08004C5E F8D4B000  LDR      r11,[r4,#0x00]
0x08004C62 340C      ADDS     r4,r4,#0x0C
0x08004C64 6827      LDR      r7,[r4,#0x00]
0x08004C66 340C      ADDS     r4,r4,#0x0C
   478:         x4 = *x;        x+=3;   x5 = *x;   x+=3;
   479:  
0x08004C68 F8D49000  LDR      r9,[r4,#0x00]
0x08004C6C 340C      ADDS     r4,r4,#0x0C
0x08004C6E F8D4A000  LDR      r10,[r4,#0x00]
0x08004C72 340C      ADDS     r4,r4,#0x0C
   480:         x4 -= x5;
0x08004C74 EBA9090A  SUB      r9,r9,r10
   481:         x3 -= x4;
0x08004C78 EBA70709  SUB      r7,r7,r9
   482:         x2 -= x3;
0x08004C7C EBAB0B07  SUB      r11,r11,r7
   483:         x3 -= x5;
0x08004C80 EBA7070A  SUB      r7,r7,r10
   484:         x1 -= x2;
0x08004C84 EBA6060B  SUB      r6,r6,r11
   485:         x0 -= x1;
0x08004C88 EBA80806  SUB      r8,r8,r6
   486:         x1 -= x3;
   487:  
0x08004C8C 1BF6      SUBS     r6,r6,r7
   488:         x0 >>= 1;
0x08004C8E EA4F0868  ASR      r8,r8,#1
   489:         x1 >>= 1;
   490:  
0x08004C92 1076      ASRS     r6,r6,#1
   491:         a0 = MULSHIFT32(c3_0, x2) << 1;
0x08004C94 4659      MOV      r1,r11
0x08004C96 4828      LDR      r0,[pc,#160]  ; @0x08004D38
0x08004C98 F7FBFA9A  BL.W     xmp3_MULSHIFT32 (0x080001D0)
0x08004C9C 0040      LSLS     r0,r0,#1
0x08004C9E 9002      STR      r0,[sp,#0x08]
   492:         a1 = x0 + (x4 >> 1);
0x08004CA0 EB080069  ADD      r0,r8,r9,ASR #1
0x08004CA4 9001      STR      r0,[sp,#0x04]
   493:         a2 = x0 - x4;
0x08004CA6 EBA80009  SUB      r0,r8,r9
0x08004CAA 9000      STR      r0,[sp,#0x00]
   494:         x0 = a1 + a0;
0x08004CAC E9DD0101  LDRD     r0,r1,[sp,#0x04]
0x08004CB0 EB000801  ADD      r8,r0,r1
   495:         x2 = a2;
0x08004CB4 F8DDB000  LDR      r11,[sp,#0x00]
   496:         x4 = a1 - a0;
   497:  
0x08004CB8 E9DD0101  LDRD     r0,r1,[sp,#0x04]
0x08004CBC EBA00901  SUB      r9,r0,r1
   498:         a0 = MULSHIFT32(c3_0, x3) << 1;
0x08004CC0 4639      MOV      r1,r7
0x08004CC2 481D      LDR      r0,[pc,#116]  ; @0x08004D38
0x08004CC4 F7FBFA84  BL.W     xmp3_MULSHIFT32 (0x080001D0)
0x08004CC8 0040      LSLS     r0,r0,#1
0x08004CCA 9002      STR      r0,[sp,#0x08]
   499:         a1 = x1 + (x5 >> 1);
0x08004CCC EB06006A  ADD      r0,r6,r10,ASR #1
0x08004CD0 9001      STR      r0,[sp,#0x04]
   500:         a2 = x1 - x5;
   501:  
   502:         /* cos window odd samples, mul by 2, eat sign bit */
0x08004CD2 EBA6000A  SUB      r0,r6,r10
0x08004CD6 9000      STR      r0,[sp,#0x00]
   503:         x1 = MULSHIFT32(c6[0], a1 + a0) << 2;         
0x08004CD8 E9DD2301  LDRD     r2,r3,[sp,#0x04]
0x08004CDC 18D1      ADDS     r1,r2,r3
0x08004CDE 4A17      LDR      r2,[pc,#92]  ; @0x08004D3C
0x08004CE0 6810      LDR      r0,[r2,#0x00]
0x08004CE2 F7FBFA75  BL.W     xmp3_MULSHIFT32 (0x080001D0)
0x08004CE6 0086      LSLS     r6,r0,#2
   504:         x3 = MULSHIFT32(c6[1], a2) << 2;
0x08004CE8 4914      LDR      r1,[pc,#80]  ; @0x08004D3C
0x08004CEA 6848      LDR      r0,[r1,#0x04]
0x08004CEC 9900      LDR      r1,[sp,#0x00]
0x08004CEE F7FBFA6F  BL.W     xmp3_MULSHIFT32 (0x080001D0)
0x08004CF2 0087      LSLS     r7,r0,#2
   505:         x5 = MULSHIFT32(c6[2], a1 - a0) << 2;
   506:  
0x08004CF4 E9DD2301  LDRD     r2,r3,[sp,#0x04]
0x08004CF8 1AD1      SUBS     r1,r2,r3
0x08004CFA 4A10      LDR      r2,[pc,#64]  ; @0x08004D3C
0x08004CFC 6890      LDR      r0,[r2,#0x08]
0x08004CFE F7FBFA67  BL.W     xmp3_MULSHIFT32 (0x080001D0)
0x08004D02 EA4F0A80  LSL      r10,r0,#2
   507:         *out = x0 + x1; out++;
0x08004D06 EB080006  ADD      r0,r8,r6
0x08004D0A 6028      STR      r0,[r5,#0x00]
0x08004D0C 1D2D      ADDS     r5,r5,#4
   508:         *out = x2 + x3; out++;
0x08004D0E EB0B0007  ADD      r0,r11,r7
0x08004D12 6028      STR      r0,[r5,#0x00]
0x08004D14 1D2D      ADDS     r5,r5,#4
   509:         *out = x4 + x5; out++;
0x08004D16 EB09000A  ADD      r0,r9,r10
0x08004D1A 6028      STR      r0,[r5,#0x00]
0x08004D1C 1D2D      ADDS     r5,r5,#4
   510:         *out = x4 - x5; out++;
0x08004D1E EBA9000A  SUB      r0,r9,r10
0x08004D22 6028      STR      r0,[r5,#0x00]
0x08004D24 1D2D      ADDS     r5,r5,#4
   511:         *out = x2 - x3; out++;
0x08004D26 EBAB0007  SUB      r0,r11,r7
0x08004D2A 6028      STR      r0,[r5,#0x00]
0x08004D2C 1D2D      ADDS     r5,r5,#4
   512:         *out = x0 - x1;
0x08004D2E EBA80006  SUB      r0,r8,r6
0x08004D32 6028      STR      r0,[r5,#0x00]
   513: }
0x08004D34 E8BD8FFE  POP      {r1-r11,pc}
0x08004D38 EBA16ED9  SUB      lr,r1,r9,LSR #27
0x08004D3C 9590      STR      r5,[sp,#0x240]
0x08004D3E 0800      LSRS     r0,r0,#0

使用特权

评论回复
板凳
aozima| | 2012-4-14 16:57 | 只看该作者
局部变量太多,寄存器用光不会压栈直接使用,于是,就乱掉了。
新版已修正。
MDK是带升级服务的,公司的也可以升。

使用特权

评论回复
地板
yixuanyuxiao|  楼主 | 2012-4-14 16:58 | 只看该作者
这里是优化等级为3时的汇编代码:
   471: static __inline void imdct12 (int *x, int *out)
0x080049F4 B011      ADD      sp,sp,#0x44
0x080049F6 E8BD8FF0  POP      {r4-r11,pc}
0x080049FA 0000      MOVS     r0,r0
0x080049FC EBA16ED9  SUB      lr,r1,r9,LSR #27
0x08004A00 BE8B      BKPT     0x8B
0x08004A02 620D      STR      r5,[r1,#0x20]
0x08004A04 1A7E      SUBS     r6,r7,r1
0x08004A06 163A      ASRS     r2,r7,#24
0x08004A08 DD49      BLE      0x08004A9E
0x08004A0A 5246      STRH     r6,[r0,r1]
0x08004A0C 2E32      CMP      r6,#0x32
0x08004A0E 7E0E      LDRB     r6,[r1,#0x18]
   472: {
   473:         int a0, a1, a2;
   474:         int x0, x1, x2, x3, x4, x5;
   475:  
   476:         x0 = *x;        x+=3;   x1 = *x;   x+=3;
   477:         x2 = *x;        x+=3;   x3 = *x;   x+=3;
   478:         x4 = *x;        x+=3;   x5 = *x;   x+=3;
   479:  
0x08004A10 E92D5FF0  PUSH     {r4-r12,lr}
   480:         x4 -= x5;
0x08004A14 6B05      LDR      r5,[r0,#0x30]
0x08004A16 6BC4      LDR      r4,[r0,#0x3C]
   481:         x3 -= x4;
0x08004A18 6A46      LDR      r6,[r0,#0x24]
   480:         x4 -= x5;
0x08004A1A 1B2D      SUBS     r5,r5,r4
   481:         x3 -= x4;
0x08004A1C 68C3      LDR      r3,[r0,#0x0C]
0x08004A1E 6802      LDR      r2,[r0,#0x00]
0x08004A20 6981      LDR      r1,[r0,#0x18]
0x08004A22 1B70      SUBS     r0,r6,r5
   482:         x2 -= x3;
0x08004A24 1A09      SUBS     r1,r1,r0
   483:         x3 -= x5;
0x08004A26 1B06      SUBS     r6,r0,r4
   484:         x1 -= x2;
0x08004A28 1A58      SUBS     r0,r3,r1
   485:         x0 -= x1;
0x08004A2A 1A12      SUBS     r2,r2,r0
   486:         x1 -= x3;
   487:  
   488:         x0 >>= 1;
   489:         x1 >>= 1;
   490:  
0x08004A2C 1B80      SUBS     r0,r0,r6
   491:         a0 = MULSHIFT32(c3_0, x2) << 1;
0x08004A2E F8DF807C  LDR.W    r8,[pc,#124]  ; @0x08004AAE
   489:         x1 >>= 1;
   490:  
   491:         a0 = MULSHIFT32(c3_0, x2) << 1;
0x08004A32 EA4F0B60  ASR      r11,r0,#1
   488:         x0 >>= 1;
   489:         x1 >>= 1;
   490:  
   491:         a0 = MULSHIFT32(c3_0, x2) << 1;
0x08004A36 1057      ASRS     r7,r2,#1
0x08004A38 4640      MOV      r0,r8
0x08004A3A F7FBFBC9  BL.W     xmp3_MULSHIFT32 (0x080001D0)
   492:         a1 = x0 + (x4 >> 1);
   493:         a2 = x0 - x4;
0x08004A3E EB070165  ADD      r1,r7,r5,ASR #1
   491:         a0 = MULSHIFT32(c3_0, x2) << 1;
   492:         a1 = x0 + (x4 >> 1);
   493:         a2 = x0 - x4;
0x08004A42 0040      LSLS     r0,r0,#1
   494:         x0 = a1 + a0;
   495:         x2 = a2;
0x08004A44 EB010A00  ADD      r10,r1,r0
   496:         x4 = a1 - a0;
   497:  
0x08004A48 EBA10900  SUB      r9,r1,r0
   493:         a2 = x0 - x4;
   494:         x0 = a1 + a0;
   495:         x2 = a2;
   496:         x4 = a1 - a0;
   497:  
0x08004A4C 1B7D      SUBS     r5,r7,r5
   498:         a0 = MULSHIFT32(c3_0, x3) << 1;
0x08004A4E 4631      MOV      r1,r6
0x08004A50 4640      MOV      r0,r8
0x08004A52 F7FBFBBD  BL.W     xmp3_MULSHIFT32 (0x080001D0)
0x08004A56 0046      LSLS     r6,r0,#1
   499:         a1 = x1 + (x5 >> 1);
0x08004A58 EB0B0864  ADD      r8,r11,r4,ASR #1
   500:         a2 = x1 - x5;
   501:  
   502:         /* cos window odd samples, mul by 2, eat sign bit */
0x08004A5C EBAB0704  SUB      r7,r11,r4
   503:         x1 = MULSHIFT32(c6[0], a1 + a0) << 2;         
0x08004A60 EB080106  ADD      r1,r8,r6
0x08004A64 4812      LDR      r0,[pc,#72]  ; @0x08004AB0
0x08004A66 F7FBFBB3  BL.W     xmp3_MULSHIFT32 (0x080001D0)
0x08004A6A 0084      LSLS     r4,r0,#2
   504:         x3 = MULSHIFT32(c6[1], a2) << 2;
0x08004A6C 4639      MOV      r1,r7
0x08004A6E 4811      LDR      r0,[pc,#68]  ; @0x08004AB4
0x08004A70 F7FBFBAE  BL.W     xmp3_MULSHIFT32 (0x080001D0)
0x08004A74 0087      LSLS     r7,r0,#2
   505:         x5 = MULSHIFT32(c6[2], a1 - a0) << 2;
   506:  
0x08004A76 EBA80106  SUB      r1,r8,r6
0x08004A7A 480F      LDR      r0,[pc,#60]  ; @0x08004AB8
0x08004A7C F7FBFBA8  BL.W     xmp3_MULSHIFT32 (0x080001D0)
0x08004A80 0081      LSLS     r1,r0,#2
   507:         *out = x0 + x1; out++;
0x08004A82 980B      LDR      r0,[sp,#0x2C]
0x08004A84 EB0A0204  ADD      r2,r10,r4
0x08004A88 6002      STR      r2,[r0,#0x00]
   508:         *out = x2 + x3; out++;
0x08004A8A 980B      LDR      r0,[sp,#0x2C]
0x08004A8C 19EA      ADDS     r2,r5,r7
   509:         *out = x4 + x5; out++;
0x08004A8E 6042      STR      r2,[r0,#0x04]
0x08004A90 EB090201  ADD      r2,r9,r1
   510:         *out = x4 - x5; out++;
0x08004A94 EBA90101  SUB      r1,r9,r1
0x08004A98 E9C02102  STRD     r2,r1,[r0,#0x08]
   511:         *out = x2 - x3; out++;
0x08004A9C 1BE9      SUBS     r1,r5,r7
   512:         *out = x0 - x1;
0x08004A9E 6101      STR      r1,[r0,#0x10]
0x08004AA0 EBAA0104  SUB      r1,r10,r4
0x08004AA4 6141      STR      r1,[r0,#0x14]
   513: }
0x08004AA6 E8BD9FF0  POP      {r4-r12,pc}
0x08004AAA 0000      MOVS     r0,r0
0x08004AAC EBA16ED9  SUB      lr,r1,r9,LSR #27
0x08004AB0 751D      STRB     r5,[r3,#0x14]
0x08004AB2 7BA3      LDRB     r3,[r4,#0x0E]
0x08004AB4 799A      LDRB     r2,[r3,#0x06]
0x08004AB6 5A82      LDRH     r2,[r0,r2]
0x08004AB8 FB832120  DCD      0xFB832120   ; ? Undefined 应该是这个地方

使用特权

评论回复
5
yixuanyuxiao|  楼主 | 2012-4-14 16:59 | 只看该作者
c语言程序再发一遍,楼主位的看起来好别扭,调不了。
这是内联函数的c语言代码:

static __inline void imdct12 (int *x, int *out)
{
        int a0, a1, a2;
        int x0, x1, x2, x3, x4, x5;

        x0 = *x;        x+=3;        x1 = *x;        x+=3;
        x2 = *x;        x+=3;        x3 = *x;        x+=3;
        x4 = *x;        x+=3;        x5 = *x;        x+=3;

        x4 -= x5;
        x3 -= x4;
        x2 -= x3;
        x3 -= x5;
        x1 -= x2;
        x0 -= x1;
        x1 -= x3;

        x0 >>= 1;
        x1 >>= 1;

        a0 = MULSHIFT32(c3_0, x2) << 1;
        a1 = x0 + (x4 >> 1);
        a2 = x0 - x4;
        x0 = a1 + a0;
        x2 = a2;
        x4 = a1 - a0;

        a0 = MULSHIFT32(c3_0, x3) << 1;
        a1 = x1 + (x5 >> 1);
        a2 = x1 - x5;

        /* cos window odd samples, mul by 2, eat sign bit */
        x1 = MULSHIFT32(c6[0], a1 + a0) << 2;                       
        x3 = MULSHIFT32(c6[1], a2) << 2;
        x5 = MULSHIFT32(c6[2], a1 - a0) << 2;

        *out = x0 + x1;        out++;
        *out = x2 + x3;        out++;
        *out = x4 + x5;        out++;
        *out = x4 - x5;        out++;
        *out = x2 - x3;        out++;
        *out = x0 - x1;
}

使用特权

评论回复
6
上官金虹| | 2012-4-14 18:47 | 只看该作者
没看懂。

使用特权

评论回复
7
airwill| | 2012-4-15 07:58 | 只看该作者
嗯, 楼主很细心.
实际编程中也难得会用到这么多局部变量.
留意一下

使用特权

评论回复
8
yixuanyuxiao|  楼主 | 2012-4-15 10:43 | 只看该作者
嗯,这是helix源码中的程序,实现一个DCT变换的功能的一部分

使用特权

评论回复
9
zhhtao89| | 2012-4-15 13:09 | 只看该作者
不错

使用特权

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

本版积分规则

个人签名:立志成为电子工程师

14

主题

83

帖子

0

粉丝