Advertisement
Guest User

GCC optimization bug?

a guest
Oct 27th, 2013
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.74 KB | None | 0 0
  1. // Excerpt from display.h:
  2. #define BASE_REG 0x4000000
  3.  
  4. #define DISPLAY_BG_MODE_0        (0)
  5. #define DISPLAY_BG_MODE_1        (1)
  6. #define DISPLAY_BG_MODE_2        (2)
  7. #define DISPLAY_BG_MODE_3        (3)
  8. #define DISPLAY_BG_MODE_4        (4)
  9. #define DISPLAY_BG_MODE_5        (5)
  10.  
  11. #define DISPLAY_MODE_GBA         (0 << 3)
  12. #define DISPLAY_MODE_CGB         (1 << 3)
  13.  
  14. #define DISPLAY_SELECT_FRAME_0   (0 << 4)
  15. #define DISPLAY_SELECT_FRAME_1   (1 << 4)
  16.  
  17. #define DISPLAY_HBLANK_FREE      (1 << 5)
  18. #define DISPLAY_OBJ_VRAM_MAPPING (1 << 6)
  19. #define DISPLAY_FORCED_BLANK     (1 << 7)
  20.  
  21. #define DISPLAY_SHOW_BG0         (1 << 8)
  22. #define DISPLAY_SHOW_BG1         (1 << 9)
  23. #define DISPLAY_SHOW_BG2         (1 << 10)
  24. #define DISPLAY_SHOW_BG3         (1 << 11)
  25. #define DISPLAY_SHOW_OBJ         (1 << 12)
  26. #define DISPLAY_SHOW_WIN0        (1 << 13)
  27. #define DISPLAY_SHOW_WIN1        (1 << 14)
  28. #define DISPLAY_SHOW_WIN_OBJ     (1 << 15)
  29.  
  30. typedef struct display_control_reg {
  31.     union {
  32.         unsigned short raw;
  33.         struct __attribute__((packed)) {
  34.             unsigned bg_mode              : 3;
  35.             unsigned cgb_gba              : 1;
  36.             unsigned display_frame_select : 1;
  37.             unsigned hblank_free          : 1;
  38.             unsigned obj_vram_mapping     : 1;
  39.             unsigned forced_blank         : 1;
  40.             unsigned display_bg0          : 1;
  41.             unsigned display_bg1          : 1;
  42.             unsigned display_bg2          : 1;
  43.             unsigned display_bg3          : 1;
  44.             unsigned display_obj          : 1;
  45.             unsigned display_win0         : 1;
  46.             unsigned display_win1         : 1;
  47.             unsigned display_win_obj      : 1;
  48.         };
  49.     };
  50. } display_control_reg_t;
  51.  
  52. #define display_control_register (*(display_control_reg_t *)BASE_REG)
  53.  
  54. // excerpt from main.c
  55. display_control_register.raw = 0;
  56. display_control_register.bg_mode = 3;
  57. display_control_register.display_bg2 = 1;
  58.  
  59. // code generated by gcc
  60. 08000340 <main>:
  61.  8000340:   b500        push    {lr}
  62.  8000342:   2380        movs    r3, #128    ; 0x80
  63.  8000344:   04db        lsls    r3, r3, #19
  64.  8000346:   2200        movs    r2, #0
  65.  8000348:   801a        strh    r2, [r3, #0]
  66.  800034a:   7859        ldrb    r1, [r3, #1]
  67.  800034c:   2204        movs    r2, #4
  68.  800034e:   430a        orrs    r2, r1
  69.  8000350:   705a        strb    r2, [r3, #1]
  70.  8000352:   23c0        movs    r3, #192    ; 0xc0
  71.  8000354:   4a03        ldr r2, [pc, #12]   ; (8000364 <main+0x24>)
  72.  8000356:   04db        lsls    r3, r3, #19
  73.  8000358:   211f        movs    r1, #31
  74.  800035a:   8019        strh    r1, [r3, #0]
  75.  800035c:   3302        adds    r3, #2
  76.  800035e:   4293        cmp r3, r2
  77.  8000360:   d1fb        bne.n   800035a <main+0x1a>
  78.  8000362:   e7fe        b.n 8000362 <main+0x22>
  79.  8000364:   06012c00    .word   0x06012c00
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement