Skip to content

Commit

Permalink
Apply clang-format
Browse files Browse the repository at this point in the history
  • Loading branch information
homm committed Aug 11, 2024
1 parent f5f8091 commit 2481c67
Show file tree
Hide file tree
Showing 6 changed files with 614 additions and 387 deletions.
123 changes: 60 additions & 63 deletions src/libImaging/FilterSIMD_3x3f_4u8.c
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
void
ImagingFilter3x3f_4u8(Imaging imOut, Imaging im, const float* kernel,
float offset)
{
#define MM_KERNEL1x3_LOAD(row, x) \
ImagingFilter3x3f_4u8(Imaging imOut, Imaging im, const float *kernel, float offset) {
#define MM_KERNEL1x3_LOAD(row, x) \
pix0##row = _mm_cvtepi32_ps(mm_cvtepu8_epi32(&in1[x])); \
pix1##row = _mm_cvtepi32_ps(mm_cvtepu8_epi32(&in0[x])); \
pix2##row = _mm_cvtepi32_ps(mm_cvtepu8_epi32(&in_1[x]));

#define MM_KERNEL1x3_SUM(row, kindex) \
#define MM_KERNEL1x3_SUM(row, kindex) \
ss = _mm_add_ps(ss, _mm_mul_ps(pix0##row, _mm_set1_ps(kernel[0 + kindex]))); \
ss = _mm_add_ps(ss, _mm_mul_ps(pix1##row, _mm_set1_ps(kernel[3 + kindex]))); \
ss = _mm_add_ps(ss, _mm_mul_ps(pix2##row, _mm_set1_ps(kernel[6 + kindex])));
Expand All @@ -16,126 +14,125 @@ ImagingFilter3x3f_4u8(Imaging imOut, Imaging im, const float* kernel,

memcpy(imOut->image32[0], im->image32[0], im->linesize);

for (y = 1; y < im->ysize-1; y++) {
INT32* in_1 = im->image32[y-1];
INT32* in0 = im->image32[y];
INT32* in1 = im->image32[y+1];
INT32* out = imOut->image32[y];
for (y = 1; y < im->ysize - 1; y++) {
INT32 *in_1 = im->image32[y - 1];
INT32 *in0 = im->image32[y];
INT32 *in1 = im->image32[y + 1];
INT32 *out = imOut->image32[y];

#if defined(__AVX2__)

#define MM256_LOAD(row, x) \
#define MM256_LOAD(row, x) \
pix0##row = _mm256_cvtepi32_ps(mm256_cvtepu8_epi32(&in1[x])); \
pix1##row = _mm256_cvtepi32_ps(mm256_cvtepu8_epi32(&in0[x])); \
pix2##row = _mm256_cvtepi32_ps(mm256_cvtepu8_epi32(&in_1[x]));

#define MM256_SUM(pixrow, kernelrow) \
#define MM256_SUM(pixrow, kernelrow) \
ss = _mm256_add_ps(ss, _mm256_mul_ps(pix0##pixrow, kernel0##kernelrow)); \
ss = _mm256_add_ps(ss, _mm256_mul_ps(pix1##pixrow, kernel1##kernelrow)); \
ss = _mm256_add_ps(ss, _mm256_mul_ps(pix2##pixrow, kernel2##kernelrow));

#define MM256_PERMUTE(row, from0, from1, control) \
#define MM256_PERMUTE(row, from0, from1, control) \
pix0##row = _mm256_permute2f128_ps(pix0##from0, pix0##from1, control); \
pix1##row = _mm256_permute2f128_ps(pix1##from0, pix1##from1, control); \
pix2##row = _mm256_permute2f128_ps(pix2##from0, pix2##from1, control);

#define MM256_OUT(x) \
_mm_cvtps_epi32(_mm_add_ps( \
_mm256_extractf128_ps(ss, 0), \
_mm256_extractf128_ps(ss, 1) \
))

#define MM256_OUT(x) \
_mm_cvtps_epi32( \
_mm_add_ps(_mm256_extractf128_ps(ss, 0), _mm256_extractf128_ps(ss, 1)) \
)

__m256 kernel00 = _mm256_insertf128_ps(
_mm256_set1_ps(kernel[0+0]),
_mm_set1_ps(kernel[0+1]), 1);
__m256 kernel01 = _mm256_castps128_ps256(_mm_set1_ps(kernel[0+2]));
_mm256_set1_ps(kernel[0 + 0]), _mm_set1_ps(kernel[0 + 1]), 1
);
__m256 kernel01 = _mm256_castps128_ps256(_mm_set1_ps(kernel[0 + 2]));
__m256 kernel10 = _mm256_insertf128_ps(
_mm256_set1_ps(kernel[3+0]),
_mm_set1_ps(kernel[3+1]), 1);
__m256 kernel11 = _mm256_castps128_ps256(_mm_set1_ps(kernel[3+2]));
_mm256_set1_ps(kernel[3 + 0]), _mm_set1_ps(kernel[3 + 1]), 1
);
__m256 kernel11 = _mm256_castps128_ps256(_mm_set1_ps(kernel[3 + 2]));
__m256 kernel20 = _mm256_insertf128_ps(
_mm256_set1_ps(kernel[6+0]),
_mm_set1_ps(kernel[6+1]), 1);
__m256 kernel21 = _mm256_castps128_ps256(_mm_set1_ps(kernel[6+2]));
_mm256_set1_ps(kernel[6 + 0]), _mm_set1_ps(kernel[6 + 1]), 1
);
__m256 kernel21 = _mm256_castps128_ps256(_mm_set1_ps(kernel[6 + 2]));
__m256 pix00, pix10, pix20;
__m256 pix01, pix11, pix21;
__m256 pix02, pix12, pix22;

out[0] = in0[0];
x = 1;
MM256_LOAD(0, 0);
for (; x < im->xsize-1-7; x += 8) {
for (; x < im->xsize - 1 - 7; x += 8) {
__m256 ss;
__m128i ssi0, ssi1, ssi2, ssi3;

ss = _mm256_castps128_ps256(_mm_set1_ps(offset));
MM256_SUM(0, 0);
MM256_LOAD(1, x+1);
MM256_LOAD(1, x + 1);
MM256_SUM(1, 1);
ssi0 = MM256_OUT(x);

ss = _mm256_castps128_ps256(_mm_set1_ps(offset));
MM256_SUM(1, 0);
MM256_LOAD(2, x+3);
MM256_LOAD(2, x + 3);
MM256_SUM(2, 1);
ssi2 = MM256_OUT(x+2);
ssi2 = MM256_OUT(x + 2);

ss = _mm256_castps128_ps256(_mm_set1_ps(offset));
MM256_PERMUTE(0, 0, 1, 0x21);
MM256_SUM(0, 0);
MM256_PERMUTE(1, 1, 2, 0x21);
MM256_SUM(1, 1);
ssi1 = MM256_OUT(x+1);
ssi1 = MM256_OUT(x + 1);

ss = _mm256_castps128_ps256(_mm_set1_ps(offset));
MM256_SUM(1, 0);
MM256_PERMUTE(0, 2, 2, 0x21);
MM256_SUM(0, 1);
ssi3 = MM256_OUT(x+3);
ssi3 = MM256_OUT(x + 3);

ssi0 = _mm_packs_epi32(ssi0, ssi1);
ssi2 = _mm_packs_epi32(ssi2, ssi3);
ssi0 = _mm_packus_epi16(ssi0, ssi2);
_mm_storeu_si128((__m128i*) &out[x], ssi0);
_mm_storeu_si128((__m128i *)&out[x], ssi0);

ss = _mm256_castps128_ps256(_mm_set1_ps(offset));
MM256_SUM(2, 0);
MM256_LOAD(1, x+5);
MM256_LOAD(1, x + 5);
MM256_SUM(1, 1);
ssi0 = MM256_OUT(x+4);
ssi0 = MM256_OUT(x + 4);

ss = _mm256_castps128_ps256(_mm_set1_ps(offset));
MM256_SUM(1, 0);
MM256_LOAD(0, x+7);
MM256_LOAD(0, x + 7);
MM256_SUM(0, 1);
ssi2 = MM256_OUT(x+6);
ssi2 = MM256_OUT(x + 6);

ss = _mm256_castps128_ps256(_mm_set1_ps(offset));
MM256_PERMUTE(2, 2, 1, 0x21);
MM256_SUM(2, 0);
MM256_PERMUTE(1, 1, 0, 0x21);
MM256_SUM(1, 1);
ssi1 = MM256_OUT(x+5);
ssi1 = MM256_OUT(x + 5);

ss = _mm256_castps128_ps256(_mm_set1_ps(offset));
MM256_SUM(1, 0);
MM256_PERMUTE(2, 0, 0, 0x21);
MM256_SUM(2, 1);
ssi3 = MM256_OUT(x+7);
ssi3 = MM256_OUT(x + 7);

ssi0 = _mm_packs_epi32(ssi0, ssi1);
ssi2 = _mm_packs_epi32(ssi2, ssi3);
ssi0 = _mm_packus_epi16(ssi0, ssi2);
_mm_storeu_si128((__m128i*) &out[x+4], ssi0);
_mm_storeu_si128((__m128i *)&out[x + 4], ssi0);
}

for (; x < im->xsize-1-1; x += 2) {
for (; x < im->xsize - 1 - 1; x += 2) {
__m256 ss;
__m128i ssi0, ssi1;

ss = _mm256_castps128_ps256(_mm_set1_ps(offset));
MM256_SUM(0, 0);
MM256_LOAD(1, x+1);
MM256_LOAD(1, x + 1);
MM256_SUM(1, 1);
ssi0 = MM256_OUT(x);

Expand All @@ -144,23 +141,23 @@ ImagingFilter3x3f_4u8(Imaging imOut, Imaging im, const float* kernel,
MM256_SUM(0, 0);
MM256_PERMUTE(1, 0, 1, 0xf3);
MM256_SUM(1, 1);
ssi1 = MM256_OUT(x+1);
ssi1 = MM256_OUT(x + 1);

ssi0 = _mm_packs_epi32(ssi0, ssi1);
ssi0 = _mm_packus_epi16(ssi0, ssi0);
_mm_storel_epi64((__m128i*) &out[x], ssi0);
_mm_storel_epi64((__m128i *)&out[x], ssi0);

MM256_PERMUTE(0, 0, 1, 0x21);
}
for (; x < im->xsize-1; x++) {
for (; x < im->xsize - 1; x++) {
__m128 pix00, pix10, pix20;
__m128 ss = _mm_set1_ps(offset);
__m128i ssi0;
MM_KERNEL1x3_LOAD(0, x-1);
MM_KERNEL1x3_LOAD(0, x - 1);
MM_KERNEL1x3_SUM(0, 0);
MM_KERNEL1x3_LOAD(0, x+0);
MM_KERNEL1x3_LOAD(0, x + 0);
MM_KERNEL1x3_SUM(0, 1);
MM_KERNEL1x3_LOAD(0, x+1);
MM_KERNEL1x3_LOAD(0, x + 1);
MM_KERNEL1x3_SUM(0, 2);
ssi0 = _mm_cvtps_epi32(ss);
ssi0 = _mm_packs_epi32(ssi0, ssi0);
Expand All @@ -183,44 +180,44 @@ ImagingFilter3x3f_4u8(Imaging imOut, Imaging im, const float* kernel,

out[0] = in0[0];
x = 1;
for (; x < im->xsize-1-2; x += 3) {
for (; x < im->xsize - 1 - 2; x += 3) {
__m128 ss;
__m128i ssi0, ssi1, ssi2;

ss = _mm_set1_ps(offset);
MM_KERNEL1x3_SUM(0, 0);
MM_KERNEL1x3_SUM(1, 1);
MM_KERNEL1x3_LOAD(2, x+1);
MM_KERNEL1x3_LOAD(2, x + 1);
MM_KERNEL1x3_SUM(2, 2);
ssi0 = _mm_cvtps_epi32(ss);

ss = _mm_set1_ps(offset);
MM_KERNEL1x3_SUM(1, 0);
MM_KERNEL1x3_SUM(2, 1);
MM_KERNEL1x3_LOAD(0, x+2);
MM_KERNEL1x3_LOAD(0, x + 2);
MM_KERNEL1x3_SUM(0, 2);
ssi1 = _mm_cvtps_epi32(ss);

ss = _mm_set1_ps(offset);
MM_KERNEL1x3_SUM(2, 0);
MM_KERNEL1x3_SUM(0, 1);
MM_KERNEL1x3_LOAD(1, x+3);
MM_KERNEL1x3_LOAD(1, x + 3);
MM_KERNEL1x3_SUM(1, 2);
ssi2 = _mm_cvtps_epi32(ss);

ssi0 = _mm_packs_epi32(ssi0, ssi1);
ssi1 = _mm_packs_epi32(ssi2, ssi2);
ssi0 = _mm_packus_epi16(ssi0, ssi1);
_mm_storeu_si128((__m128i*) &out[x], ssi0);
_mm_storeu_si128((__m128i *)&out[x], ssi0);
}
for (; x < im->xsize-1; x++) {
for (; x < im->xsize - 1; x++) {
__m128 ss = _mm_set1_ps(offset);
__m128i ssi0;
MM_KERNEL1x3_LOAD(0, x-1);
MM_KERNEL1x3_LOAD(0, x - 1);
MM_KERNEL1x3_SUM(0, 0);
MM_KERNEL1x3_LOAD(0, x+0);
MM_KERNEL1x3_LOAD(0, x + 0);
MM_KERNEL1x3_SUM(0, 1);
MM_KERNEL1x3_LOAD(0, x+1);
MM_KERNEL1x3_LOAD(0, x + 1);
MM_KERNEL1x3_SUM(0, 2);
ssi0 = _mm_cvtps_epi32(ss);
ssi0 = _mm_packs_epi32(ssi0, ssi0);
Expand Down
Loading

0 comments on commit 2481c67

Please sign in to comment.