Is there a way to force the compiler to generate a jump table for a sparse "switch" construct?
See the description of optimisation level 4
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)