Ignore:
Timestamp:
Jun 30, 2009, 1:23:31 AM (15 years ago)
Author:
mies
Message:

fixed bug in arm shift operations due to compiler optimizations (hopefully!)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • source/ariba/utility/serialization/DataUtilities.hpp

    r3690 r4622  
    7171#include <string>
    7272
     73template<typename X> finline
     74static X shr( const X& value, unsigned int bits ) {
     75        return (sizeof(X)*8 == bits) ? 0 : (value >> bits);
     76}
     77
     78template<typename X> finline
     79static X shl( const X& value, unsigned int bits ) {
     80        return (sizeof(X)*8 == bits) ? 0 : (value << bits);
     81}
     82
    7383/**
    7484 * TODO: Doc
     
    7787static X bitblk(size_t index, size_t length, bool value, if_uint(X)) {
    7888        if (index == 0 && length >= sizeof(X) * 8) return value ? ~0 : 0;
    79         X x = ((((X) 1) << length) - 1) << index;
     89        X x = shl(( shl( ((X) 1), length) - 1), index);
    8090        return value ? x : ~x;
    8191}
     
    107117        if (srcInvert) srcIdx = sizeof(X) * 8 - srcIdx - len;
    108118        if (dstInvert) dstIdx = sizeof(Y) * 8 - dstIdx - len;
    109         Y value = ((Y) (src >> srcIdx)) << dstIdx;
     119        Y value = ((Y)shr(src, srcIdx)) << dstIdx;
    110120        Y mask = bitblk<Y, 0> (dstIdx, len);
    111121        return (dst & mask) | (value & ~mask);
     
    136146        // check if first word only is affected
    137147        if ((dwp + len) <= w) {
    138                 X fw = (src[0] << swp) | (src[1] >> iswp);
     148                X fw = shl(src[0],swp) | shr(src[1],iswp);
    139149                *dst = bitcpy(fw, 0, *dst, dwp, len, true, true);
    140150                return;
     
    143153        // set first word
    144154        if (idwp != 0) {
    145                 X fw = (src[0] << swp) | (src[1] >> iswp);
    146                 *dst = (*dst & ~(((X) 1 << idwp) - 1)) | (fw >> dwp);
     155                X fw = shl(src[0],swp) | shr(src[1],iswp);
     156                *dst = (*dst & ~(((X) 1 << idwp) - 1)) | shr(fw,dwp);
    147157
    148158                // recalculate indexes & lengths
     
    169179                a = src[0], b = src[1];
    170180                while (len >= w) {
    171                         *dst = (a << swp) | (b >> iswp);
     181                        *dst = shl(a,swp) | shr(b,iswp);
    172182                        dst++;
    173183                        src++;
     
    179189
    180190        // set last word
    181         X lw = (a << swp) | (b >> iswp), lm = (((X) 1 << (w - len)) - 1);
     191        X lw = shl(a,swp) | shr(b,iswp), lm = (shl((X) 1,(w - len)) - 1);
    182192        *dst = (*dst & lm) | (lw & ~lm);
    183193}
     194
     195
    184196
    185197/**
     
    205217                src++;
    206218                while (len >= w) {
    207                         X x = (a << swp) | (b >> iswp);
     219                        X x = shl(a,swp) | shr(b,iswp);
    208220                        value <<= w;
    209221                        value |= x;
     
    216228                if ( len> 0 ) {
    217229                        value <<= len;
    218                         value |= (((a << swp) | (b >> iswp)) >> (w - len)) & ((1 << len)-1);
     230                        value |= ((shl(a,swp) | shr(b,iswp)) >> (w - len)) & (shl(1,len)-1);
    219231                }
    220232
     
    254266                size_t idwp = w - dwp;
    255267                src >>= srcIdx;
    256                 X mask1 = ~((1 << idwp) - 1);
    257                 dst[0] = (dst[0] & mask1) | ((src >> (len - idwp)) & ~mask1);
    258                 X mask2 = (1 << (w - len + idwp)) - 1;
    259                 dst[1] = (dst[1] & mask2) | ((src << (w - len + idwp)) & ~mask2);
     268                X mask1 = ~(shl(1,idwp) - 1);
     269                dst[0] = (dst[0] & mask1) | (shr(src,(len - idwp)) & ~mask1);
     270                X mask2 = shl(1,(w - len + idwp)) - 1;
     271                dst[1] = (dst[1] & mask2) | (shl(src, (w - len + idwp)) & ~mask2);
    260272        }
    261273}
     
    277289                // check inversion
    278290                if (srcInvert) srcIdx = sizeof(Y) * 8 - srcIdx - len;
    279                 src >>= srcIdx;
     291                src = shr(src, srcIdx);
    280292
    281293                const size_t dw = sizeof(X)*8;
    282294                while (len >= dw) {
    283                         X word = (X)(src >> (len-dw));
     295                        X word = (X)shr(src,(len-dw));
    284296                        bitcpy(word,0,dst,dstIdx,dw);
    285297                        dstIdx += dw;
Note: See TracChangeset for help on using the changeset viewer.