Changeset 47854a0d in rtems


Ignore:
Timestamp:
Jul 13, 2006, 1:27:30 AM (14 years ago)
Author:
Till Straumann <strauman@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
b18c5f7c
Parents:
b365d4d
Message:

PR 1110/networking

  • libnetworking/machine/in_cksum.h: Replaced PPC and i386 assembly algorithms (must not assume carry bit is preserved across multiple asms). Added packet header as a 'm' input operand for all CPU variants. Added carry bit to clobber list.
Location:
cpukit
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cpukit/ChangeLog

    rb365d4d r47854a0d  
     12006-07-12      Till Straumann <strauman@slac.stanford.edu>
     2
     3        PR 1110/networking
     4        * libnetworking/machine/in_cksum.h: Replaced PPC and
     5        i386 assembly algorithms (must not assume carry bit is preserved
     6        across multiple asms). Added packet header as a 'm' input
     7        operand for all CPU variants. Added carry bit to clobber list.
     8
    192006-07-12      Till Straumann <strauman@slac.stanford.edu>
    210
  • cpukit/libnetworking/machine/in_cksum.h

    rb365d4d r47854a0d  
    5858in_cksum_hdr(const struct ip *ip)
    5959{
    60         register u_int sum = 0;
     60        register u_int sum = ((const uint32_t*)ip)[0];
     61        register u_int tmp;
     62
     63        __asm__ __volatile__(
     64                                "       addl %2, %0    \n"
     65                                "       adcl %3, %0    \n"
     66                                "       adcl %4, %0    \n"
     67                                "       adcl %5, %0    \n"
     68                                "       adcl $0, %0    \n"
     69                                "       movl %0, %1    \n"
     70                                "       roll $16, %0   \n"
     71                                "       addl %1, %0    \n"
     72                                :"+&r"(sum),"=&r"(tmp)
     73                                :"g"(((const uint32_t*)ip)[1]),
     74                                 "g"(((const uint32_t*)ip)[2]),
     75                                 "g"(((const uint32_t*)ip)[3]),
     76                                 "g"(((const uint32_t*)ip)[4]),
     77                                 "m"(*ip)
     78                                :"cc"
     79        );
    6180                   
    62 #define ADD(n)  \
    63     __asm__ volatile ("addl " #n "(%2), %0" : "=r" (sum) : "0" (sum), "r" (ip))
    64 #define ADDC(n) \
    65     __asm__ volatile ("adcl " #n "(%2), %0" : "=r" (sum) : "0" (sum), "r" (ip))
    66 #define MOP     \
    67     __asm__ volatile ("adcl         $0, %0" : "=r" (sum) : "0" (sum))
    68 
    69         ADD(0);
    70         ADDC(4);
    71         ADDC(8);
    72         ADDC(12);
    73         ADDC(16);
    74         MOP;
    75         sum = (sum & 0xffff) + (sum >> 16);
    76         if (sum > 0xffff)
    77                 sum -= 0xffff;
    78 
    79         return ~sum & 0xffff;
     81        return (~sum) >>16;
    8082}
    8183
     
    101103        register u_int tmp;
    102104                   
    103         __asm__("addl  %2@+,%0\n\t"
     105        __asm__ __volatile__("addl  %2@+,%0\n\t"
    104106                "movel %2@+,%1\n\t"
    105107                "addxl %1,%0\n\t"
     
    111113                "addxl %1,%0\n" :
    112114                "=d" (sum), "=d" (tmp), "=a" (ap) :
    113                 "0" (sum), "2" (ap));
     115                "0" (sum), "2" (ap), "m"(*ip));
    114116        sum = (sum & 0xffff) + (sum >> 16);
    115117        if (sum > 0xffff)
     
    127129in_cksum_hdr(const struct ip *ip)
    128130{
    129         register u_int sum = 0;
    130         register u_int tmp;
    131 
    132 #define ADD(n) \
    133          __asm__ volatile ("addc  %0,%0,%2" : "=r" (sum) : "0" (sum), "r" (n))
    134 #define ADDC(n) \
    135         __asm__ volatile ("adde  %0,%0,%2" : "=r" (sum) : "0" (sum), "r" (n))
    136 #define MOP     \
    137         __asm__ volatile ("addic %0,%0,0"  : "=r" (sum) : "0" (sum))
    138 
    139         tmp = *(((u_int *) ip));      ADD(tmp);
    140         tmp = *(((u_int *) ip) + 1);  ADDC(tmp);
    141         tmp = *(((u_int *) ip) + 2);  ADDC(tmp);
    142         tmp = *(((u_int *) ip) + 3);  ADDC(tmp);
    143         tmp = *(((u_int *) ip) + 4);  ADDC(tmp);
    144         tmp = 0;                      ADDC(tmp);
    145         sum = (sum & 0xffff) + (sum >> 16);
    146         if (sum > 0xffff)
    147                 sum -= 0xffff;
    148 
    149         return ~sum & 0xffff;
     131register u_int sum, tmp;
     132        __asm__ __volatile__(
     133                "       lwz   %0,  0(%2) \n"
     134                "       lwz   %1,  4(%2) \n"
     135                "       addc  %0, %0, %1 \n"    /* generate carry (XER[CA]) */
     136                "       lwz   %1,  8(%2) \n"
     137                "       adde  %0, %0, %1 \n"    /* add + generate           */
     138                "       lwz   %1, 12(%2) \n"
     139                "       adde  %0, %0, %1 \n"
     140                "       lwz   %1, 16(%2) \n"
     141                "       adde  %0, %0, %1 \n"
     142                "       addze %0, %0     \n"    /* mop up XER[CA]           */
     143                "       rotlwi %1, %0,16 \n"    /* word-swapped copy in %1  */
     144                "       add   %0, %0, %1 \n"    /* see comment below        */
     145                "       not   %0, %0     \n"
     146                "       srwi  %0, %0, 16 \n"
     147                :"=&r"(sum),"=&r"(tmp):"b"(ip), "m"(*ip):"xer"
     148        );
     149        /* Note: if 'add' generates a carry out of the lower 16 bits
     150         *       then this is automatically added to the upper 16 bits
     151         *       where the correct result is found. (Stolen from linux.)
     152         *        %0 : upper-word  lower-word
     153         *     +  %1 : lower-word  upper-word
     154         *     =       word-sum    word-sum
     155         *                     ^+inter-word-carry
     156         */
     157        return sum;
    150158}
    151159
     
    171179   register u_int tmp_o3;
    172180
    173    __asm__ volatile (" \
     181   __asm__ __volatile__ (" \
    174182     ld [%0], %1 ; \
    175183     ld [%0+4], %2 ; \
     
    190198     and %1, %3, %1 ; \
    191199    " : "=r" (ip), "=r" (sum), "=r" (tmp_o2), "=r" (tmp_o3)
    192       : "0" (ip), "1" (sum)
     200      : "0" (ip), "1" (sum), "m"(*ip)
    193201  );
    194202  return sum;
Note: See TracChangeset for help on using the changeset viewer.