bset & bclr had optimisation bugs with gcc
authorBernard Blackham <[email protected]>
Mon, 11 Aug 2003 16:51:25 +0000 (16:51 +0000)
committerBernard Blackham <[email protected]>
Mon, 11 Aug 2003 16:51:25 +0000 (16:51 +0000)
ROM2/asm.h

index 14e01ed..2c07ac8 100644 (file)
@@ -7,24 +7,31 @@
  * always be an immediate value. Using "g" makes the compiler be quiet, but 
  * the assembler should fail if the value is not an immediate.
  */
-extern inline void bset(void* addr, u8 mask) {
-       asm volatile (
-               "ldx %0\n"
-               "bset 00,x,%1"
-               :                          /* outputs */
-               : "p" (addr), "g" (mask)   /* inputs */
-               : "x"                      /* altered registers */
-               );
+extern inline void bset(const void* addr, const u8 mask) {
+       /* The assembly breaks when gcc tries to optimise consecutive calls to
+        * bset/bclr on the same memory address. Sigh. Either turn off optimisation
+        * (-O1 without -Os works), or we do it the dumb way.
+        */
+       *(u8*)addr |= mask;
+       // asm volatile (
+       //      "ldx %0\n"
+       //      "bset 00,x,%1" 
+       //      :                          /* outputs */
+       //      : "p" (addr), "g" (mask)   /* inputs */
+       //      : "x"                      /* altered registers */
+       //      );
 }
 
-extern inline void bclr(void* addr, u8 mask) {
-       asm volatile (
-               "ldx %0\n"
-               "bclr 00,x,%1"
-               :                          /* outputs */
-               : "p" (addr), "g" (mask)   /* inputs */
-               : "x"                      /* altered registers */
-               );
+extern inline void bclr(const void* addr, const u8 mask) {
+       /* same issue as above */
+       *(u8*)addr &= ~mask;
+       // asm volatile (
+       //      "ldx %0\n"
+       //      "bclr 00,x,%1"
+       //      :                          /* outputs */
+       //      : "p" (addr), "g" (mask)   /* inputs */
+       //      : "x"                      /* altered registers */
+       //      );
 }
 
 #endif /* _ASM_H_ */

UCC git Repository :: git.ucc.asn.au