URL:
  <http://savannah.nongnu.org/bugs/?27893>

                 Summary: pgmspace.h: __LPM_enhanced__ modifies Z on
atmega8515
                 Project: AVR C Runtime Library
            Submitted by: elrond
            Submitted on: Sa 31 Okt 2009 21:46:15 CET
                Category: Header
                Severity: 3 - Normal
                Priority: 5 - Normal
              Item Group: Header files
                  Status: None
        Percent Complete: 0%
             Assigned to: None
             Open/Closed: Open
         Discussion Lock: Any
                 Release: 1.6.2
           Fixed Release: None

    _______________________________________________________

Details:

Affected version: Debian avr-libc 1:1.6.2.cvs20080610-2
Current CVS most likely also affected, as macro didn't change.

At least on the atmega8515 __LPM_enhanced__ seems to modify Z, at least
according to the disassembly.

  #include <avr/pgmspace.h>
  #include <stdint.h>

  void try(uint8_t *p) {
    uint16_t addr = 0;
    uint8_t j;
    for (j = 0; j < 10; j++) {
      *p = __LPM_enhanced__(addr);
      p++; addr++;
    }
  }
  void try_asm(void) {
    __asm__ __volatile__(
      "lpm r18, Z+nt"
      "lpm r18, Znt"
      ::);
  }

  avr-gcc -Wall -mmcu=atmega8515 -Os -g -DF_CPU=3686400 -c lpm-z-mod.c -o
lpm-z-mod.o
gives:
00000000 <try>:
   0:   dc 01           movw    r26, r24
   2:   e0 e0           ldi     r30, 0x00       ; 0
   4:   f0 e0           ldi     r31, 0x00       ; 0
   6:   84 91           lpm     r24, Z+
   8:   8d 93           st      X+, r24
   a:   31 96           adiw    r30, 0x01       ; 1
   c:   ea 30           cpi     r30, 0x0A       ; 10
   e:   f1 05           cpc     r31, r1
  10:   01 f4           brne    .+0             ; 0x12 <try+0x12>
  12:   08 95           ret

00000014 <try_asm>:
  14:   25 91           lpm     r18, Z+
  16:   24 91           lpm     r18, Z+
  18:   08 95           ret

Note the Z+.

Also note that the Z+ can be seen as a feature. The addr++ wouldn't be needed
anymore. But providing this feature to C in a clean way doesn't look easy at
all.




    _______________________________________________________

Reply to this item at:

  <http://savannah.nongnu.org/bugs/?27893>

_______________________________________________
  Nachricht geschickt von/durch Savannah
  http://savannah.nongnu.org/



_______________________________________________
AVR-libc-dev mailing list
AVR-libc-dev@nongnu.org
http://lists.nongnu.org/mailman/listinfo/avr-libc-dev

Reply via email to