This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Sparse "switch" construct

Is there a way to force the compiler to generate a jump table for a sparse "switch" construct?

Parents
  • Even with this optimization level ( 4 or 8 ), the compiler retains the right to optimize for space.

    Other than adding entries for most of the unused cases, is there anything I can do?

    C51 COMPILER V6.14  MAIN                                                                   07/02/2001 06:39:47 PAGE 1   
    
    
    C51 COMPILER V6.14, COMPILATION OF MODULE MAIN
    OBJECT MODULE PLACED IN .\Main.OBJ
    COMPILER INVOKED BY: C:\PROGRAM FILES\KEIL\C51\BIN\C51.EXE .\Main.c OPTIMIZE(0,SPEED) DEBUG OBJECTEXTEND CODE
    
    stmt level    source
    
       1          #pragma optimize( 8 ) //go for speed
       2          
       3          void main( void )
       4          {
       5   1        unsigned char a;
       6   1        switch( a )
       7   1        {
       8   2        case 0: case 2: case 4: case 6: case 8: case 10: case 12: case 14:
       9   2          a = 1;
      10   2        case 255:
      11   2          a = 3;
      12   2        }
      13   1      }
    C51 COMPILER V6.14  MAIN                                                                   07/02/2001 06:39:47 PAGE 2   
    
    ASSEMBLY LISTING OF GENERATED OBJECT CODE
    
    
                 ; FUNCTION main (BEGIN)
                                               ; SOURCE LINE # 3
                                               ; SOURCE LINE # 4
                                               ; SOURCE LINE # 6
    0000 E500        R     MOV     A,a
    0002 120000      E     LCALL   ?C?CCASE
    0005 0000        R     DW      ?C0009
    0007 00                DB      00H
    0008 0000        R     DW      ?C0009
    000A 02                DB      02H
    000B 0000        R     DW      ?C0009
    000D 04                DB      04H
    000E 0000        R     DW      ?C0009
    0010 06                DB      06H
    0011 0000        R     DW      ?C0009
    0013 08                DB      08H
    0014 0000        R     DW      ?C0009
    0016 0A                DB      0AH
    0017 0000        R     DW      ?C0009
    0019 0C                DB      0CH
    001A 0000        R     DW      ?C0009
    001C 0E                DB      0EH
    001D 0000        R     DW      ?C0010
    001F FF                DB      0FFH
    0020 0000              DW      00H
    0022 0000        R     DW      ?C0011
                                               ; SOURCE LINE # 7
                                               ; SOURCE LINE # 8
    0024         ?C0009:
                                               ; SOURCE LINE # 9
    0024 750001      R     MOV     a,#01H
                                               ; SOURCE LINE # 10
    0027         ?C0010:
                                               ; SOURCE LINE # 11
    0027 750003      R     MOV     a,#03H
                                               ; SOURCE LINE # 12
                                               ; SOURCE LINE # 13
    002A         ?C0011:
    002A 22                RET     
                 ; FUNCTION main (END)
    

Reply
  • Even with this optimization level ( 4 or 8 ), the compiler retains the right to optimize for space.

    Other than adding entries for most of the unused cases, is there anything I can do?

    C51 COMPILER V6.14  MAIN                                                                   07/02/2001 06:39:47 PAGE 1   
    
    
    C51 COMPILER V6.14, COMPILATION OF MODULE MAIN
    OBJECT MODULE PLACED IN .\Main.OBJ
    COMPILER INVOKED BY: C:\PROGRAM FILES\KEIL\C51\BIN\C51.EXE .\Main.c OPTIMIZE(0,SPEED) DEBUG OBJECTEXTEND CODE
    
    stmt level    source
    
       1          #pragma optimize( 8 ) //go for speed
       2          
       3          void main( void )
       4          {
       5   1        unsigned char a;
       6   1        switch( a )
       7   1        {
       8   2        case 0: case 2: case 4: case 6: case 8: case 10: case 12: case 14:
       9   2          a = 1;
      10   2        case 255:
      11   2          a = 3;
      12   2        }
      13   1      }
    C51 COMPILER V6.14  MAIN                                                                   07/02/2001 06:39:47 PAGE 2   
    
    ASSEMBLY LISTING OF GENERATED OBJECT CODE
    
    
                 ; FUNCTION main (BEGIN)
                                               ; SOURCE LINE # 3
                                               ; SOURCE LINE # 4
                                               ; SOURCE LINE # 6
    0000 E500        R     MOV     A,a
    0002 120000      E     LCALL   ?C?CCASE
    0005 0000        R     DW      ?C0009
    0007 00                DB      00H
    0008 0000        R     DW      ?C0009
    000A 02                DB      02H
    000B 0000        R     DW      ?C0009
    000D 04                DB      04H
    000E 0000        R     DW      ?C0009
    0010 06                DB      06H
    0011 0000        R     DW      ?C0009
    0013 08                DB      08H
    0014 0000        R     DW      ?C0009
    0016 0A                DB      0AH
    0017 0000        R     DW      ?C0009
    0019 0C                DB      0CH
    001A 0000        R     DW      ?C0009
    001C 0E                DB      0EH
    001D 0000        R     DW      ?C0010
    001F FF                DB      0FFH
    0020 0000              DW      00H
    0022 0000        R     DW      ?C0011
                                               ; SOURCE LINE # 7
                                               ; SOURCE LINE # 8
    0024         ?C0009:
                                               ; SOURCE LINE # 9
    0024 750001      R     MOV     a,#01H
                                               ; SOURCE LINE # 10
    0027         ?C0010:
                                               ; SOURCE LINE # 11
    0027 750003      R     MOV     a,#03H
                                               ; SOURCE LINE # 12
                                               ; SOURCE LINE # 13
    002A         ?C0011:
    002A 22                RET     
                 ; FUNCTION main (END)
    

Children
No data