Skip to content

Commit 75259b8

Browse files
committed
I should have committed these incomplete files.
1 parent 9834f17 commit 75259b8

File tree

2 files changed

+166
-40
lines changed

2 files changed

+166
-40
lines changed

src/core/transform/ojph_colour.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,10 @@ namespace ojph {
163163
#ifndef OJPH_DISABLE_AVX2
164164
if (get_cpu_ext_level() >= X86_CPU_EXT_LEVEL_AVX2)
165165
{
166-
// cnvrt_si32_to_si32_shftd = avx2_cnvrt_si32_to_si32_shftd;
167-
// cnvrt_si32_to_si32_nlt_type3 = avx2_cnvrt_si32_to_si32_nlt_type3;
166+
//rev_convert = avx2_rev_convert;
167+
//rev_convert_nlt_type3 = avx2_rev_convert_nlt_type3;
168168
// rct_forward = avx2_rct_forward;
169-
// rct_backward = avx2_rct_backward;
169+
rct_backward = avx2_rct_backward;
170170
}
171171
#endif // !OJPH_DISABLE_AVX2
172172

src/core/transform/ojph_colour_avx2.cpp

Lines changed: 163 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,33 @@
3535
// Date: 11 October 2019
3636
//***************************************************************************/
3737

38+
#include <climits>
3839
#include <cmath>
3940

4041
#include "ojph_defs.h"
4142
#include "ojph_arch.h"
43+
#include "ojph_mem.h"
4244
#include "ojph_colour.h"
4345

4446
#include <immintrin.h>
4547

4648
namespace ojph {
4749
namespace local {
4850

51+
/////////////////////////////////////////////////////////////////////////
52+
// https://github.com/seung-lab/dijkstra3d/blob/master/libdivide.h
53+
static inline
54+
__m256i avx2_mm256_srai_epi64(__m256i a, int amt, __m256i m)
55+
{
56+
// note than m must be obtained using
57+
// __m256i m = _mm256_set1_epi64x(1ULL << (63 - amt));
58+
__m256i x = _mm256_srli_epi64(a, amt);
59+
x = _mm256_xor_si256(x, m);
60+
__m256i result = _mm256_sub_epi64(x, m);
61+
return result;
62+
}
63+
64+
4965
//////////////////////////////////////////////////////////////////////////
5066
void avx2_cnvrt_si32_to_si32_shftd(const si32 *sp, si32 *dp, int shift,
5167
ui32 width)
@@ -80,50 +96,160 @@ namespace ojph {
8096
}
8197
}
8298

99+
//
100+
// _mm256_cvtepi32_epi64
101+
//
102+
103+
// //////////////////////////////////////////////////////////////////////////
104+
// void avx2_rct_forward(const si32 *r, const si32 *g, const si32 *b,
105+
// si32 *y, si32 *cb, si32 *cr, ui32 repeat)
106+
// {
107+
// for (int i = (repeat + 7) >> 3; i > 0; --i)
108+
// {
109+
// __m256i mr = _mm256_load_si256((__m256i*)r);
110+
// __m256i mg = _mm256_load_si256((__m256i*)g);
111+
// __m256i mb = _mm256_load_si256((__m256i*)b);
112+
// __m256i t = _mm256_add_epi32(mr, mb);
113+
// t = _mm256_add_epi32(t, _mm256_slli_epi32(mg, 1));
114+
// _mm256_store_si256((__m256i*)y, _mm256_srai_epi32(t, 2));
115+
// t = _mm256_sub_epi32(mb, mg);
116+
// _mm256_store_si256((__m256i*)cb, t);
117+
// t = _mm256_sub_epi32(mr, mg);
118+
// _mm256_store_si256((__m256i*)cr, t);
119+
120+
// r += 8; g += 8; b += 8;
121+
// y += 8; cb += 8; cr += 8;
122+
// }
123+
// }
124+
83125
//////////////////////////////////////////////////////////////////////////
84-
void avx2_rct_forward(const si32 *r, const si32 *g, const si32 *b,
85-
si32 *y, si32 *cb, si32 *cr, ui32 repeat)
126+
void avx2_rct_backward(const line_buf *y,
127+
const line_buf *cb,
128+
const line_buf *cr,
129+
line_buf *r, line_buf *g, line_buf *b,
130+
ui32 repeat)
86131
{
87-
for (int i = (repeat + 7) >> 3; i > 0; --i)
132+
assert((y->flags & line_buf::LFT_REVERSIBLE) &&
133+
(cb->flags & line_buf::LFT_REVERSIBLE) &&
134+
(cr->flags & line_buf::LFT_REVERSIBLE) &&
135+
(r->flags & line_buf::LFT_REVERSIBLE) &&
136+
(g->flags & line_buf::LFT_REVERSIBLE) &&
137+
(b->flags & line_buf::LFT_REVERSIBLE));
138+
139+
if (y->flags & line_buf::LFT_32BIT)
88140
{
89-
__m256i mr = _mm256_load_si256((__m256i*)r);
90-
__m256i mg = _mm256_load_si256((__m256i*)g);
91-
__m256i mb = _mm256_load_si256((__m256i*)b);
92-
__m256i t = _mm256_add_epi32(mr, mb);
93-
t = _mm256_add_epi32(t, _mm256_slli_epi32(mg, 1));
94-
_mm256_store_si256((__m256i*)y, _mm256_srai_epi32(t, 2));
95-
t = _mm256_sub_epi32(mb, mg);
96-
_mm256_store_si256((__m256i*)cb, t);
97-
t = _mm256_sub_epi32(mr, mg);
98-
_mm256_store_si256((__m256i*)cr, t);
99-
100-
r += 8; g += 8; b += 8;
101-
y += 8; cb += 8; cr += 8;
102-
}
103-
}
141+
assert((y->flags & line_buf::LFT_32BIT) &&
142+
(cb->flags & line_buf::LFT_32BIT) &&
143+
(cr->flags & line_buf::LFT_32BIT) &&
144+
(r->flags & line_buf::LFT_32BIT) &&
145+
(g->flags & line_buf::LFT_32BIT) &&
146+
(b->flags & line_buf::LFT_32BIT));
147+
const si32 *yp = y->i32, *cbp = cb->i32, *crp = cr->i32;
148+
si32 *rp = r->i32, *gp = g->i32, *bp = b->i32;
149+
for (int i = (repeat + 7) >> 3; i > 0; --i)
150+
{
151+
__m256i my = _mm256_load_si256((__m256i*)yp);
152+
__m256i mcb = _mm256_load_si256((__m256i*)cbp);
153+
__m256i mcr = _mm256_load_si256((__m256i*)crp);
104154

105-
//////////////////////////////////////////////////////////////////////////
106-
void avx2_rct_backward(const si32 *y, const si32 *cb, const si32 *cr,
107-
si32 *r, si32 *g, si32 *b, ui32 repeat)
108-
{
109-
for (int i = (repeat + 7) >> 3; i > 0; --i)
155+
__m256i t = _mm256_add_epi32(mcb, mcr);
156+
t = _mm256_sub_epi32(my, _mm256_srai_epi32(t, 2));
157+
_mm256_store_si256((__m256i*)gp, t);
158+
__m256i u = _mm256_add_epi32(mcb, t);
159+
_mm256_store_si256((__m256i*)bp, u);
160+
u = _mm256_add_epi32(mcr, t);
161+
_mm256_store_si256((__m256i*)rp, u);
162+
163+
yp += 8; cbp += 8; crp += 8;
164+
rp += 8; gp += 8; bp += 8;
165+
}
166+
}
167+
else
110168
{
111-
__m256i my = _mm256_load_si256((__m256i*)y);
112-
__m256i mcb = _mm256_load_si256((__m256i*)cb);
113-
__m256i mcr = _mm256_load_si256((__m256i*)cr);
114-
115-
__m256i t = _mm256_add_epi32(mcb, mcr);
116-
t = _mm256_sub_epi32(my, _mm256_srai_epi32(t, 2));
117-
_mm256_store_si256((__m256i*)g, t);
118-
__m256i u = _mm256_add_epi32(mcb, t);
119-
_mm256_store_si256((__m256i*)b, u);
120-
u = _mm256_add_epi32(mcr, t);
121-
_mm256_store_si256((__m256i*)r, u);
122-
123-
y += 8; cb += 8; cr += 8;
124-
r += 8; g += 8; b += 8;
169+
assert((y->flags & line_buf::LFT_64BIT) &&
170+
(cb->flags & line_buf::LFT_64BIT) &&
171+
(cr->flags & line_buf::LFT_64BIT) &&
172+
(r->flags & line_buf::LFT_32BIT) &&
173+
(g->flags & line_buf::LFT_32BIT) &&
174+
(b->flags & line_buf::LFT_32BIT));
175+
__m256i v2 = _mm256_set1_epi64x(1ULL << (63 - 2));
176+
__m256i low_bits = _mm256_set_epi64x(0, (si64)ULLONG_MAX, 0, (si64)ULLONG_MAX);
177+
const si64 *yp = y->i64, *cbp = cb->i64, *crp = cr->i64;
178+
si32 *rp = r->i32, *gp = g->i32, *bp = b->i32;
179+
for (int i = (repeat + 7) >> 3; i > 0; --i)
180+
{
181+
__m256i my, mcb, mcr, tr, tg, tb;
182+
my = _mm256_load_si256((__m256i*)yp);
183+
mcb = _mm256_load_si256((__m256i*)cbp);
184+
mcr = _mm256_load_si256((__m256i*)crp);
185+
186+
tg = _mm256_add_epi64(mcb, mcr);
187+
tg = _mm256_sub_epi64(my, avx2_mm256_srai_epi64(tg, 2, v2));
188+
tb = _mm256_add_epi64(mcb, tg);
189+
tr = _mm256_add_epi64(mcr, tg);
190+
191+
__m256i mr, mg, mb;
192+
mr = _mm256_shuffle_epi32(tr, _MM_SHUFFLE(0, 0, 2, 0));
193+
mr = _mm256_and_si256(low_bits, mr);
194+
mg = _mm256_shuffle_epi32(tg, _MM_SHUFFLE(0, 0, 2, 0));
195+
mg = _mm256_and_si256(low_bits, mg);
196+
mb = _mm256_shuffle_epi32(tb, _MM_SHUFFLE(0, 0, 2, 0));
197+
mb = _mm256_and_si256(low_bits, mb);
198+
199+
yp += 4; cbp += 4; crp += 4;
200+
201+
my = _mm256_load_si256((__m256i*)yp);
202+
mcb = _mm256_load_si256((__m256i*)cbp);
203+
mcr = _mm256_load_si256((__m256i*)crp);
204+
205+
tg = _mm256_add_epi64(mcb, mcr);
206+
tg = _mm256_sub_epi64(my, avx2_mm256_srai_epi64(tg, 2, v2));
207+
tb = _mm256_add_epi64(mcb, tg);
208+
tr = _mm256_add_epi64(mcr, tg);
209+
210+
tr = _mm256_shuffle_epi32(tr, _MM_SHUFFLE(2, 0, 0, 0));
211+
tr = _mm256_andnot_si256(low_bits, tr);
212+
mr = _mm256_or_si256(mr, tr);
213+
tg = _mm256_shuffle_epi32(tg, _MM_SHUFFLE(2, 0, 0, 0));
214+
tg = _mm256_andnot_si256(low_bits, tg);
215+
mg = _mm256_or_si256(mg, tg);
216+
tb = _mm256_shuffle_epi32(tb, _MM_SHUFFLE(2, 0, 0, 0));
217+
tb = _mm256_andnot_si256(low_bits, tb);
218+
mb = _mm256_or_si256(mb, tb);
219+
220+
_mm256_store_si256((__m256i*)rp, mr);
221+
_mm256_store_si256((__m256i*)gp, mg);
222+
_mm256_store_si256((__m256i*)bp, mb);
223+
224+
yp += 4; cbp += 4; crp += 4;
225+
rp += 8; gp += 8; bp += 8;
226+
}
125227
}
126228
}
127229

230+
231+
// //////////////////////////////////////////////////////////////////////////
232+
// void avx2_rct_backward(const si32 *y, const si32 *cb, const si32 *cr,
233+
// si32 *r, si32 *g, si32 *b, ui32 repeat)
234+
// {
235+
// for (int i = (repeat + 7) >> 3; i > 0; --i)
236+
// {
237+
// __m256i my = _mm256_load_si256((__m256i*)y);
238+
// __m256i mcb = _mm256_load_si256((__m256i*)cb);
239+
// __m256i mcr = _mm256_load_si256((__m256i*)cr);
240+
241+
// __m256i t = _mm256_add_epi32(mcb, mcr);
242+
// t = _mm256_sub_epi32(my, _mm256_srai_epi32(t, 2));
243+
// _mm256_store_si256((__m256i*)g, t);
244+
// __m256i u = _mm256_add_epi32(mcb, t);
245+
// _mm256_store_si256((__m256i*)b, u);
246+
// u = _mm256_add_epi32(mcr, t);
247+
// _mm256_store_si256((__m256i*)r, u);
248+
249+
// y += 8; cb += 8; cr += 8;
250+
// r += 8; g += 8; b += 8;
251+
// }
252+
// }
253+
128254
}
129255
}

0 commit comments

Comments
 (0)