/alps/ufodecode

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/ufodecode

« back to all changes in this revision

Viewing changes to src/libipe.c

  • Committer: Matthias Vogelgesang
  • Date: 2011-12-01 15:00:59 UTC
  • Revision ID: matthias.vogelgesang@kit.edu-20111201150059-w1ol4pl9xkaz5kht
Add: optional SSE intrinsics

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
#include "libipe.h"
7
7
#include "libipe-private.h"
8
8
#include "config.h"
 
9
#include <xmmintrin.h>
9
10
 
10
11
#define IPECAMERA_NUM_CHANNELS 16
11
12
#define IPECAMERA_PIXELS_PER_CHANNEL 128
84
85
    uint32_t data;
85
86
    const int bytes = 43;
86
87
 
 
88
#ifdef HAVE_SSE
 
89
    const uint32_t mask = 0x3FF;
 
90
    __m128i mmask = _mm_set_epi32(mask, mask, mask, mask);
 
91
    __m128i packed;
 
92
    __m128i tmp1, tmp2;
 
93
    uint32_t result[4] __attribute__ ((aligned (16))) = {0};
 
94
#endif
 
95
 
87
96
    do {
88
97
        info = raw[0];
89
98
        row = (info >> 4) & 0x7FF;
104
113
        /* "Correct" missing pixel */
105
114
        if ((row < 2) && (pixels == (IPECAMERA_PIXELS_PER_CHANNEL - 1))) {
106
115
            pixel_buffer[base] = 0;
107
 
            base++;
108
 
        } 
 
116
            /* base++; */
 
117
        }
109
118
#ifdef DEBUG
110
119
        else 
111
120
            CHECK_FLAG("number of pixels, %i is expected", pixels == IPECAMERA_PIXELS_PER_CHANNEL, pixels, IPECAMERA_PIXELS_PER_CHANNEL);
112
121
#endif
113
122
 
114
 
        for (int i = 1; i < bytes; i++) {
115
 
            data = raw[i];
116
 
 
 
123
#ifdef HAVE_SSE
 
124
        for (int i = 1 ; i < bytes-4; i += 4, base += 12) {
 
125
            packed = _mm_set_epi32(raw[i], raw[i+1], raw[i+2], raw[i+3]);
 
126
 
 
127
            tmp1 = _mm_srli_epi32(packed, 20);
 
128
            tmp2 = _mm_and_si128(tmp1, mmask);
 
129
            _mm_storeu_si128((__m128i*) result, tmp2);
 
130
            pixel_buffer[base] = result[0];
 
131
            pixel_buffer[base+3] = result[1];
 
132
            pixel_buffer[base+6] = result[2];
 
133
            pixel_buffer[base+9] = result[3];
 
134
 
 
135
            tmp1 = _mm_srli_epi32(packed, 10);
 
136
            tmp2 = _mm_and_si128(tmp1, mmask);
 
137
            _mm_storeu_si128((__m128i*) result, tmp2);
 
138
            pixel_buffer[base+1] = result[0];
 
139
            pixel_buffer[base+4] = result[1];
 
140
            pixel_buffer[base+7] = result[2];
 
141
            pixel_buffer[base+10] = result[3];
 
142
 
 
143
            tmp1 = _mm_and_si128(packed, mmask);
 
144
            _mm_storeu_si128((__m128i*) result, tmp1);
 
145
            pixel_buffer[base+2] = result[0];
 
146
            pixel_buffer[base+5] = result[1];
 
147
            pixel_buffer[base+8] = result[2];
 
148
            pixel_buffer[base+11] = result[3];
 
149
        }
 
150
        
 
151
        /* Compute last pixels the usual way */
 
152
        for (int i = bytes-4; i < bytes; i++) {
 
153
            data = raw[i];
 
154
            pixel_buffer[base++] = (data >> 20) & 0x3FF;
 
155
            pixel_buffer[base++] = (data >> 10) & 0x3FF;
 
156
            pixel_buffer[base++] = data & 0x3FF;
 
157
        }
 
158
#else
 
159
        for (int i = 1 ; i < bytes; i++) {
 
160
            data = raw[i];
117
161
#ifdef DEBUG
118
162
            header = (data >> 30) & 0x03;   
119
163
            CHECK_FLAG("raw data magick", header == 3, header);
124
168
            pixel_buffer[base++] = (data >> 10) & 0x3FF;
125
169
            pixel_buffer[base++] = data & 0x3FF;
126
170
        }
 
171
#endif
127
172
 
128
173
        data = raw[bytes];
129
 
 
130
174
#ifdef DEBUG
131
175
        header = (data >> 30) & 0x03;
132
176
        CHECK_FLAG("raw data magick", header == 3, header);