| 30 | } |
| 31 | |
| 32 | std::string FlipKernel::GetCVKernelBody(TContext* context) const { |
| 33 | auto kernel_sig = GetCVKernelSignature(context); |
| 34 | std::stringstream writer; |
| 35 | writer << R"( |
| 36 | #include <string.h> |
| 37 | #include "gi_int.h" |
| 38 | #include "tinycv_c.h" |
| 39 | #define rep(i, n) for (size_t i = 0; i < (n); ++i) |
| 40 | )"; |
| 41 | std::string body_temp = R"( |
| 42 | static void flip_horizontal_on_channel_c1(uint8_t* dst, const uint8_t* src, size_t W) { |
| 43 | size_t j = 0; |
| 44 | for (; j + 15 < W; j += 16) { |
| 45 | GI_UINT8_t src_vec = GiLoadUint8(src + j); |
| 46 | GI_UINT8_t dst_vec = GiReverseUint8(src_vec); |
| 47 | GiStoreUint8((dst + W - j - 16), dst_vec); |
| 48 | } |
| 49 | for (; j < W; ++j) { |
| 50 | *(dst + W - j - 1) = *(src + j); |
| 51 | } |
| 52 | } |
| 53 | static void flip_horizontal_on_channel_c3(uint8_t* dst, const uint8_t* src, size_t W) { |
| 54 | size_t j = 0; |
| 55 | for (; j + 15 < W; j += 16) { |
| 56 | GI_UINT8_t src_vec0, src_vec1, src_vec2; |
| 57 | src_vec0 = GiLoadUzip0V3Uint8(src + j * 3); |
| 58 | src_vec1 = GiLoadUzip1V3Uint8(src + j * 3); |
| 59 | src_vec2 = GiLoadUzip2V3Uint8(src + j * 3); |
| 60 | |
| 61 | GI_UINT8_t dst_vec0 = GiReverseUint8(src_vec0); |
| 62 | GI_UINT8_t dst_vec1 = GiReverseUint8(src_vec1); |
| 63 | GI_UINT8_t dst_vec2 = GiReverseUint8(src_vec2); |
| 64 | GiStoreZipUint8V3((dst + W * 3 - 3 * j - 48), dst_vec0, dst_vec1, dst_vec2); |
| 65 | |
| 66 | |
| 67 | } |
| 68 | for (; j < W; ++j) { |
| 69 | *(dst + W * 3 - j * 3 - 3) = *(src + j * 3); |
| 70 | *(dst + W * 3 - j * 3 - 2) = *(src + j * 3 + 1); |
| 71 | *(dst + W * 3 - j * 3 - 1) = *(src + j * 3 + 2); |
| 72 | |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | static void flip_horizontal_naive(uint8_t* dst, const uint8_t* src, size_t W, |
| 77 | size_t C) { |
| 78 | size_t sc = 0; |
| 79 | size_t dc = W * C; |
| 80 | for (; sc + 8 * C <= W * C; sc += 8 * C, dc -= 8 * C) { |
| 81 | rep(ic, C) dst[dc - 1 * C + ic] = src[sc + 0 * C + ic]; |
| 82 | rep(ic, C) dst[dc - 2 * C + ic] = src[sc + 1 * C + ic]; |
| 83 | rep(ic, C) dst[dc - 3 * C + ic] = src[sc + 2 * C + ic]; |
| 84 | rep(ic, C) dst[dc - 4 * C + ic] = src[sc + 3 * C + ic]; |
| 85 | rep(ic, C) dst[dc - 5 * C + ic] = src[sc + 4 * C + ic]; |
| 86 | rep(ic, C) dst[dc - 6 * C + ic] = src[sc + 5 * C + ic]; |
| 87 | rep(ic, C) dst[dc - 7 * C + ic] = src[sc + 6 * C + ic]; |
| 88 | rep(ic, C) dst[dc - 8 * C + ic] = src[sc + 7 * C + ic]; |
| 89 | } |
nothing calls this directly
no test coverage detected